JieLi’s own custom architecture that is heavily based off the Analog Devices’ Blackfin core.
There are 16 general purpose registers (GPRs), r0
through r15
.
The r15
register is reserved as a stack pointer, thus it’s called as sp
instead.
Number | Name | Description |
---|---|---|
sfr0 | reti | Interrupt return address |
sfr1 | rete | Exception (or Emulation?) return address |
sfr2 | ||
sfr3 | ||
sfr4 | maccl | Multiply accumulator (low) |
sfr5 | macch | Multiply accumulator (high) |
sfr6 | rets | Subroutine return address |
sfr7 | psr | Processor status register |
sfr8 | ||
sfr9 | ||
sfr10 | ie1 | Interrupt enable 1 |
sfr11 | ssp | Supervisor mode stack pointer |
sfr12 | ie0 | Interrupt enable 0 |
sfr13 | icfg | Interrupt config |
sfr14 | pc | Program counter |
sfr15 | usp | User mode stack pointer |
The instructions are composed of the 16-bit instruction words (the “iwords”), each being little-endian.
Longer instructions are encoded by placing more iwords after each other, so to encode a 32-bit instruction two iwords are used, where the first one encodes high-most bits and the second one the lower-most bits.
The listing below lists the bits MSB-first, and the first iword being the leftmost bits.
0000000000000000 nop
0000000000000010 bkpt
0000000000000011 hbkpt
0000000000000100 macc = 0 clrmacc
0000000000001000 csync
0000000000001001 ssync
0000000000001010 illeg
0000000000001100 lockset
0000000000001110 lockclr
0000000000010000 idle
0000000000100000 rts
0000000000110000 rti
0000000000111000 rte
0000000001000000 cli
000000000101Xxxx cli r`Xxxx`
0000000001100000 sti
000000000111Xxxx sti r`Xxxx`
0000000010Xxxxxx swi `Xxxxxx`
0000000011Xxxxxx excpt `Xxxxxx`
000000010ABbbXxx rep `Bbb`<+1>, r`AXxx` { <`Bbb`+1> }
000000011A000Xxx flush [r`AXxx`]
000000011A001Xxx flushinv [r`AXxx`]
000000011A010Xxx iflush [r`AXxx`]
000000011A011Xxx pfetch [r`AXxx`]
000000011A100Xxx goto r`AXxx`
000000011A101Xxx call r`AXxx`
000000011A110Xxx tbb [r`AXxx`]
000000011A111Xxx tbh [r`AXxx`]
00000010AaaBbbbb rep `Aaa`<+1>, `Bbbbb`
000000110000AaBb ifs (nzcv == 0) { <`Aa`+1> } else { <`Bb`> } ifeq `Aa`<+1>, `Bb`
000000110001AaBb ifs (nzcv != 0) { <`Aa`+1> } else { <`Bb`> } ifne `Aa`<+1>, `Bb`
000000110010AaBb if (nzcv >= 0) { <`Aa`+1> } else { <`Bb`> } ifcs `Aa`<+1>, `Bb`
000000110011AaBb if (nzcv < 0) { <`Aa`+1> } else { <`Bb`> } ifcc `Aa`<+1>, `Bb`
000000110100AaBb ifs (nzcv ?? 0) { <`Aa`+1> } else { <`Bb`> } ifmi `Aa`<+1>, `Bb`
000000110101AaBb ifs (nzcv ?? 0) { <`Aa`+1> } else { <`Bb`> } ifpl `Aa`<+1>, `Bb`
000000110110AaBb ifs (nzcv ?? 0) { <`Aa`+1> } else { <`Bb`> } ifvs `Aa`<+1>, `Bb`
000000110111AaBb ifs (nzcv ?? 0) { <`Aa`+1> } else { <`Bb`> } ifvc `Aa`<+1>, `Bb`
000000111000AaBb if (nzcv > 0) { <`Aa`+1> } else { <`Bb`> } ifhi `Aa`<+1>, `Bb`
000000111001AaBb if (nzcv <= 0) { <`Aa`+1> } else { <`Bb`> } ifls `Aa`<+1>, `Bb`
000000111010AaBb ifs (nzcv >= 0) { <`Aa`+1> } else { <`Bb`> } ifge `Aa`<+1>, `Bb`
000000111011AaBb ifs (nzcv < 0) { <`Aa`+1> } else { <`Bb`> } iflt `Aa`<+1>, `Bb`
000000111100AaBb ifs (nzcv > 0) { <`Aa`+1> } else { <`Bb`> } ifgt `Aa`<+1>, `Bb`
000000111101AaBb ifs (nzcv <= 0) { <`Aa`+1> } else { <`Bb`> } ifle `Aa`<+1>, `Bb`
000000111110AaBb ifs (nzcv ?? 0) { <`Aa`+1> } else { <`Bb`> } if `Aa`<+1>, `Bb`
00000100Aaaaaaaa call s`Aaaaaaaa0`
000001010000Xxxx macc /= r`Xxxx`
000001011000Xxxx macc /= r`Xxxx` (s)
0000011000YyyXxx r`Xxx` *= r`Yyy`
0000011001YyyXxx macc = r`Yyy` * r`Xxx`
0000011011YyyXxx macc = r`Yyy` * r`Xxx` (s)
0000011100YyyXxx macc += r`Yyy` * r`Xxx`
0000011101YyyXxx macc -= r`Yyy` * r`Xxx`
0000011110YyyXxx macc += r`Yyy` * r`Xxx` (s)
0000011111YyyXxx macc -= r`Yyy` * r`Xxx` (s)
00001Aaaaaaaaaaa goto s`Aaaaaaaaaaa0`
00010000Aaaaaaaa ifs (nzcv == 0) goto s`Aaaaaaaa0` jeq s`Aaaaaaaa0`
00010001Aaaaaaaa ifs (nzcv != 0) goto s`Aaaaaaaa0` jne s`Aaaaaaaa0`
00010010Aaaaaaaa if (nzcv >= 0) goto s`Aaaaaaaa0` jcs s`Aaaaaaaa0`
00010011Aaaaaaaa if (nzcv < 0) goto s`Aaaaaaaa0` jcc s`Aaaaaaaa0`
00010100Aaaaaaaa ifs (nzcv ?? 0) goto s`Aaaaaaaa0` jmi s`Aaaaaaaa0`
00010101Aaaaaaaa ifs (nzcv ?? 0) goto s`Aaaaaaaa0` jpl s`Aaaaaaaa0`
00010110Aaaaaaaa ifs (nzcv ?? 0) goto s`Aaaaaaaa0` jvs s`Aaaaaaaa0`
00010111Aaaaaaaa ifs (nzcv ?? 0) goto s`Aaaaaaaa0` jvc s`Aaaaaaaa0`
00011000Aaaaaaaa if (nzcv > 0) goto s`Aaaaaaaa0` jhi s`Aaaaaaaa0`
00011001Aaaaaaaa if (nzcv <= 0) goto s`Aaaaaaaa0` jls s`Aaaaaaaa0`
00011010Aaaaaaaa ifs (nzcv >= 0) goto s`Aaaaaaaa0` jge s`Aaaaaaaa0`
00011011Aaaaaaaa ifs (nzcv < 0) goto s`Aaaaaaaa0` jlt s`Aaaaaaaa0`
00011100Aaaaaaaa ifs (nzcv > 0) goto s`Aaaaaaaa0` jgt s`Aaaaaaaa0`
00011101Aaaaaaaa ifs (nzcv <= 0) goto s`Aaaaaaaa0` jle s`Aaaaaaaa0`
00011110Aaaaaaaa ifs (nzcv ?? 0) goto s`Aaaaaaaa0` j s`Aaaaaaaa0`
========-------========--------========--------========
00100Aaaaaaa0Xxx if (r`Xxx` == 0) goto s`Aaaaaaa0` jz r`Xxx`, s`Aaaaaaa0`
00100Aaaaaaa1Xxx if (r`Xxx` != 0) goto s`Aaaaaaa0` jnz r`Xxx`, s`Aaaaaaa0`
00101AaaaaBbbXxx r`Xxx` = [addr(s`BbbAaaaa00`)] lw r`Xxx`, s`BbbAaaaa00`
00110XxxHGFEDCBA {r`ABCDEFGH`<r0-r7>} = [r`Xxx`++] lm {r`ABCDEFGH`<r0-r7>}, r`Xxx`
00111XxxHGFEDCBA [r`Xxx`++] = {r`ABCDEFGH`<r0-r7>} sm {r`ABCDEFGH`<r0-r7>}, r`Xxx`
========-------========--------========--------========
01000AaaaaBbbXxx r`Xxx` = [sp + s`BbbAaaaa00`] lw r`Xxx`, sp, s`BbbAaaaa00`
01001AaaaaYyyXxx r`Xxx` = [r`Yyy` + s`Aaaaa00`] lw r`Xxx`, r`Yyy`, s`Aaaaa00`
01010BAaaaYyyXxx r`Xxx` = h[r`Yyy` + s`AaaaB0`] lhz r`Xxx`, r`Yyy`, s`AaaaB0`
01011BbAaaYyyXxx r`Xxx` = b[r`Yyy` + s`AaaBb`] lbz r`Xxx`, r`Yyy`, s`AaaBb`
========-------========--------========--------========
01100AaaaaBbbXxx [sp + s`BbbAaaaa00`] = r`Xxx` sw r`Xxx`, sp, s`BbbAaaaa00`
01101AaaaaYyyXxx [r`Yyy` + s`Aaaaa00`] = r`Xxx` sw r`Xxx`, r`Yyy`, s`Aaaaa00`
01110BAaaaYyyXxx h[r`Yyy` + s`AaaaB0`] = r`Xxx` sh r`Xxx`, r`Yyy`, s`AaaaB0`
01111BbAaaYyyXxx b[r`Yyy` + s`AaaBb`] = r`Xxx` sb r`Xxx`, r`Yyy`, s`AaaBb`
========-------========--------========--------========
10000AaaaaaaaXxx r`Xxx` = s`Aaaaaaaa` movs r`Xxx`, s`Aaaaaaaa`
10001AaaaaaaaXxx r`Xxx` += s`Aaaaaaaa` add r`Xxx`, s`Aaaaaaaa`
10010AaaaaaaaXxx r`Xxx` = sp + s`Aaaaaaaa` add r`Xxx`, sp, s`Aaaaaaaa`
10011AaaaaaaaXxx cmp r`Xxx`, s`Aaaaaaaa`
========-------========--------========--------========
101Aaaaa00YyyXxx r`Xxx` = r`Yyy` << `Aaaaa`<0=32> lsl r`Xxx`, r`Yyy`, `Aaaaa`<0=32>
101Aaaaa01YyyXxx r`Xxx` = r`Yyy` >> `Aaaaa`<0=32> lsr r`Xxx`, r`Yyy`, `Aaaaa`<0=32>
101Aaaaa10YyyXxx r`Xxx` = r`Yyy` <<< `Aaaaa`<0=32> qasl r`Xxx`, r`Yyy`, `Aaaaa`<0=32>
101Aaaaa11YyyXxx r`Xxx` = r`Yyy` >>> `Aaaaa`<0=32> qasr r`Xxx`, r`Yyy`, `Aaaaa`<0=32>
========-------========--------========--------========
1100000000000000 {r3-r0} = [sp++] pop {r3-r0}
1100000000000001 {r3-r1} = [sp++] pop {r3-r1}
1100000000000010 {r3, r2} = [sp++] pop {r3, r2}
1100000000000011 {r3} = [sp++] pop {r3}
1100000000000100 {r4} = [sp++] pop {r4}
1100000000000101 {r5, r4} = [sp++] pop {r5, r4}
1100000000000110 {r6-r4} = [sp++] pop {r6-r4}
1100000000000111 {r7-r4} = [sp++] pop {r7-r4}
1100000000001000 {r8-r4} = [sp++] pop {r8-r4}
1100000000001001 {r9-r4} = [sp++] pop {r9-r4}
1100000000001010 {r10-r4} = [sp++] pop {r10-r4}
1100000000001011 {r11-r4} = [sp++] pop {r11-r4}
1100000000001100 {r12-r4} = [sp++] pop {r12-r4}
1100000000001101 {r13-r4} = [sp++] pop {r13-r4}
1100000000001110 {r14-r4} = [sp++] pop {r14-r4}
1100000000001111 {} = [sp++] pop {}
1100000000010000 {pc, r3-r0} = [sp++] pop {pc, r3-r0}
1100000000010001 {pc, r3-r1} = [sp++] pop {pc, r3-r1}
1100000000010010 {pc, r3, r2} = [sp++] pop {pc, r3, r2}
1100000000010011 {pc, r3} = [sp++] pop {pc, r3}
1100000000010100 {pc, r4} = [sp++] pop {pc, r4}
1100000000010101 {pc, r5, r4} = [sp++] pop {pc, r5, r4}
1100000000010110 {pc, r6-r4} = [sp++] pop {pc, r6-r4}
1100000000010111 {pc, r7-r4} = [sp++] pop {pc, r7-r4}
1100000000011000 {pc, r8-r4} = [sp++] pop {pc, r8-r4}
1100000000011001 {pc, r9-r4} = [sp++] pop {pc, r9-r4}
1100000000011010 {pc, r10-r4} = [sp++] pop {pc, r10-r4}
1100000000011011 {pc, r11-r4} = [sp++] pop {pc, r11-r4}
1100000000011100 {pc, r12-r4} = [sp++] pop {pc, r12-r4}
1100000000011101 {pc, r13-r4} = [sp++] pop {pc, r13-r4}
1100000000011110 {pc, r14-r4} = [sp++] pop {pc, r14-r4}
1100000000011111 {pc} = [sp++] pop {pc}
1100001000000000 [--sp] = {r3-r0} push {r3-r0}
1100001000000001 [--sp] = {r3-r1} push {r3-r1}
1100001000000010 [--sp] = {r3, r2} push {r3, r2}
1100001000000011 [--sp] = {r3} push {r3}
1100001000000100 [--sp] = {r4} push {r4}
1100001000000101 [--sp] = {r5, r4} push {r5, r4}
1100001000000110 [--sp] = {r6-r4} push {r6-r4}
1100001000000111 [--sp] = {r7-r4} push {r7-r4}
1100001000001000 [--sp] = {r8-r4} push {r8-r4}
1100001000001001 [--sp] = {r9-r4} push {r9-r4}
1100001000001010 [--sp] = {r10-r4} push {r10-r4}
1100001000001011 [--sp] = {r11-r4} push {r11-r4}
1100001000001100 [--sp] = {r12-r4} push {r12-r4}
1100001000001101 [--sp] = {r13-r4} push {r13-r4}
1100001000001110 [--sp] = {r14-r4} push {r14-r4}
1100001000001111 [--sp] = {} push {}
1100001000010000 [--sp] = {rets, r3-r0} push {rets, r3-r0}
1100001000010001 [--sp] = {rets, r3-r1} push {rets, r3-r1}
1100001000010010 [--sp] = {rets, r3, r2} push {rets, r3, r2}
1100001000010011 [--sp] = {rets, r3} push {rets, r3}
1100001000010100 [--sp] = {rets, r4} push {rets, r4}
1100001000010101 [--sp] = {rets, r5, r4} push {rets, r5, r4}
1100001000010110 [--sp] = {rets, r6-r4} push {rets, r6-r4}
1100001000010111 [--sp] = {rets, r7-r4} push {rets, r7-r4}
1100001000011000 [--sp] = {rets, r8-r4} push {rets, r8-r4}
1100001000011001 [--sp] = {rets, r9-r4} push {rets, r9-r4}
1100001000011010 [--sp] = {rets, r10-r4} push {rets, r10-r4}
1100001000011011 [--sp] = {rets, r11-r4} push {rets, r11-r4}
1100001000011100 [--sp] = {rets, r12-r4} push {rets, r12-r4}
1100001000011101 [--sp] = {rets, r13-r4} push {rets, r13-r4}
1100001000011110 [--sp] = {rets, r14-r4} push {rets, r14-r4}
1100001000011111 [--sp] = {rets} push {rets}
11000011----Xxxx testset b[r`Xxxx`]
11000100HGFEDCBA {sr`ABCDEFGH`<sfr0-7>} = [sp++] pops {sr`ABCDEFGH`<sfr0-7>}
11000101HGFEDCBA [--sp] = {sr`ABCDEFGH`<sfr0-7>} pushs {sr`ABCDEFGH`<sfr0-7>}
11000110BAYyyXxx r`AXxx` = r`BYyy` mov r`AXxx`, r`BYyy`
11000111BAYyyXxx sr`AXxx` = r`BYyy` mov sr`AXxx`, r`BYyy`
11001000BAYyyXxx r`AXxx` = sr`BYyy` mov r`AXxx`, sr`BYyy`
1100100100YyyXxx r`Xxx` = r`Yyy`.b uxtb r`Xxx`, r`Yyy`
1100100101YyyXxx r`Xxx` = r`Yyy`.l uxth r`Xxx`, r`Yyy`
1100100110YyyXxx r`Xxx` = r`Yyy`.b (s) sxtb r`Xxx`, r`Yyy`
1100100111YyyXxx r`Xxx` = r`Yyy`.l (s) sxth r`Xxx`, r`Yyy`
11001010BAYyyXxx r`AXxx` += r`BYyy` (brev) addrev r`AXxx`, r`BYyy`
11001011BAYyyXxx r`AXxx` += r`BYyy` add r`AXxx`, r`BYyy`
11001100BAYyyXxx cmn r`BYyy`, r`AXxx`
11001101Aaaaaaaa sp += s`Aaaaaaaa` add sp, s`Aaaaaaaa`
11001110BAYyyXxx cmp r`BYyy`, r`AXxx`
1100111100YyyXxx r`Xxx` <<= r`Yyy` lsl r`Xxx`, r`Yyy`
1100111101YyyXxx r`Xxx` >>= r`Yyy` lsr r`Xxx`, r`Yyy`
1100111110YyyXxx r`Xxx` <<<= r`Yyy` qasl r`Xxx`, r`Yyy`
1100111111YyyXxx r`Xxx` >>>= r`Yyy` qasr r`Xxx`, r`Yyy`
110100AaaaYyyXxx r`Xxx` = r`Yyy` + s`Aaaa` add r`Xxx`, r`Yyy`, s`Aaaa`
1101010ZzzYyyXxx r`Xxx` = r`Yyy` + r`Zzz` add r`Xxx`, r`Yyy`, r`Zzz`
1101011ZzzYyyXxx r`Xxx` = r`Yyy` - r`Zzz` sub r`Xxx`, r`Yyy`, r`Zzz`
11011000AaaaaXxx r`Xxx` |= s`(1<<'Aaaaa')` bitset r`Xxx`, `Aaaaa`
11011001AaaaaXxx r`Xxx` ^= s`(1<<'Aaaaa')` bittgl r`Xxx`, `Aaaaa`
1101101000YyyXxx r`Xxx` |= r`Yyy` or r`Xxx`, r`Yyy`
1101101001YyyXxx r`Xxx` ^= r`Yyy` xor r`Xxx`, r`Yyy`
1101101010YyyXxx r`Xxx` &= r`Yyy` and r`Xxx`, r`Yyy`
1101101011YyyXxx r`Xxx` = ~r`Yyy` not r`Xxx`, r`Yyy`
11011011AaaaaXxx r`Xxx` &= (~s`(1<<'Aaaaa')`) bitclr r`Xxx`, `Aaaaa`
1101110000YyyXxx r`Xxx` += r`Yyy` + c addc r`Xxx`, r`Yyy`
1101110001YyyXxx r`Xxx` -= r`Yyy` + !c subc r`Xxx`, r`Yyy`
1101110010YyyXxx r`Xxx` = -r`Yyy` neg r`Xxx`, r`Yyy`
1101110011Aaaaaa macc <<= `Aaaaaa`<0==64> lslmacc `Aaaaaa`<0==64>
1101110100YyyXxx r`Xxx` <>= r`Yyy` rotr r`Xxx`, r`Yyy`
1101110101YyyXxx r`Xxx` <c>= r`Yyy` rotrc r`Xxx`, r`Yyy`
110111011A000Xxx macc <<= r`AXxx` lslmacc r`AXxx`
110111100A000Xxx macc >>= r`AXxx` lsrmacc r`AXxx`
110111101A000Xxx macc >>>= r`AXxx` asrmacc r`AXxx`
1101111100Aaaaaa macc >>= `Aaaaaa`<0==64> lsrmacc `Aaaaaa`<0==64>
1101111110Aaaaaa macc >>>= `Aaaaaa`<0==64> asrmacc `Aaaaaa`<0==64>
111000000000000000000000Xxxx0000 ifs (nzcv == 0) goto r`Xxxx` jeq r`Xxxx`
111000000000000000000000Xxxx0001 ifs (nzcv != 0) goto r`Xxxx` jne r`Xxxx`
111000000000000000000000Xxxx0010 if (nzcv >= 0) goto r`Xxxx` jcs r`Xxxx`
111000000000000000000000Xxxx0011 if (nzcv < 0) goto r`Xxxx` jcc r`Xxxx`
111000000000000000000000Xxxx0100 ifs (nzcv ?? 0) goto r`Xxxx` jmi r`Xxxx`
111000000000000000000000Xxxx0101 ifs (nzcv ?? 0) goto r`Xxxx` jpl r`Xxxx`
111000000000000000000000Xxxx0110 ifs (nzcv ?? 0) goto r`Xxxx` jvs r`Xxxx`
111000000000000000000000Xxxx0111 ifs (nzcv ?? 0) goto r`Xxxx` jvc r`Xxxx`
111000000000000000000000Xxxx1000 if (nzcv > 0) goto r`Xxxx` jhi r`Xxxx`
111000000000000000000000Xxxx1001 if (nzcv <= 0) goto r`Xxxx` jls r`Xxxx`
111000000000000000000000Xxxx1010 ifs (nzcv >= 0) goto r`Xxxx` jge r`Xxxx`
111000000000000000000000Xxxx1011 ifs (nzcv < 0) goto r`Xxxx` jlt r`Xxxx`
111000000000000000000000Xxxx1100 ifs (nzcv > 0) goto r`Xxxx` jgt r`Xxxx`
111000000000000000000000Xxxx1101 ifs (nzcv <= 0) goto r`Xxxx` jle r`Xxxx`
111000000000000000000000Xxxx1110 ifs (nzcv ?? 0) goto r`Xxxx` j r`Xxxx`
========-------========--------========--------========
11100000100000000000000000000000 trigger
========-------========--------========--------========
11100001AaaaaaaaaaaaaaaaaaaaBbbb call s`BbbbAaaaaaaaaaaaaaaaaaaa0`
========-------========--------========--------========
11100010Aaaa%%%%%%%%%%%%XxxxBbbb [r`Xxxx` + s`AaaaBbbb00`] |= `%%WeirdIMM%%` memor r`Xxxx`, s`AaaaBbbb00`, `%%WeirdIMM%%`
11100011Aaaa%%%%%%%%%%%%XxxxBbbb [r`Xxxx` + s`AaaaBbbb00`] &= (~`%%WeirdIMM%%`) memandnot r`Xxxx`, s`AaaaBbbb00`, `%%WeirdIMM%%`
========-------========--------========--------========
1110010000000000AaaaaaaaaaBbXxxx r`Xxxx` = b[addr(s`BbAaaaaaaaaa`)] lbz r`Xxxx`, s`BbAaaaaaaaaa`
1110010000010000AaaaaaaaaBbbXxxx r`Xxxx` = h[addr(s`BbbAaaaaaaaa0`)] lhz r`Xxxx`, s`BbbAaaaaaaaa0`
1110010000100000AaaaaaaaBbbbXxxx r`Xxxx` = [addr(s`BbbbAaaaaaaa00`)] lw r`Xxxx`, s`BbbbAaaaaaaa00`
1110010010000000AaaaaaaaaaBbXxxx r`Xxxx` = b[addr(s`BbAaaaaaaaaa`)] (s) lbs r`Xxxx`, s`BbAaaaaaaaaa`
1110010010010000AaaaaaaaaBbbXxxx r`Xxxx` = h[addr(s`BbbAaaaaaaaa0`)] (s) lhs r`Xxxx`, s`BbbAaaaaaaaa0`
========-------========--------========--------========
111001010000ZzzzAaaaaaaaYyyyXxxx r`Xxxx`, r`Zzzz` = d[r`Yyyy` + `Aaaaaaaa00`]
111001010001Iiii0000ZzzzYyyyXxxx r`Xxxx`, r`Iiii` = d[++ r`Yyyy` = r`Zzzz`]
111001010010Iiii0000ZzzzYyyyXxxx r`Xxxx`, r`Iiii` = d[r`Yyyy` ++= r`Zzzz`]
111001010011YyyyAaaaaaaaBbbbXxxx r`Xxxx`, r`Yyyy` = d[addr(`BbbbAaaaaaaa00`)]
111001010100ZzzzAaaaaaaaYyyyXxxx d[r`Yyyy` + `Aaaaaaaa00`] = r`Xxxx`, r`Zzzz`
111001010101Iiii0000ZzzzYyyyXxxx d[++r`Yyyy` = r`Zzzz`] = r`Iiii`, r`Xxxx`
111001010110Iiii0000ZzzzYyyyXxxx d[r`Yyyy` ++= r`Zzzz`] = r`Xxxx`, r`Iiii`
========-------========--------========--------========
111001100000Xxxx0ONMLKJIHGFEDCBA {r`ONMLKJIHGFEDCBA`<r14-0>} = [r`Xxxx`+]
111001100000Xxxx1ONMLKJIHGFEDCBA {pc, r`ONMLKJIHGFEDCBA`<r14-0>} = [r`Xxxx`+]
111001100001XxxxPONMLKJIHGFEDCBA {sfr`PONMLKJIHGFEDCBA`<sfr15-0>} = [r`Xxxx`+]
111001100010XxxxPONMLKJIHGFEDCBA {r`PONMLKJIHGFEDCBA`<r15(sp)-0>} = [-r`Xxxx`]
111001100100XxxxPONMLKJIHGFEDCBA [r`Xxxx`+] = {r`PONMLKJIHGFEDCBA`<r15(sp)-0>}
111001100110XxxxPONMLKJIHGFEDCBA [-r`Xxxx`] = {sfr`PONMLKJIHGFEDCBA`<sfr15-0>}
111001100111Xxxx0ONMLKJIHGFEDCBA [-r`Xxxx`] = {r`ONMLKJIHGFEDCBA`<r14-0>}
111001100111Xxxx1ONMLKJIHGFEDCBA [-r`Xxxx`] = {rets, r`ONMLKJIHGFEDCBA`<r14-0>}
111001101000Xxxx0ONMLKJIHGFEDCBA {r`ONMLKJIHGFEDCBA`<r14-0>} = [r`Xxxx`++]
111001101000Xxxx1ONMLKJIHGFEDCBA {pc, r`ONMLKJIHGFEDCBA`<r14-0>} = [r`Xxxx`++]
111001101001XxxxPONMLKJIHGFEDCBA {sfr`PONMLKJIHGFEDCBA`<sfr15-0>} = [r`Xxxx`++]
111001101010XxxxPONMLKJIHGFEDCBA {r`PONMLKJIHGFEDCBA`<r15(sp)-0>} = [--r`Xxxx`]
111001101100XxxxPONMLKJIHGFEDCBA [r`Xxxx`++] = {r`PONMLKJIHGFEDCBA`<r15(sp)-0>}
111001101110XxxxPONMLKJIHGFEDCBA [--r`Xxxx`] = {sfr`PONMLKJIHGFEDCBA`<sfr15-0>}
111001101111Xxxx0ONMLKJIHGFEDCBA [--r`Xxxx`] = {r`ONMLKJIHGFEDCBA`<r14-0>}
111001101111Xxxx1ONMLKJIHGFEDCBA [--r`Xxxx`] = {rets, r`ONMLKJIHGFEDCBA`<r14-0>}
========-------========--------========--------========
11100111000000000000ZzzzYyyyXxxx r`Xxxx` = b[r`Yyyy` + r`Zzzz`] lbz r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111000001000000ZzzzYyyyXxxx r`Xxxx` = b[++r`Yyyy` = r`Zzzz`] addlbz r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111000010000000ZzzzYyyyXxxx r`Xxxx` = b[r`Yyyy` ++= r`Zzzz`] lbzadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111000100000000ZzzzYyyyXxxx r`Xxxx` = h[r`Yyyy` + r`Zzzz`] lhz r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111000101000000ZzzzYyyyXxxx r`Xxxx` = h[++r`Yyyy` = r`Zzzz`] addlhz r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111000110000000ZzzzYyyyXxxx r`Xxxx` = h[r`Yyyy` ++= r`Zzzz`] lhzadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111001000000000ZzzzYyyyXxxx r`Xxxx` = [r`Yyyy` + r`Zzzz`] lw r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111001001000000ZzzzYyyyXxxx r`Xxxx` = [++r`Yyyy` = r`Zzzz`] addlw r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111001010000000ZzzzYyyyXxxx r`Xxxx` = [r`Yyyy` ++= r`Zzzz`] lwadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111010000000000ZzzzYyyyXxxx b[r`Yyyy` + r`Zzzz`] = r`Xxxx` sb r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111010001000000ZzzzYyyyXxxx b[++r`Yyyy` = r`Zzzz`] = r`Xxxx` addsb r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111010010000000ZzzzYyyyXxxx b[r`Yyyy` ++= r`Zzzz`] = r`Xxxx` sbadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111010100000000ZzzzYyyyXxxx h[r`Yyyy` + r`Zzzz`] = r`Xxxx` sh r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111010101000000ZzzzYyyyXxxx h[++r`Yyyy` = r`Zzzz`] = r`Xxxx` addsh r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111010110000000ZzzzYyyyXxxx h[r`Yyyy` ++= r`Zzzz`] = r`Xxxx` shadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111011000000000ZzzzYyyyXxxx [r`Yyyy` + r`Zzzz`] = r`Xxxx` sw r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111011001000000ZzzzYyyyXxxx [++r`Yyyy` = r`Zzzz`] = r`Xxxx` addsw r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111011010000000ZzzzYyyyXxxx [r`Yyyy` ++= r`Zzzz`] = r`Xxxx` swadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111100000000000ZzzzYyyyXxxx r`Xxxx` = b[r`Yyyy` + r`Zzzz`] (s) lbs r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111100001000000ZzzzYyyyXxxx r`Xxxx` = b[++r`Yyyy` = r`Zzzz`] (s) addlbs r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111100010000000ZzzzYyyyXxxx r`Xxxx` = b[r`Yyyy` ++= r`Zzzz`] (s) lbsadd r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111100100000000ZzzzYyyyXxxx r`Xxxx` = h[r`Yyyy` + r`Zzzz`] (s) lhs r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111100101000000ZzzzYyyyXxxx r`Xxxx` = h[++r`Yyyy` = r`Zzzz`] (s) addlhs r`Xxxx`, r`Yyyy`, r`Zzzz`
11100111100110000000ZzzzYyyyXxxx r`Xxxx` = h[r`Yyyy` ++= r`Zzzz`] (s) lhsadd r`Xxxx`, r`Yyyy`, r`Zzzz`
========-------========--------========--------========
1110100000000000BbAaaaaaYyyyXxxx r`Xxxx` = b[r`Yyyy` + s`AaaaaaBb`] lbz r`Xxxx`, r`Yyyy`, s`AaaaaaaBb`
1110100000000100BbAaaaaaYyyyXxxx r`Xxxx` = b[++r`Yyyy` = s`AaaaaaBb`] addlbz r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100000001000BbAaaaaaYyyyXxxx r`Xxxx` = b[r`Yyyy` ++= s`AaaaaaBb`] lbzadd r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100000010000BAaaaaaaYyyyXxxx r`Xxxx` = h[r`Yyyy` + s`AaaaaaaB0`] lhz r`Xxxx`, r`Yyyy`, s`AaaaaaaB0`
1110100000010100BAaaaaaaYyyyXxxx r`Xxxx` = h[++r`Yyyy` = s`AaaaaaaB0`] addlhz r`Xxxx`, r`Yyyy`, s`AaaaaaaB0`
1110100000011000BAaaaaaaYyyyXxxx r`Xxxx` = h[r`Yyyy` ++= s`AaaaaaaB0`] lhzadd r`Xxxx`, r`Yyyy`, s`AaaaaaaB0`
1110100000100000AaaaaaaaYyyyXxxx r`Xxxx` = [r`Yyyy` + s`Aaaaaaaa00`] lw r`Xxxx`, r`Yyyy`, s`Aaaaaaaa00`
1110100000100100AaaaaaaaYyyyXxxx r`Xxxx` = [++r`Yyyy` = s`Aaaaaaaa00`] addlw r`Xxxx`, r`Yyyy`, s`Aaaaaaaa00`
1110100000101000AaaaaaaaYyyyXxxx r`Xxxx` = [r`Yyyy` ++= s`Aaaaaaaa00`] lwadd r`Xxxx`, r`Yyyy`, s`Aaaaaaaa00`
1110100001000000BbAaaaaaYyyyXxxx b[r`Yyyy` + s`AaaaaaBb`] = r`Xxxx` sb r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100001000100BbAaaaaaYyyyXxxx b[++r`Yyyy` = s`AaaaaaBb`] = r`Xxxx` addsb r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100001001000BbAaaaaaYyyyXxxx b[r`Yyyy` ++= s`AaaaaaBb`] = r`Xxxx` sbadd r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100001010000BAaaaaaaYyyyXxxx h[r`Yyyy` + s`AaaaaaaB0`] = r`Xxxx` sh r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100001010100BAaaaaaaYyyyXxxx h[++r`Yyyy` = s`AaaaaaaB0`] = r`Xxxx` addsh r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100001011000BAaaaaaaYyyyXxxx h[r`Yyyy` ++= s`AaaaaaaB0`] = r`Xxxx` shadd r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100001100000AaaaaaaaYyyyXxxx [r`Yyyy` + s`Aaaaaaaa00`] = r`Xxxx` sw r`Xxxx`, r`Yyyy`, s`Aaaaaaaa00`
1110100001100100AaaaaaaaYyyyXxxx [++r`Yyyy` = s`Aaaaaaaa00`] = r`Xxxx` addsw r`Xxxx`, r`Yyyy`, s`Aaaaaaaa00`
1110100001101000AaaaaaaaYyyyXxxx [r`Yyyy` ++= s`Aaaaaaaa00`] = r`Xxxx` swadd r`Xxxx`, r`Yyyy`, s`Aaaaaaaa00`
1110100010000000BbAaaaaaYyyyXxxx r`Xxxx` = b[r`Yyyy` + s`AaaaaaBb`] (s) lbs r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100010000100BbAaaaaaYyyyXxxx r`Xxxx` = b[++r`Yyyy` = s`AaaaaaBb`] (s) addlbs r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100010001000BbAaaaaaYyyyXxxx r`Xxxx` = b[r`Yyyy` ++= s`AaaaaaBb`] (s) lbsadd r`Xxxx`, r`Yyyy`, s`AaaaaaBb`
1110100010010000BAaaaaaaYyyyXxxx r`Xxxx` = h[r`Yyyy` + s`AaaaaaaB0`] (s) lhs r`Xxxx`, r`Yyyy`, s`AaaaaaaB0`
1110100010010100BAaaaaaaYyyyXxxx r`Xxxx` = h[++r`Yyyy` = s`AaaaaaaB0`] (s) addlhs r`Xxxx`, r`Yyyy`, s`AaaaaaaB0`
1110100010011000BAaaaaaaYyyyXxxx r`Xxxx` = h[r`Yyyy` ++= s`AaaaaaaB0`] (s) lhsadd r`Xxxx`, r`Yyyy`, s`AaaaaaaB0`
========-------========--------========--------========
1110100100000000AaaaaaaaaaBbXxxx r`Xxxx` = b[sp + s`BbAaaaaaaaaa`] lbz r`Xxxx`, sp, s`BbAaaaaaaaaa`
1110100100010000AaaaaaaaaBbbXxxx r`Xxxx` = h[sp + s`BbbAaaaaaaaa0`] lhz r`Xxxx`, sp, s`BbbAaaaaaaaa0`
1110100100100000AaaaaaaaBbbbXxxx r`Xxxx` = [sp + s`BbbbAaaaaaaa00`] lw r`Xxxx`, sp, s`BbbbAaaaaaaa00`
1110100101000000AaaaaaaaaaBbXxxx b[sp + s`BbAaaaaaaaaa`] = r`Xxxx` sb r`Xxxx`, sp, s`BbAaaaaaaaaa`
1110100101010000AaaaaaaaaBbbXxxx h[sp + s`BbbAaaaaaaaa0`] = r`Xxxx` sh r`Xxxx`, sp, s`BbbAaaaaaaaa0`
1110100101100000AaaaaaaaBbbbXxxx [sp + s`BbbbAaaaaaaa00`] = r`Xxxx` sw r`Xxxx`, sp, s`BbbbAaaaaaaa00`
1110100110000000AaaaaaaaaaBbXxxx r`Xxxx` = b[sp + s`BbAaaaaaaaaa`] (s) lbs r`Xxxx`, sp, s`BbAaaaaaaaaa`
1110100110010000AaaaaaaaaBbbXxxx r`Xxxx` = h[sp + s`BbbAaaaaaaaa0`] (s) lhs r`Xxxx`, sp, s`BbbAaaaaaaaa0`
========-------========--------========--------========
111010100B000XxxAaaaaaaaaaaaaaaa r`BXxx`.l = `Aaaaaaaaaaaaaaaa` movl r`BXxx`, `Aaaaaaaaaaaaaaaa`
111010100B001XxxAaaaaaaaaaaaaaaa sfr`BXxx`.l = `Aaaaaaaaaaaaaaaa` movl sfr`BXxx`, `Aaaaaaaaaaaaaaaa`
111010100B010XxxAaaaaaaaaaaaaaaa r`BXxx` = `Aaaaaaaaaaaaaaaa` movz r`BXxx`, `Aaaaaaaaaaaaaaaa`
111010100B011XxxAaaaaaaaaaaaaaaa sfr`BXxx` = `Aaaaaaaaaaaaaaaa` movz sfr`BXxx`, `Aaaaaaaaaaaaaaaa`
111010100010%%%%%%%%%%%%0000Xxxx r`Xxxx` = `%%WeirdIMM%%`
111010101B000XxxAaaaaaaaaaaaaaaa r`BXxx`.h = `Aaaaaaaaaaaaaaaa` movh r`BXxx`, `Aaaaaaaaaaaaaaaa`
111010101B001XxxAaaaaaaaaaaaaaaa sfr`BXxx`.h = `Aaaaaaaaaaaaaaaa` movh sfr`BXxx`, `Aaaaaaaaaaaaaaaa`
111010101B010XxxAaaaaaaaaaaaaaaa r`BXxx` = s`Aaaaaaaaaaaaaaaa` movs r`BXxx`, s`Aaaaaaaaaaaaaaaa`
111010101B011XxxAaaaaaaaaaaaaaaa sfr`BXxx` = s`Aaaaaaaaaaaaaaaa` movs sfr`BXxx`, s`Aaaaaaaaaaaaaaaa`
========-------========--------========--------========
111010110000000000000000YyyyXxxx r`Xxxx` = rev8(r`Yyyy`) rev8 r`Xxxx`, r`Yyyy`
========-------========--------========--------========
111011000000000000000000YyyyXxxx r`Xxxx` = r`Yyyy`.b uxtb r`Xxxx`, r`Yyyy`
111011000100000000000000YyyyXxxx r`Xxxx` = r`Yyyy`.l uxth r`Xxxx`, r`Yyyy`
111011001000000000000000YyyyXxxx r`Xxxx` = r`Yyyy`.b (s) sxtb r`Xxxx`, r`Yyyy`
111011001100000000000000YyyyXxxx r`Xxxx` = r`Yyyy`.l (s) sxth r`Xxxx`, r`Yyyy`
========-------========--------========--------========
11101101000BbbbbAaaaaaaaYyyyXxxx r`Xxxx` = r`Yyyy` + s`BbbbbAaaaaaaa` add r`Xxxx`, r`Yyyy`, s`BbbbbAaaaaaaa`
========-------========--------========--------========
11101110000000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` + r`Zzzz` add r`Xxxx`, r`Yyyy`, r`Zzzz`
111011100001%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` + `%%WeirdIMM%%`
111011100010%%%%%%%%%%%%YyyyXxxx r`Xxxx` = `%%WeirdIMM%%` - r`Yyyy`
11101110010000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` - r`Zzzz` sub r`Xxxx`, r`Yyyy`, r`Zzzz`
11101110100000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` + r`Zzzz` + c addc r`Xxxx`, r`Yyyy`, r`Zzzz`
111011101001%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` - `%%WeirdIMM%%`
11101110110000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` - r`Zzzz` - !c subc r`Xxxx`, r`Yyyy`, r`Zzzz`
========-------========--------========--------========
111011110000%%%%%%%%%%%%Xxxx0000 cmp r`Xxxx`, `%%WeirdIMM%%`
111011111000AaaaaaaaaaaaXxxx0000 cmp r`Xxxx`, s`Aaaaaaaaaaaa`
========-------========--------========--------========
11110000000000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` | r`Zzzz` or r`Xxxx`, r`Yyyy`, r`Zzzz`
11110000010000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` ^ r`Zzzz` xor r`Xxxx`, r`Yyyy`, r`Zzzz`
11110000100000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` & r`Zzzz` and r`Xxxx`, r`Yyyy`, r`Zzzz`
11110000110000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` & ~r`Zzzz` andnot r`Xxxx`, r`Yyyy`, r`Zzzz`
========-------========--------========--------========
11110001000000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` | setbit(r`Zzzz`) bitset r`Xxxx`, r`Yyyy`, r`Zzzz`
11110001010000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` ^ setbit(r`Zzzz`) bittgl r`Xxxx`, r`Yyyy`, r`Zzzz`
11110001100000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` & setbit(r`Zzzz`) and1 r`Xxxx`, r`Yyyy`, r`Zzzz`
11110001110000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` & ~setbit(r`Zzzz`) bitclr r`Xxxx`, r`Yyyy`, r`Zzzz`
========-------========--------========--------========
111100100000000000000000YyyyXxxx tst r`Xxxx`, r`Yyyy`
111100100100000000000000YyyyXxxx r`Xxxx` = ~r`Yyyy` not r`Xxxx`, r`Yyyy`
========-------========--------========--------========
111100110000%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` | `%%WeirdIMM%%`
111100110100%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` ^ `%%WeirdIMM%%`
111100111000%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` & `%%WeirdIMM%%`
111100111100%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` & (~`%%WeirdIMM%%`)
========-------========--------========--------========
1111010000000000AaaaaaaaXxxx0000 tst r`Xxxx`, `%%WeirdIMM%%`
========-------========--------========--------========
111101010000000000000000YyyyXxxx r`Xxxx` = clz(r`Yyyy`) clz r`Xxxx`, r`Yyyy`
111101010100000000000000YyyyXxxx r`Xxxx` = cls(r`Yyyy`) cls r`Xxxx`, r`Yyyy`
111101011000000000000000YyyyXxxx r`Xxxx` = zcmp(r`Yyyy`) zcmp r`Xxxx`, r`Yyyy`
========-------========--------========--------========
11110110000000BbbbbAaaaaYyyyXxxx r`Xxxx` = uextra(r`Yyyy`, p:`Bbbbb`, l:`Aaaaa`) uextra r`Xxxx`, r`Yyyy`, `CcBbb`, `Aaaaa`
11110110001000000000ZzzzYyyyXxxx r`Xxxx` = uextra(r`Yyyy`, p:r`Zzzz`[12:8], l:r`Zzzz`[4:0]) uextra r`Xxxx`, r`Yyyy`, r`Zzzz`
11110110010000BbbbbAaaaaYyyyXxxx r`Xxxx` <= insert(r`Yyyy`, p:`Bbbbb`, l:`Aaaaa`) insert r`Xxxx`, r`Yyyy`, `CcBbb`, `Aaaaa`
11110110011000000000ZzzzYyyyXxxx r`Xxxx` <= insert(r`Yyyy`, p:r`Zzzz`[12:8], l:r`Zzzz`[4:0]) insert r`Xxxx`, r`Yyyy`, r`Zzzz`
11110110100000BbbbbAaaaaYyyyXxxx r`Xxxx` = sextra(r`Yyyy`, p:`Bbbbb`, l:`Aaaaa`) sextra r`Xxxx`, r`Yyyy`, `CcBbb`, `Aaaaa`
11110110101000000000ZzzzYyyyXxxx r`Xxxx` = sextra(r`Yyyy`, p:r`Zzzz`[12:8], l:r`Zzzz`[4:0]) sextra r`Xxxx`, r`Yyyy`, r`Zzzz`
========-------========--------========--------========
11110111000000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` << r`Zzzz` lsl r`Xxxx`, r`Yyyy`, r`Zzzz`
1111011100100000000AaaaaYyyyXxxx r`Xxxx` = r`Yyyy` << `Aaaaa`<0==32> lsl r`Xxxx`, r`Yyyy`, `Aaaaa`<0==32>
11110111010000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` >> r`Zzzz` lsr r`Xxxx`, r`Yyyy`, r`Zzzz`
1111011101100000000AaaaaYyyyXxxx r`Xxxx` = r`Yyyy` >> `Aaaaa`<0==32> lsr r`Xxxx`, r`Yyyy`, `Aaaaa`<0==32>
11110111100000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` <<< r`Zzzz` qasl r`Xxxx`, r`Yyyy`, r`Zzzz`
1111011110100000000AaaaaYyyyXxxx r`Xxxx` = r`Yyyy` <<< `Aaaaa`<0==32> qasl r`Xxxx`, r`Yyyy`, `Aaaaa`<0==32>
11110111110000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` >>> r`Zzzz` qasr r`Xxxx`, r`Yyyy`, r`Zzzz`
1111011111100000000AaaaaYyyyXxxx r`Xxxx` = r`Yyyy` >>> `Aaaaa`<0==32> qasr r`Xxxx`, r`Yyyy`, `Aaaaa`<0==32>
========-------========--------========--------========
11111000000000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` <> r`Zzzz` rotr r`Xxxx`, r`Yyyy`, r`Zzzz`
1111100001000000000AaaaaYyyyXxxx r`Xxxx` = r`Yyyy` <> `Aaaaa`<0==32> rotr r`Xxxx`, r`Yyyy`, `Aaaaa`<0==32>
11111000100000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` <c> r`Zzzz` rotrc r`Xxxx`, r`Yyyy`, r`Zzzz`
1111100011000000000AaaaaYyyyXxxx r`Xxxx` = r`Yyyy` <c> `Aaaaa`<0==32> rotrc r`Xxxx`, r`Yyyy`, `Aaaaa`<0==32>
========-------========--------========--------========
11111001000000000000Yyyy0000Xxxx r`Xxxx` = macc >> r`Yyyy` movz64 r`Xxxx`, r`Yyyy`
111110010100000000Aaaaaa0000Xxxx r`Xxxx` = macc >> `Aaaaaa` movz64 r`Xxxx`, `Aaaaaa`
11111001100000000000Yyyy0000Xxxx r`Xxxx` = macc >>> r`Yyyy` movs64 r`Xxxx`, r`Yyyy`
111110011100000000Aaaaaa0000Xxxx r`Xxxx` = macc >>> `Aaaaaa` movs64 r`Xxxx`, `Aaaaaa`
========-------========--------========--------========
11111010AaaaaaaaaaaaaaaaaaaaBbbb goto s`BbbbAaaaaaaaaaaaaaaaaaaa0` j s`BbbbAaaaaaaaaaaaaaaaaaaa0`
========-------========--------========--------========
11111011Aaaaaaaaaaaaaaaaaaaa0000 ifs (nzcv == 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jeq s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0001 ifs (nzcv != 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jne s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0010 if (nzcv >= 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jcs s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0011 if (nzcv < 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jcc s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0100 ifs (nzcv ?? 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jmi s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0101 ifs (nzcv ?? 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jpl s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0110 ifs (nzcv ?? 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jvs s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa0111 ifs (nzcv ?? 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jvc s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1000 if (nzcv > 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jhi s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1001 if (nzcv <= 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jls s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1010 ifs (nzcv >= 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jge s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1011 ifs (nzcv < 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jlt s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1100 ifs (nzcv > 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jgt s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1101 ifs (nzcv <= 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` jle s`Aaaaaaaaaaaaaaaaaaaa0`
11111011Aaaaaaaaaaaaaaaaaaaa1110 ifs (nzcv ?? 0) goto s`Aaaaaaaaaaaaaaaaaaaa0` j s`Aaaaaaaaaaaaaaaaaaaa0`
========-------========--------========--------========
111111000000%%%%%%%%%%%%YyyyXxxx r`Xxxx` = r`Yyyy` * `%%WeirdIMM%%`
11111100010000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` / r`Zzzz` udiv r'Xxxx`, r`Yyyy`, r`Zzzz`
11111100100000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` * r`Zzzz` mul r`Xxxx`, r`Yyyy`, r`Zzzz`
11111100110000000000ZzzzYyyyXxxx r`Xxxx` = r`Yyyy` / r`Zzzz` (s) sdiv r`Xxxx`, r`Yyyy`, r`Zzzz`
========-------========--------========--------========
111111010-00000000000000YyyyXxxx macc = r`Xxxx` * r`Yyyy`
111111010-10000000000000YyyyXxxx macc += r`Xxxx` * r`Yyyy`
111111010-11000000000000YyyyXxxx macc -= r`Xxxx` * r`Yyyy`
111111011-00000000000000YyyyXxxx macc = r`Xxxx` * r`Yyyy` (s)
111111011-10000000000000YyyyXxxx macc += r`Xxxx` * r`Yyyy` (s)
111111011-11000000000000YyyyXxxx macc -= r`Xxxx` * r`Yyyy` (s)
========-------========--------========--------========
1111111000000000IiiiZzzzYyyyXxxx macc = [r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`]
1111111000100000IiiiZzzzYyyyXxxx macc += [r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (u)
1111111000110000IiiiZzzzYyyyXxxx macc -= [r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`]
1111111001000000IiiiZzzzYyyyXxxx macc = h[r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`]
1111111001100000IiiiZzzzYyyyXxxx macc += h[r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`]
1111111001110000IiiiZzzzYyyyXxxx macc -= h[r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`]
1111111010000000IiiiZzzzYyyyXxxx macc = [r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (s)
1111111010100000IiiiZzzzYyyyXxxx macc += [r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (s)
1111111010110000IiiiZzzzYyyyXxxx macc -= [r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (s)
1111111011000000IiiiZzzzYyyyXxxx macc = h[r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (s)
1111111011100000IiiiZzzzYyyyXxxx macc += h[r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (s)
1111111011110000IiiiZzzzYyyyXxxx macc -= h[r`Yyyy` ++= r`Iiii`] * [r`Xxxx` ++= r`Zzzz`] (s)
========-------========--------========--------========
111111110000BbbbbbAaaaaaYyyyXxxx macc = [r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`]
111111110010BbbbbbAaaaaaYyyyXxxx macc += [r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`]
111111110011BbbbbbAaaaaaYyyyXxxx macc -= [r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`]
111111110100BbbbbbAaaaaaYyyyXxxx macc = h[r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`]
111111110110BbbbbbAaaaaaYyyyXxxx macc += h[r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`]
111111110111BbbbbbAaaaaaYyyyXxxx macc -= h[r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`]
111111111000BbbbbbAaaaaaYyyyXxxx macc = [r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`] (s)
111111111010BbbbbbAaaaaaYyyyXxxx macc += [r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`] (s)
111111111011BbbbbbAaaaaaYyyyXxxx macc -= [r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`] (s)
111111111100BbbbbbAaaaaaYyyyXxxx macc = h[r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`] (s)
111111111110BbbbbbAaaaaaYyyyXxxx macc += h[r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`] (s)
111111111111BbbbbbAaaaaaYyyyXxxx macc -= h[r`Yyyy` ++= s`Bbbbbb00`] * [r`Xxxx` ++= s`Aaaaaa00`] (s)
............0000Aaaaaaaa........ `Aaaaaaaa`
............0001Aaaaaaaa........ `Aaaaaaaa00000000Aaaaaaaa`
............0010Aaaaaaaa........ `Aaaaaaaa00000000Aaaaaaaa00000000`
............0011Aaaaaaaa........ `AaaaaaaaAaaaaaaaAaaaaaaaAaaaaaaa`
............01000Aaaaaaa........ `1Aaaaaaa000000000000000000000000`
............01001Aaaaaaa........ `1Aaaaaaa00000000000000000000000`
............01010Aaaaaaa........ `1Aaaaaaa0000000000000000000000`
............01011Aaaaaaa........ `1Aaaaaaa000000000000000000000`
............01100Aaaaaaa........ `1Aaaaaaa00000000000000000000`
............01101Aaaaaaa........ `1Aaaaaaa0000000000000000000`
............01110Aaaaaaa........ `1Aaaaaaa000000000000000000`
............01111Aaaaaaa........ `1Aaaaaaa00000000000000000`
............10000Aaaaaaa........ `1Aaaaaaa0000000000000000`
............10001Aaaaaaa........ `1Aaaaaaa000000000000000`
............10010Aaaaaaa........ `1Aaaaaaa00000000000000`
............10011Aaaaaaa........ `1Aaaaaaa0000000000000`
............10100Aaaaaaa........ `1Aaaaaaa000000000000`
............10101Aaaaaaa........ `1Aaaaaaa00000000000`
............10110Aaaaaaa........ `1Aaaaaaa0000000000`
............10111Aaaaaaa........ `1Aaaaaaa000000000`
............11000Aaaaaaa........ `1Aaaaaaa00000000`
............11001Aaaaaaa........ `1Aaaaaaa0000000`
............11010Aaaaaaa........ `1Aaaaaaa000000`
............11011Aaaaaaa........ `1Aaaaaaa00000`
............11100Aaaaaaa........ `1Aaaaaaa0000`
............11101Aaaaaaa........ `1Aaaaaaa000`
............11110Aaaaaaa........ `1Aaaaaaa00`
............11111Aaaaaaa........ `1Aaaaaaa0`
As the pi32 is based on Blackfin, it inherited its arithmetic syntax instead of the usual mnemonic syntax. However, older versions of the pi32 toolchain indeed used the mnemonic syntax (or at least the objdump outputted it), so the table below lists the current arithmetic syntax and the corresponding instruction in mnemocode.
Arithmetic | Mnemonic (old pi32 toolchain) |
---|---|
nop |
nop |
bkpt |
n/a |
hbkpt |
n/a |
macc = 0 |
clrmacc |
csync |
?? |
ssync |
?? |
illeg |
?? |
lockset |
?? |
lockclr |
?? |
idle |
idle |
rts |
rts |
rti |
rti |
rte |
n/a |
cli |
cli |
cli rA |
cli rA |
sti |
sti |
sti rA |
sti rA |
swi imm6 |
swi imm6 |
excpt imm6 |
n/a |
rep size, rA { <size> iwords } |
rep size, rA |
flush [rA] |
flush rA |
flushinv [rA] |
flushinv rA |
iflush [rA] |
iflush rA |
pfetch [rA] |
pfetch rA |
goto rA |
j rA |
call rA |
call rA |
tbb [rA] |
tbb rA |
tbh [rA] |
tbh rA |
rep size, count { <size> iwords } |
rep size, count |
… | … |
call label |
call label |
macc /= rA |
?? |
macc /= rA (s) |
?? |
rA = rB |
mov rA, rB |
macc = rA * rB |
?? |
macc = rA * rB (s) |
?? |
macc += rA * rB |
?? |
macc -= rA * rB |
?? |
macc += rA * rB (s) |
?? |
macc -= rA * rB (s) |
?? |
goto label |
j label |
… | … |
if (rA == 0) goto label |
jz rA, label |
if (rA != 0) goto label |
jnz rA, label |
rA = [addr(offset)] |
lw rA, offset |
{r0-r7} = [rA++] |
lm {r0-r7}, rA |
[rA++] = {r0-r7} |
sm {r0-r7}, rA |
rA = [sp + offset] |
lw rA, sp, offset |
rA = [rB + offset] |
lw rA, rB, offset |
rA = h[rB + offset] |
lhz rA, rB, offset |
rA = b[rB + offset] |
lbz rA, rB, offset |
[sp + offset] = rA |
sw rA, sp, offset |
[rB + offset] = rA |
sw rA, rB, offset |
h[rB + offset] = rA |
sh rA, rB, offset |
b[rB + offset] = rA |
sb rA, rB, offset |
rA = signedimm |
movs rA, signedimm |
rA += signedimm |
add rA, signedimm |
rA = sp + signedimm |
add rA, sp, signedimm |
cmp rA, signedimm |
cmp rA, signedimm |
rA = rB << shamt |
lsl rA, rB, shamt |
rA = rB >> shamt |
lsr rA, rB, shamt |
rA = rB <<< shamt |
qasl rA, rB, shamt |
rA = rB >>> shamt |
qasr rA, rB, shamt |
{pc, r14-r4 / r3-r0} = [sp++] |
pop {pc, r14-r4 / r3-r0} |
[--sp] = {rets, r14-r4 / r3-r0} |
push {rets, r14-r4 / r3-r0} |
testset b[rA] |
n/a |
{sfr7-0} = [sp++] |
pops {sfr7-0} |
[--sp] = {sfr7-0} |
pushs {sfr7-0} |
sfrA = rB |
mov sfrA, rB |
rA = sfrB |
mov rA, sfrB |
rA = rB.b |
uxtb rA, rB |
rA = rB.l |
uxth rA, rB |
rA = rB.b (s) |
sxtb rA, rB |
rA = rB.l (s) |
sxth rA, rB |
rA += rB (brev) |
addrev rA, rB |
rA += rB |
add rA, rB |
cmn rB, rA |
same? |
sp += signedimm |
add sp, signedimm |
cmp rB, rA |
same? |
rA <<= rB |
lsl rA, rB |
rA >>= rB |
lsr rA, rB |
rA <<<= rB |
qasl rA, rB |
rA >>>= rB |
qasr rA, rB |
rA = rB + signedimm |
add rA, rB, signedimm |
rA = rB + rC |
add rA, rB, rC |
rA = rB - rC |
sub rA, rB, rC |
rA \|= (1<<bit) |
bitset rA, bit |
rA ^= (1<<bit) |
bittgl rA, bit |
rA \|= rB |
or rA, rB |
rA ^= rB |
xor rA, rB |
rA &= rB |
and rA, rB |
rA = ~rB |
not rA, rB |
rA &= ~(1<<bit) |
bitclr rA, bit |
rA += rB + c |
addc rA, rB |
rA -= rB + !c |
subc rA, rB |
rA = -rB |
neg rA, rB |
macc <<= shamt |
lslmacc shamt |
rA <>= rB |
rotr rA, rB |
rA <c>= rB |
rotrc rA, rB |
macc <<= rA |
lslmacc rA |
macc >>= rA |
lsrmacc rA |
macc >>>= rA |
asrmacc rA |
macc >>= shamt |
lsrmacc shamt |
macc >>>= shamt |
asrmacc shamt |
TODO | TODO |