# A32 conditional instructions # # Copyright (c) 2019 Linaro, Ltd # # 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 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 . # # This file is processed by scripts/decodetree.py # # All of the insn that have a COND field in insn[31:28] are here. # All insns that have 0xf in insn[31:28] are in a32-uncond.decode. # &empty &s_rrr_shi s rd rn rm shim shty &s_rrr_shr s rn rd rm rs shty &s_rri_rot s rn rd imm rot &s_rrrr s rd rn rm ra &rrrr rd rn rm ra &rrr rd rn rm &rr rd rm &ri rd imm &r rm &i imm &msr_reg rn r mask &mrs_reg rd r &msr_bank rn r sysm &mrs_bank rd r sysm &ldst_rr p w u rn rt rm shimm shtype &ldst_ri p w u rn rt imm &strex rn rd rt rt2 imm &ldrex rn rt rt2 imm &bfx rd rn lsb widthm1 &bfi rd rn lsb msb # Data-processing (register) @s_rrr_shi ---- ... .... s:1 rn:4 rd:4 shim:5 shty:2 . rm:4 \ &s_rrr_shi @s_rxr_shi ---- ... .... s:1 .... rd:4 shim:5 shty:2 . rm:4 \ &s_rrr_shi rn=0 @S_xrr_shi ---- ... .... . rn:4 .... shim:5 shty:2 . rm:4 \ &s_rrr_shi s=1 rd=0 AND_rrri .... 000 0000 . .... .... ..... .. 0 .... @s_rrr_shi EOR_rrri .... 000 0001 . .... .... ..... .. 0 .... @s_rrr_shi SUB_rrri .... 000 0010 . .... .... ..... .. 0 .... @s_rrr_shi RSB_rrri .... 000 0011 . .... .... ..... .. 0 .... @s_rrr_shi ADD_rrri .... 000 0100 . .... .... ..... .. 0 .... @s_rrr_shi ADC_rrri .... 000 0101 . .... .... ..... .. 0 .... @s_rrr_shi SBC_rrri .... 000 0110 . .... .... ..... .. 0 .... @s_rrr_shi RSC_rrri .... 000 0111 . .... .... ..... .. 0 .... @s_rrr_shi TST_xrri .... 000 1000 1 .... 0000 ..... .. 0 .... @S_xrr_shi TEQ_xrri .... 000 1001 1 .... 0000 ..... .. 0 .... @S_xrr_shi CMP_xrri .... 000 1010 1 .... 0000 ..... .. 0 .... @S_xrr_shi CMN_xrri .... 000 1011 1 .... 0000 ..... .. 0 .... @S_xrr_shi ORR_rrri .... 000 1100 . .... .... ..... .. 0 .... @s_rrr_shi MOV_rxri .... 000 1101 . 0000 .... ..... .. 0 .... @s_rxr_shi BIC_rrri .... 000 1110 . .... .... ..... .. 0 .... @s_rrr_shi MVN_rxri .... 000 1111 . 0000 .... ..... .. 0 .... @s_rxr_shi # Data-processing (register-shifted register) @s_rrr_shr ---- ... .... s:1 rn:4 rd:4 rs:4 . shty:2 . rm:4 \ &s_rrr_shr @s_rxr_shr ---- ... .... s:1 .... rd:4 rs:4 . shty:2 . rm:4 \ &s_rrr_shr rn=0 @S_xrr_shr ---- ... .... . rn:4 .... rs:4 . shty:2 . rm:4 \ &s_rrr_shr rd=0 s=1 AND_rrrr .... 000 0000 . .... .... .... 0 .. 1 .... @s_rrr_shr EOR_rrrr .... 000 0001 . .... .... .... 0 .. 1 .... @s_rrr_shr SUB_rrrr .... 000 0010 . .... .... .... 0 .. 1 .... @s_rrr_shr RSB_rrrr .... 000 0011 . .... .... .... 0 .. 1 .... @s_rrr_shr ADD_rrrr .... 000 0100 . .... .... .... 0 .. 1 .... @s_rrr_shr ADC_rrrr .... 000 0101 . .... .... .... 0 .. 1 .... @s_rrr_shr SBC_rrrr .... 000 0110 . .... .... .... 0 .. 1 .... @s_rrr_shr RSC_rrrr .... 000 0111 . .... .... .... 0 .. 1 .... @s_rrr_shr TST_xrrr .... 000 1000 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr TEQ_xrrr .... 000 1001 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr CMP_xrrr .... 000 1010 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr CMN_xrrr .... 000 1011 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr ORR_rrrr .... 000 1100 . .... .... .... 0 .. 1 .... @s_rrr_shr MOV_rxrr .... 000 1101 . 0000 .... .... 0 .. 1 .... @s_rxr_shr BIC_rrrr .... 000 1110 . .... .... .... 0 .. 1 .... @s_rrr_shr MVN_rxrr .... 000 1111 . 0000 .... .... 0 .. 1 .... @s_rxr_shr # Data-processing (immediate) %a32extrot 8:4 !function=times_2 @s_rri_rot ---- ... .... s:1 rn:4 rd:4 .... imm:8 \ &s_rri_rot rot=%a32extrot @s_rxi_rot ---- ... .... s:1 .... rd:4 .... imm:8 \ &s_rri_rot rot=%a32extrot rn=0 @S_xri_rot ---- ... .... . rn:4 .... .... imm:8 \ &s_rri_rot rot=%a32extrot rd=0 s=1 AND_rri .... 001 0000 . .... .... ............ @s_rri_rot EOR_rri .... 001 0001 . .... .... ............ @s_rri_rot SUB_rri .... 001 0010 . .... .... ............ @s_rri_rot RSB_rri .... 001 0011 . .... .... ............ @s_rri_rot ADD_rri .... 001 0100 . .... .... ............ @s_rri_rot ADC_rri .... 001 0101 . .... .... ............ @s_rri_rot SBC_rri .... 001 0110 . .... .... ............ @s_rri_rot RSC_rri .... 001 0111 . .... .... ............ @s_rri_rot TST_xri .... 001 1000 1 .... 0000 ............ @S_xri_rot TEQ_xri .... 001 1001 1 .... 0000 ............ @S_xri_rot CMP_xri .... 001 1010 1 .... 0000 ............ @S_xri_rot CMN_xri .... 001 1011 1 .... 0000 ............ @S_xri_rot ORR_rri .... 001 1100 . .... .... ............ @s_rri_rot MOV_rxi .... 001 1101 . 0000 .... ............ @s_rxi_rot BIC_rri .... 001 1110 . .... .... ............ @s_rri_rot MVN_rxi .... 001 1111 . 0000 .... ............ @s_rxi_rot # Multiply and multiply accumulate @s_rdamn ---- .... ... s:1 rd:4 ra:4 rm:4 .... rn:4 &s_rrrr @s_rd0mn ---- .... ... s:1 rd:4 .... rm:4 .... rn:4 &s_rrrr ra=0 @rdamn ---- .... ... . rd:4 ra:4 rm:4 .... rn:4 &rrrr @rd0mn ---- .... ... . rd:4 .... rm:4 .... rn:4 &rrrr ra=0 MUL .... 0000 000 . .... 0000 .... 1001 .... @s_rd0mn MLA .... 0000 001 . .... .... .... 1001 .... @s_rdamn UMAAL .... 0000 010 0 .... .... .... 1001 .... @rdamn MLS .... 0000 011 0 .... .... .... 1001 .... @rdamn UMULL .... 0000 100 . .... .... .... 1001 .... @s_rdamn UMLAL .... 0000 101 . .... .... .... 1001 .... @s_rdamn SMULL .... 0000 110 . .... .... .... 1001 .... @s_rdamn SMLAL .... 0000 111 . .... .... .... 1001 .... @s_rdamn # Saturating addition and subtraction @rndm ---- .... .... rn:4 rd:4 .... .... rm:4 &rrr QADD .... 0001 0000 .... .... 0000 0101 .... @rndm QSUB .... 0001 0010 .... .... 0000 0101 .... @rndm QDADD .... 0001 0100 .... .... 0000 0101 .... @rndm QDSUB .... 0001 0110 .... .... 0000 0101 .... @rndm # Halfword multiply and multiply accumulate SMLABB .... 0001 0000 .... .... .... 1000 .... @rdamn SMLABT .... 0001 0000 .... .... .... 1100 .... @rdamn SMLATB .... 0001 0000 .... .... .... 1010 .... @rdamn SMLATT .... 0001 0000 .... .... .... 1110 .... @rdamn SMLAWB .... 0001 0010 .... .... .... 1000 .... @rdamn SMULWB .... 0001 0010 .... 0000 .... 1010 .... @rd0mn SMLAWT .... 0001 0010 .... .... .... 1100 .... @rdamn SMULWT .... 0001 0010 .... 0000 .... 1110 .... @rd0mn SMLALBB .... 0001 0100 .... .... .... 1000 .... @rdamn SMLALBT .... 0001 0100 .... .... .... 1100 .... @rdamn SMLALTB .... 0001 0100 .... .... .... 1010 .... @rdamn SMLALTT .... 0001 0100 .... .... .... 1110 .... @rdamn SMULBB .... 0001 0110 .... 0000 .... 1000 .... @rd0mn SMULBT .... 0001 0110 .... 0000 .... 1100 .... @rd0mn SMULTB .... 0001 0110 .... 0000 .... 1010 .... @rd0mn SMULTT .... 0001 0110 .... 0000 .... 1110 .... @rd0mn # MSR (immediate) and hints &msr_i r mask rot imm @msr_i ---- .... .... mask:4 .... rot:4 imm:8 &msr_i { { YIELD ---- 0011 0010 0000 1111 ---- 0000 0001 WFE ---- 0011 0010 0000 1111 ---- 0000 0010 WFI ---- 0011 0010 0000 1111 ---- 0000 0011 # TODO: Implement SEV, SEVL; may help SMP performance. # SEV ---- 0011 0010 0000 1111 ---- 0000 0100 # SEVL ---- 0011 0010 0000 1111 ---- 0000 0101 # The canonical nop ends in 00000000, but the whole of the # rest of the space executes as nop if otherwise unsupported. NOP ---- 0011 0010 0000 1111 ---- ---- ---- } # Note mask = 0 is covered by NOP MSR_imm .... 0011 0010 .... 1111 .... .... .... @msr_i r=0 } MSR_imm .... 0011 0110 .... 1111 .... .... .... @msr_i r=1 # Cyclic Redundancy Check CRC32B .... 0001 0000 .... .... 0000 0100 .... @rndm CRC32H .... 0001 0010 .... .... 0000 0100 .... @rndm CRC32W .... 0001 0100 .... .... 0000 0100 .... @rndm CRC32CB .... 0001 0000 .... .... 0010 0100 .... @rndm CRC32CH .... 0001 0010 .... .... 0010 0100 .... @rndm CRC32CW .... 0001 0100 .... .... 0010 0100 .... @rndm # Miscellaneous instructions %sysm 8:1 16:4 %imm16_8_0 8:12 0:4 @rm ---- .... .... .... .... .... .... rm:4 &r @rdm ---- .... .... .... rd:4 .... .... rm:4 &rr @i16 ---- .... .... .... .... .... .... .... &i imm=%imm16_8_0 MRS_bank ---- 0001 0 r:1 00 .... rd:4 001. 0000 0000 &mrs_bank %sysm MSR_bank ---- 0001 0 r:1 10 .... 1111 001. 0000 rn:4 &msr_bank %sysm MRS_reg ---- 0001 0 r:1 00 1111 rd:4 0000 0000 0000 &mrs_reg MSR_reg ---- 0001 0 r:1 10 mask:4 1111 0000 0000 rn:4 &msr_reg BX .... 0001 0010 1111 1111 1111 0001 .... @rm BXJ .... 0001 0010 1111 1111 1111 0010 .... @rm BLX_r .... 0001 0010 1111 1111 1111 0011 .... @rm CLZ .... 0001 0110 1111 .... 1111 0001 .... @rdm ERET ---- 0001 0110 0000 0000 0000 0110 1110 HLT .... 0001 0000 .... .... .... 0111 .... @i16 BKPT .... 0001 0010 .... .... .... 0111 .... @i16 HVC .... 0001 0100 .... .... .... 0111 .... @i16 SMC ---- 0001 0110 0000 0000 0000 0111 imm:4 &i # Load/Store Dual, Half, Signed Byte (register) @ldst_rr_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... rm:4 \ &ldst_rr p=1 shimm=0 shtype=0 @ldst_rr_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 .... .... rm:4 \ &ldst_rr p=0 w=0 shimm=0 shtype=0 STRH_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_pw0 STRH_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_p1w LDRD_rr .... 000. .0.0 .... .... 0000 1101 .... @ldst_rr_pw0 LDRD_rr .... 000. .0.0 .... .... 0000 1101 .... @ldst_rr_p1w STRD_rr .... 000. .0.0 .... .... 0000 1111 .... @ldst_rr_pw0 STRD_rr .... 000. .0.0 .... .... 0000 1111 .... @ldst_rr_p1w LDRH_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_pw0 LDRH_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_p1w LDRSB_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_pw0 LDRSB_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_p1w LDRSH_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_pw0 LDRSH_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_p1w # Note the unpriv load/stores use the previously invalid P=0, W=1 encoding, # and act as normal post-indexed (P=0, W=0). @ldst_rr_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 .... .... rm:4 \ &ldst_rr p=0 w=0 shimm=0 shtype=0 STRHT_rr .... 000. .0.0 .... .... 0000 1011 .... @ldst_rr_p0w1 LDRHT_rr .... 000. .0.1 .... .... 0000 1011 .... @ldst_rr_p0w1 LDRSBT_rr .... 000. .0.1 .... .... 0000 1101 .... @ldst_rr_p0w1 LDRSHT_rr .... 000. .0.1 .... .... 0000 1111 .... @ldst_rr_p0w1 # Load/Store word and unsigned byte (register) @ldst_rs_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ &ldst_rr p=1 @ldst_rs_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ &ldst_rr p=0 w=0 STR_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_pw0 STR_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_p1w STRB_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_pw0 STRB_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_p1w LDR_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_pw0 LDR_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_p1w LDRB_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_pw0 LDRB_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_p1w @ldst_rs_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \ &ldst_rr p=0 w=0 STRT_rr .... 011. .0.0 .... .... .... ...0 .... @ldst_rs_p0w1 STRBT_rr .... 011. .1.0 .... .... .... ...0 .... @ldst_rs_p0w1 LDRT_rr .... 011. .0.1 .... .... .... ...0 .... @ldst_rs_p0w1 LDRBT_rr .... 011. .1.1 .... .... .... ...0 .... @ldst_rs_p0w1 # Load/Store Dual, Half, Signed Byte (immediate) %imm8s_8_0 8:4 0:4 @ldst_ri8_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... .... \ &ldst_ri imm=%imm8s_8_0 p=1 @ldst_ri8_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 .... .... .... \ &ldst_ri imm=%imm8s_8_0 p=0 w=0 STRH_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_pw0 STRH_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_p1w LDRD_ri_a32 .... 000. .1.0 .... .... .... 1101 .... @ldst_ri8_pw0 LDRD_ri_a32 .... 000. .1.0 .... .... .... 1101 .... @ldst_ri8_p1w STRD_ri_a32 .... 000. .1.0 .... .... .... 1111 .... @ldst_ri8_pw0 STRD_ri_a32 .... 000. .1.0 .... .... .... 1111 .... @ldst_ri8_p1w LDRH_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_pw0 LDRH_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_p1w LDRSB_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_pw0 LDRSB_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_p1w LDRSH_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_pw0 LDRSH_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_p1w # Note the unpriv load/stores use the previously invalid P=0, W=1 encoding, # and act as normal post-indexed (P=0, W=0). @ldst_ri8_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 .... .... .... \ &ldst_ri imm=%imm8s_8_0 p=0 w=0 STRHT_ri .... 000. .1.0 .... .... .... 1011 .... @ldst_ri8_p0w1 LDRHT_ri .... 000. .1.1 .... .... .... 1011 .... @ldst_ri8_p0w1 LDRSBT_ri .... 000. .1.1 .... .... .... 1101 .... @ldst_ri8_p0w1 LDRSHT_ri .... 000. .1.1 .... .... .... 1111 .... @ldst_ri8_p0w1 # Load/Store word and unsigned byte (immediate) @ldst_ri12_p1w ---- ...1 u:1 . w:1 . rn:4 rt:4 imm:12 &ldst_ri p=1 @ldst_ri12_pw0 ---- ...0 u:1 . 0 . rn:4 rt:4 imm:12 &ldst_ri p=0 w=0 STR_ri .... 010. .0.0 .... .... ............ @ldst_ri12_p1w STR_ri .... 010. .0.0 .... .... ............ @ldst_ri12_pw0 STRB_ri .... 010. .1.0 .... .... ............ @ldst_ri12_p1w STRB_ri .... 010. .1.0 .... .... ............ @ldst_ri12_pw0 LDR_ri .... 010. .0.1 .... .... ............ @ldst_ri12_p1w LDR_ri .... 010. .0.1 .... .... ............ @ldst_ri12_pw0 LDRB_ri .... 010. .1.1 .... .... ............ @ldst_ri12_p1w LDRB_ri .... 010. .1.1 .... .... ............ @ldst_ri12_pw0 @ldst_ri12_p0w1 ---- ...0 u:1 . 1 . rn:4 rt:4 imm:12 &ldst_ri p=0 w=0 STRT_ri .... 010. .0.0 .... .... ............ @ldst_ri12_p0w1 STRBT_ri .... 010. .1.0 .... .... ............ @ldst_ri12_p0w1 LDRT_ri .... 010. .0.1 .... .... ............ @ldst_ri12_p0w1 LDRBT_ri .... 010. .1.1 .... .... ............ @ldst_ri12_p0w1 # Synchronization primitives @swp ---- .... .... rn:4 rt:4 .... .... rt2:4 SWP .... 0001 0000 .... .... 0000 1001 .... @swp SWPB .... 0001 0100 .... .... 0000 1001 .... @swp # Load/Store Exclusive and Load-Acquire/Store-Release # # Note rt2 for STREXD/LDREXD is set by the helper after checking rt is even. @strex ---- .... .... rn:4 rd:4 .... .... rt:4 \ &strex imm=0 rt2=15 @ldrex ---- .... .... rn:4 rt:4 .... .... .... \ &ldrex imm=0 rt2=15 @stl ---- .... .... rn:4 .... .... .... rt:4 \ &ldrex imm=0 rt2=15 STREX .... 0001 1000 .... .... 1111 1001 .... @strex STREXD_a32 .... 0001 1010 .... .... 1111 1001 .... @strex STREXB .... 0001 1100 .... .... 1111 1001 .... @strex STREXH .... 0001 1110 .... .... 1111 1001 .... @strex STLEX .... 0001 1000 .... .... 1110 1001 .... @strex STLEXD_a32 .... 0001 1010 .... .... 1110 1001 .... @strex STLEXB .... 0001 1100 .... .... 1110 1001 .... @strex STLEXH .... 0001 1110 .... .... 1110 1001 .... @strex STL .... 0001 1000 .... 1111 1100 1001 .... @stl STLB .... 0001 1100 .... 1111 1100 1001 .... @stl STLH .... 0001 1110 .... 1111 1100 1001 .... @stl LDREX .... 0001 1001 .... .... 1111 1001 1111 @ldrex LDREXD_a32 .... 0001 1011 .... .... 1111 1001 1111 @ldrex LDREXB .... 0001 1101 .... .... 1111 1001 1111 @ldrex LDREXH .... 0001 1111 .... .... 1111 1001 1111 @ldrex LDAEX .... 0001 1001 .... .... 1110 1001 1111 @ldrex LDAEXD_a32 .... 0001 1011 .... .... 1110 1001 1111 @ldrex LDAEXB .... 0001 1101 .... .... 1110 1001 1111 @ldrex LDAEXH .... 0001 1111 .... .... 1110 1001 1111 @ldrex LDA .... 0001 1001 .... .... 1100 1001 1111 @ldrex LDAB .... 0001 1101 .... .... 1100 1001 1111 @ldrex LDAH .... 0001 1111 .... .... 1100 1001 1111 @ldrex # Media instructions # usad8 is usada8 w/ ra=15 USADA8 ---- 0111 1000 rd:4 ra:4 rm:4 0001 rn:4 # ubfx and sbfx @bfx ---- .... ... widthm1:5 rd:4 lsb:5 ... rn:4 &bfx SBFX .... 0111 101 ..... .... ..... 101 .... @bfx UBFX .... 0111 111 ..... .... ..... 101 .... @bfx # bfc is bfi w/ rn=15 BFCI ---- 0111 110 msb:5 rd:4 lsb:5 001 rn:4 &bfi # While we could get UDEF by not including this, add the pattern for # documentation and to conflict with any other typos in this file. UDF 1110 0111 1111 ---- ---- ---- 1111 ----