optim, try different dispatch strategies, add reset handler

This commit is contained in:
2026-05-07 14:13:55 +03:00
parent 5cd472c173
commit 1b3f49fc3b
11 changed files with 1438 additions and 12 deletions

View File

@@ -105,6 +105,376 @@ uint8_t _wdr (prog_counter_t* pcounter, device_mem_t* devMem);
uint8_t _xch (prog_counter_t* pcounter, device_mem_t* devMem);
static inline uint8_t _dispatchInstruction(const opcode_t op, prog_counter_t* programCounter, device_mem_t* devMem)
{
if((op) == 0b0000000000000000) {return _nop(programCounter, devMem);}
if((op) == 0b1001010000001001) {return _ijmp(programCounter, devMem);}
if((op) == 0b1001010000011001) {return _eijmp(programCounter, devMem);}
if((op) == 0b1001010100001000) {return _ret(programCounter, devMem);}
if((op) == 0b1001010100001001) {return _icall(programCounter, devMem);}
if((op) == 0b1001010100011000) {return _reti(programCounter, devMem);}
if((op) == 0b1001010100011001) {return _eicall(programCounter, devMem);}
if((op) == 0b1001010110001000) {return _sleep(programCounter, devMem);}
if((op) == 0b1001010110011000) {return _break(programCounter, devMem);}
if((op) == 0b1001010110101000) {return _wdr(programCounter, devMem);}
if((op) == 0b1001010111001000) {return _lpm1(programCounter, devMem);}
if((op) == 0b1001010111011000) {return _elpm1(programCounter, devMem);}
if((op) == 0b1001010111101000) {return _spm(programCounter, devMem);}
if((op & (~0b0000000001110000)) == 0b1001010000001000) {return _bset(programCounter, devMem);}
if((op & (~0b0000000001110000)) == 0b1001010010001000) {return _bclr(programCounter, devMem);}
if((op & (~0b0000000001110111)) == 0b0000001100000000) {return _mulsu(programCounter, devMem);}
if((op & (~0b0000000001110111)) == 0b0000001100001000) {return _fmul(programCounter, devMem);}
if((op & (~0b0000000001110111)) == 0b0000001110000000) {return _fmuls(programCounter, devMem);}
if((op & (~0b0000000001110111)) == 0b0000001110001000) {return _fmulsu(programCounter, devMem);}
switch (op & (~0b0000000011111111))
{
case 0b0000000100000000:
{
return _movw(programCounter, devMem);
}
case 0b0000001000000000:
{
return _muls(programCounter, devMem);
}
case 0b1001011000000000:
{
return _adiw(programCounter, devMem);
}
case 0b1001011100000000:
{
return _sbiw(programCounter, devMem);
}
case 0b1001100000000000:
{
return _cbi(programCounter, devMem);
}
case 0b1001100100000000:
{
return _sbic(programCounter, devMem);
}
case 0b1001101000000000:
{
return _sbi(programCounter, devMem);
}
case 0b1001101100000000:
{
return _sbis(programCounter, devMem);
}
}
// if((op & (~0b0000000011111111)) == 0b0000000100000000) {return _movw(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b0000001000000000) {return _muls(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b1001011000000000) {return _adiw(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b1001011100000000) {return _sbiw(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b1001100000000000) {return _cbi(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b1001100100000000) {return _sbic(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b1001101000000000) {return _sbi(programCounter, devMem);}
// if((op & (~0b0000000011111111)) == 0b1001101100000000) {return _sbis(programCounter, devMem);}
switch (op & (~0b0000000111110000))
{
case 0b1001000000000000:
{
return _lds(programCounter, devMem);
}
case 0b1001000000000001:
{
return _ld_ldd_12(programCounter, devMem);
}
case 0b1001000000000010:
{
return _ld_ldd_13(programCounter, devMem);
}
case 0b1001000000000100:
{
return _lpm2(programCounter, devMem);
}
case 0b1001000000000101:
{
return _lpm3(programCounter, devMem);
}
case 0b1001000000000110:
{
return _elpm2(programCounter, devMem);
}
case 0b1001000000000111:
{
return _elpm3(programCounter, devMem);
}
case 0b1001000000001001:
{
return _ld_ldd2(programCounter, devMem);
}
case 0b1001000000001010:
{
return _ld_ldd3(programCounter, devMem);
}
case 0b1001000000001100:
{
return _ld1(programCounter, devMem);
}
case 0b1001000000001101:
{
return _ld2(programCounter, devMem);
}
case 0b1001000000001110:
{
return _ld3(programCounter, devMem);
}
case 0b1001000000001111:
{
return _pop(programCounter, devMem);
}
case 0b1001001000000000:
{
return _sts(programCounter, devMem);
}
case 0b1001001000000001:
{
return _st_std_12(programCounter, devMem);
}
case 0b1001001000000010:
{
return _st_std_13(programCounter, devMem);
}
case 0b1001001000001001:
{
return _st_std2(programCounter, devMem);
}
case 0b1001001000001010:
{
return _st_std3(programCounter, devMem);
}
case 0b1001001000001100:
{
return _st1(programCounter, devMem);
}
case 0b1001001000001101:
{
return _st2(programCounter, devMem);
}
case 0b1001001000001110:
{
return _st3(programCounter, devMem);
}
case 0b1001001000001111:
{
return _push(programCounter, devMem);
}
case 0b1001010000000000:
{
return _com(programCounter, devMem);
}
case 0b1001010000000001:
{
return _neg(programCounter, devMem);
}
case 0b1001010000000010:
{
return _swap(programCounter, devMem);
}
case 0b1001010000000011:
{
return _inc(programCounter, devMem);
}
case 0b1001010000000101:
{
return _asr(programCounter, devMem);
}
case 0b1001010000000110:
{
return _lsr(programCounter, devMem);
}
case 0b1001010000000111:
{
return _ror(programCounter, devMem);
}
case 0b1001010000001010:
{
return _dec(programCounter, devMem);
}
}
// if((op & (~0b0000000111110000)) == 0b1001000000000000) {return _lds(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000000001) {return _ld_ldd_12(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000000010) {return _ld_ldd_13(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000000100) {return _lpm2(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000000101) {return _lpm3(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000000110) {return _elpm2(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000000111) {return _elpm3(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000001001) {return _ld_ldd2(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000001010) {return _ld_ldd3(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000001100) {return _ld1(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000001101) {return _ld2(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000001110) {return _ld3(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001000000001111) {return _pop(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000000000) {return _sts(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000000001) {return _st_std_12(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000000010) {return _st_std_13(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000001001) {return _st_std2(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000001010) {return _st_std3(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000001100) {return _st1(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000001101) {return _st2(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000001110) {return _st3(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001001000001111) {return _push(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000000) {return _com(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000001) {return _neg(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000010) {return _swap(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000011) {return _inc(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000101) {return _asr(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000110) {return _lsr(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000000111) {return _ror(programCounter, devMem);}
// if((op & (~0b0000000111110000)) == 0b1001010000001010) {return _dec(programCounter, devMem);}
if((op & (~0b0000000111110001)) == 0b1001010000001100) {return _jmp(programCounter, devMem);}
if((op & (~0b0000000111110001)) == 0b1001010000001110) {return _call(programCounter, devMem);}
if((op & (~0b0000000111110111)) == 0b1111100000000000) {return _bld(programCounter, devMem);}
if((op & (~0b0000000111110111)) == 0b1111101000000000) {return _bst(programCounter, devMem);}
if((op & (~0b0000000111110111)) == 0b1111110000000000) {return _sbrc(programCounter, devMem);}
if((op & (~0b0000000111110111)) == 0b1111111000000000) {return _sbrs(programCounter, devMem);}
switch (op & (~0b0000001111111111))
{
case 0b0000010000000000:
{
return _cpc(programCounter, devMem);
}
case 0b0000100000000000:
{
return _sbc(programCounter, devMem);
}
case 0b0000110000000000:
{
return _add(programCounter, devMem);
}
case 0b0001000000000000:
{
return _cpse(programCounter, devMem);
}
case 0b0001010000000000:
{
return _cp(programCounter, devMem);
}
case 0b0001100000000000:
{
return _sub(programCounter, devMem);
}
case 0b0001110000000000:
{
return _adc(programCounter, devMem);
}
case 0b0010000000000000:
{
return _and(programCounter, devMem);
}
case 0b0010010000000000:
{
return _eor(programCounter, devMem);
}
case 0b0010100000000000:
{
return _or(programCounter, devMem);
}
case 0b0010110000000000:
{
return _mov(programCounter, devMem);
}
case 0b1001110000000000:
{
return _mul(programCounter, devMem);
}
case 0b1111000000000000:
{
return _brbs(programCounter, devMem);
}
case 0b1111010000000000:
{
return _brbc(programCounter, devMem);
}
}
// if((op & (~0b0000001111111111)) == 0b0000010000000000) {return _cpc(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0000100000000000) {return _sbc(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0000110000000000) {return _add(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0001000000000000) {return _cpse(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0001010000000000) {return _cp(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0001100000000000) {return _sub(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0001110000000000) {return _adc(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0010000000000000) {return _and(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0010010000000000) {return _eor(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0010100000000000) {return _or(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b0010110000000000) {return _mov(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b1001110000000000) {return _mul(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b1111000000000000) {return _brbs(programCounter, devMem);}
// if((op & (~0b0000001111111111)) == 0b1111010000000000) {return _brbc(programCounter, devMem);}
if((op & (~0b0000011111111111)) == 0b1011000000000000) {return _in(programCounter, devMem);}
if((op & (~0b0000011111111111)) == 0b1011100000000000) {return _out(programCounter, devMem);}
switch (op & (~0b0000111111111111))
{
case 0b0011000000000000:
{
return _cpi(programCounter, devMem);
}
case 0b0100000000000000:
{
return _sbci(programCounter, devMem);
}
case 0b0101000000000000:
{
return _subi(programCounter, devMem);
}
case 0b0110000000000000:
{
return _sbr(programCounter, devMem);
}
case 0b0111000000000000:
{
return _andi(programCounter, devMem);
}
case 0b1100000000000000:
{
return _rjmp(programCounter, devMem);
}
case 0b1101000000000000:
{
return _rcall(programCounter, devMem);
}
case 0b1110000000000000:
{
return _ldi(programCounter, devMem);
}
}
// if((op & (~0b0000111111111111)) == 0b0011000000000000) {return _cpi(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b0100000000000000) {return _sbci(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b0101000000000000) {return _subi(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b0110000000000000) {return _sbr(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b0111000000000000) {return _andi(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b1100000000000000) {return _rjmp(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b1101000000000000) {return _rcall(programCounter, devMem);}
// if((op & (~0b0000111111111111)) == 0b1110000000000000) {return _ldi(programCounter, devMem);}
switch (op & (~0b0010110111110111))
{
case 0b1000000000000000:
{
return _ld_ldd_14(programCounter, devMem);
}
case 0b1000000000001000:
{
return _ld_ldd4(programCounter, devMem);
}
case 0b1000001000000000:
{
return _st_std_14(programCounter, devMem);
}
case 0b1000001000001000:
{
return _st_std4(programCounter, devMem);
}
}
// if((op & (~0b0010110111110111)) == 0b1000000000000000) {return _ld_ldd_14(programCounter, devMem);}
// if((op & (~0b0010110111110111)) == 0b1000000000001000) {return _ld_ldd4(programCounter, devMem);}
// if((op & (~0b0010110111110111)) == 0b1000001000000000) {return _st_std_14(programCounter, devMem);}
// if((op & (~0b0010110111110111)) == 0b1000001000001000) {return _st_std4(programCounter, devMem);}
return 0;
}
#define HANDLER_REGISTERS {\
{&_adc, 0b0001110000000000, 0b0000001111111111, 2}, \
{&_add, 0b0000110000000000, 0b0000001111111111, 2}, \