# # MicroBlaze instruction decode definitions. # # Copyright (c) 2020 Richard Henderson # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, see . # &typea0 rd ra &typea rd ra rb &typea_br rd rb &typea_bc ra rb &typeb rd ra imm &typeb_br rd imm &typeb_bc ra imm &type_msr rd imm # Include any IMM prefix in the value reported. %extimm 0:s16 !function=typeb_imm @typea ...... rd:5 ra:5 rb:5 ... .... .... &typea @typeb ...... rd:5 ra:5 ................ &typeb imm=%extimm # Officially typea, but with rb==0, which is not used. @typea0 ...... rd:5 ra:5 ................ &typea0 # Officially typea, but with ra as opcode. @typea_br ...... rd:5 ..... rb:5 ........... &typea_br # Officially typea, but with rd as opcode. @typea_bc ...... ..... ra:5 rb:5 ........... &typea_bc # Officially typeb, but any immediate extension is unused. @typeb_bs ...... rd:5 ra:5 ..... ...... imm:5 &typeb # Officially typeb, but with ra as opcode. @typeb_br ...... rd:5 ..... ................ &typeb_br imm=%extimm # Officially typeb, but with rd as opcode. @typeb_bc ...... ..... ra:5 ................ &typeb_bc imm=%extimm # For convenience, extract the two imm_w/imm_s fields, then pack # them back together as "imm". Doing this makes it easiest to # match the required zero at bit 5. %ieimm 6:5 0:5 @typeb_ie ...... rd:5 ra:5 ..... ..... . ..... &typeb imm=%ieimm @type_msr ...... rd:5 ...... imm:15 &type_msr ### { zero 000000 00000 00000 00000 000 0000 0000 add 000000 ..... ..... ..... 000 0000 0000 @typea } addc 000010 ..... ..... ..... 000 0000 0000 @typea addk 000100 ..... ..... ..... 000 0000 0000 @typea addkc 000110 ..... ..... ..... 000 0000 0000 @typea addi 001000 ..... ..... ................ @typeb addic 001010 ..... ..... ................ @typeb addik 001100 ..... ..... ................ @typeb addikc 001110 ..... ..... ................ @typeb and 100001 ..... ..... ..... 000 0000 0000 @typea andi 101001 ..... ..... ................ @typeb andn 100011 ..... ..... ..... 000 0000 0000 @typea andni 101011 ..... ..... ................ @typeb beq 100111 00000 ..... ..... 000 0000 0000 @typea_bc bge 100111 00101 ..... ..... 000 0000 0000 @typea_bc bgt 100111 00100 ..... ..... 000 0000 0000 @typea_bc ble 100111 00011 ..... ..... 000 0000 0000 @typea_bc blt 100111 00010 ..... ..... 000 0000 0000 @typea_bc bne 100111 00001 ..... ..... 000 0000 0000 @typea_bc beqd 100111 10000 ..... ..... 000 0000 0000 @typea_bc bged 100111 10101 ..... ..... 000 0000 0000 @typea_bc bgtd 100111 10100 ..... ..... 000 0000 0000 @typea_bc bled 100111 10011 ..... ..... 000 0000 0000 @typea_bc bltd 100111 10010 ..... ..... 000 0000 0000 @typea_bc bned 100111 10001 ..... ..... 000 0000 0000 @typea_bc beqi 101111 00000 ..... ................ @typeb_bc bgei 101111 00101 ..... ................ @typeb_bc bgti 101111 00100 ..... ................ @typeb_bc blei 101111 00011 ..... ................ @typeb_bc blti 101111 00010 ..... ................ @typeb_bc bnei 101111 00001 ..... ................ @typeb_bc beqid 101111 10000 ..... ................ @typeb_bc bgeid 101111 10101 ..... ................ @typeb_bc bgtid 101111 10100 ..... ................ @typeb_bc bleid 101111 10011 ..... ................ @typeb_bc bltid 101111 10010 ..... ................ @typeb_bc bneid 101111 10001 ..... ................ @typeb_bc br 100110 ..... 00000 ..... 000 0000 0000 @typea_br bra 100110 ..... 01000 ..... 000 0000 0000 @typea_br brd 100110 ..... 10000 ..... 000 0000 0000 @typea_br brad 100110 ..... 11000 ..... 000 0000 0000 @typea_br brld 100110 ..... 10100 ..... 000 0000 0000 @typea_br brald 100110 ..... 11100 ..... 000 0000 0000 @typea_br bri 101110 ..... 00000 ................ @typeb_br brai 101110 ..... 01000 ................ @typeb_br brid 101110 ..... 10000 ................ @typeb_br braid 101110 ..... 11000 ................ @typeb_br brlid 101110 ..... 10100 ................ @typeb_br bralid 101110 ..... 11100 ................ @typeb_br brk 100110 ..... 01100 ..... 000 0000 0000 @typea_br brki 101110 ..... 01100 ................ @typeb_br bsrl 010001 ..... ..... ..... 000 0000 0000 @typea bsra 010001 ..... ..... ..... 010 0000 0000 @typea bsll 010001 ..... ..... ..... 100 0000 0000 @typea bsrli 011001 ..... ..... 00000 000000 ..... @typeb_bs bsrai 011001 ..... ..... 00000 010000 ..... @typeb_bs bslli 011001 ..... ..... 00000 100000 ..... @typeb_bs bsefi 011001 ..... ..... 01000 .....0 ..... @typeb_ie bsifi 011001 ..... ..... 10000 .....0 ..... @typeb_ie clz 100100 ..... ..... 00000 000 1110 0000 @typea0 cmp 000101 ..... ..... ..... 000 0000 0001 @typea cmpu 000101 ..... ..... ..... 000 0000 0011 @typea fadd 010110 ..... ..... ..... 0000 000 0000 @typea frsub 010110 ..... ..... ..... 0001 000 0000 @typea fmul 010110 ..... ..... ..... 0010 000 0000 @typea fdiv 010110 ..... ..... ..... 0011 000 0000 @typea fcmp_un 010110 ..... ..... ..... 0100 000 0000 @typea fcmp_lt 010110 ..... ..... ..... 0100 001 0000 @typea fcmp_eq 010110 ..... ..... ..... 0100 010 0000 @typea fcmp_le 010110 ..... ..... ..... 0100 011 0000 @typea fcmp_gt 010110 ..... ..... ..... 0100 100 0000 @typea fcmp_ne 010110 ..... ..... ..... 0100 101 0000 @typea fcmp_ge 010110 ..... ..... ..... 0100 110 0000 @typea # Note that flt and fint, unlike fsqrt, are documented as having the RB # operand which is unused. So allow the field to be non-zero but discard # the value and treat as 2-operand insns. flt 010110 ..... ..... ----- 0101 000 0000 @typea0 fint 010110 ..... ..... ----- 0110 000 0000 @typea0 fsqrt 010110 ..... ..... 00000 0111 000 0000 @typea0 get 011011 rd:5 00000 0 ctrl:5 000000 imm:4 getd 010011 rd:5 00000 rb:5 0 ctrl:5 00000 idiv 010010 ..... ..... ..... 000 0000 0000 @typea idivu 010010 ..... ..... ..... 000 0000 0010 @typea imm 101100 00000 00000 imm:16 lbu 110000 ..... ..... ..... 0000 000 0000 @typea lbur 110000 ..... ..... ..... 0100 000 0000 @typea lbuea 110000 ..... ..... ..... 0001 000 0000 @typea lbui 111000 ..... ..... ................ @typeb lhu 110001 ..... ..... ..... 0000 000 0000 @typea lhur 110001 ..... ..... ..... 0100 000 0000 @typea lhuea 110001 ..... ..... ..... 0001 000 0000 @typea lhui 111001 ..... ..... ................ @typeb lw 110010 ..... ..... ..... 0000 000 0000 @typea lwr 110010 ..... ..... ..... 0100 000 0000 @typea lwea 110010 ..... ..... ..... 0001 000 0000 @typea lwx 110010 ..... ..... ..... 1000 000 0000 @typea lwi 111010 ..... ..... ................ @typeb mbar 101110 imm:5 00010 0000 0000 0000 0100 mfs 100101 rd:5 0 e:1 000 10 rs:14 mts 100101 0 e:1 000 ra:5 11 rs:14 msrclr 100101 ..... 100010 ............... @type_msr msrset 100101 ..... 100000 ............... @type_msr mul 010000 ..... ..... ..... 000 0000 0000 @typea mulh 010000 ..... ..... ..... 000 0000 0001 @typea mulhu 010000 ..... ..... ..... 000 0000 0011 @typea mulhsu 010000 ..... ..... ..... 000 0000 0010 @typea muli 011000 ..... ..... ................ @typeb or 100000 ..... ..... ..... 000 0000 0000 @typea ori 101000 ..... ..... ................ @typeb pcmpbf 100000 ..... ..... ..... 100 0000 0000 @typea pcmpeq 100010 ..... ..... ..... 100 0000 0000 @typea pcmpne 100011 ..... ..... ..... 100 0000 0000 @typea put 011011 00000 ra:5 1 ctrl:5 000000 imm:4 putd 010011 00000 ra:5 rb:5 1 ctrl:5 00000 rsub 000001 ..... ..... ..... 000 0000 0000 @typea rsubc 000011 ..... ..... ..... 000 0000 0000 @typea rsubk 000101 ..... ..... ..... 000 0000 0000 @typea rsubkc 000111 ..... ..... ..... 000 0000 0000 @typea rsubi 001001 ..... ..... ................ @typeb rsubic 001011 ..... ..... ................ @typeb rsubik 001101 ..... ..... ................ @typeb rsubikc 001111 ..... ..... ................ @typeb rtbd 101101 10010 ..... ................ @typeb_bc rtid 101101 10001 ..... ................ @typeb_bc rted 101101 10100 ..... ................ @typeb_bc rtsd 101101 10000 ..... ................ @typeb_bc sb 110100 ..... ..... ..... 0000 000 0000 @typea sbr 110100 ..... ..... ..... 0100 000 0000 @typea sbea 110100 ..... ..... ..... 0001 000 0000 @typea sbi 111100 ..... ..... ................ @typeb sh 110101 ..... ..... ..... 0000 000 0000 @typea shr 110101 ..... ..... ..... 0100 000 0000 @typea shea 110101 ..... ..... ..... 0001 000 0000 @typea shi 111101 ..... ..... ................ @typeb sw 110110 ..... ..... ..... 0000 000 0000 @typea swr 110110 ..... ..... ..... 0100 000 0000 @typea swea 110110 ..... ..... ..... 0001 000 0000 @typea swx 110110 ..... ..... ..... 1000 000 0000 @typea swi 111110 ..... ..... ................ @typeb sext8 100100 ..... ..... 00000 000 0110 0000 @typea0 sext16 100100 ..... ..... 00000 000 0110 0001 @typea0 sra 100100 ..... ..... 00000 000 0000 0001 @typea0 src 100100 ..... ..... 00000 000 0010 0001 @typea0 srl 100100 ..... ..... 00000 000 0100 0001 @typea0 swapb 100100 ..... ..... 00000 001 1110 0000 @typea0 swaph 100100 ..... ..... 00000 001 1110 0010 @typea0 # Cache operations have no effect in qemu: discard the arguments. wdic 100100 00000 ----- ----- -00 -11- 01-0 # wdc wdic 100100 00000 ----- ----- 000 0110 1000 # wic xor 100010 ..... ..... ..... 000 0000 0000 @typea xori 101010 ..... ..... ................ @typeb