# 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 &msr_reg rn r mask &mrs_reg rd r &msr_bank rn r sysm &mrs_bank rd r sysm # 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 # Miscellaneous instructions %sysm 8:1 16:4 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