qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

t32.decode (31953B)


      1 # Thumb2 instructions
      2 #
      3 #  Copyright (c) 2019 Linaro, Ltd
      4 #
      5 # This library is free software; you can redistribute it and/or
      6 # modify it under the terms of the GNU Lesser General Public
      7 # License as published by the Free Software Foundation; either
      8 # version 2.1 of the License, or (at your option) any later version.
      9 #
     10 # This library is distributed in the hope that it will be useful,
     11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13 # Lesser General Public License for more details.
     14 #
     15 # You should have received a copy of the GNU Lesser General Public
     16 # License along with this library; if not, see <http://www.gnu.org/licenses/>.
     17 
     18 #
     19 # This file is processed by scripts/decodetree.py
     20 #
     21 
     22 &empty           !extern
     23 &s_rrr_shi       !extern s rd rn rm shim shty
     24 &s_rrr_shr       !extern s rn rd rm rs shty
     25 &s_rri_rot       !extern s rn rd imm rot
     26 &s_rrrr          !extern s rd rn rm ra
     27 &rrrr            !extern rd rn rm ra
     28 &rrr_rot         !extern rd rn rm rot
     29 &rrr             !extern rd rn rm
     30 &rr              !extern rd rm
     31 &ri              !extern rd imm
     32 &r               !extern rm
     33 &i               !extern imm
     34 &msr_reg         !extern rn r mask
     35 &mrs_reg         !extern rd r
     36 &msr_bank        !extern rn r sysm
     37 &mrs_bank        !extern rd r sysm
     38 &ldst_rr         !extern p w u rn rt rm shimm shtype
     39 &ldst_ri         !extern p w u rn rt imm
     40 &ldst_block      !extern rn i b u w list
     41 &strex           !extern rn rd rt rt2 imm
     42 &ldrex           !extern rn rt rt2 imm
     43 &bfx             !extern rd rn lsb widthm1
     44 &bfi             !extern rd rn lsb msb
     45 &sat             !extern rd rn satimm imm sh
     46 &pkh             !extern rd rn rm imm tb
     47 &cps             !extern mode imod M A I F
     48 &mcr             !extern cp opc1 crn crm opc2 rt
     49 &mcrr            !extern cp opc1 crm rt rt2
     50 
     51 &mve_shl_ri      rdalo rdahi shim
     52 &mve_shl_rr      rdalo rdahi rm
     53 &mve_sh_ri       rda shim
     54 &mve_sh_rr       rda rm
     55 
     56 # rdahi: bits [3:1] from insn, bit 0 is 1
     57 # rdalo: bits [3:1] from insn, bit 0 is 0
     58 %rdahi_9 9:3 !function=times_2_plus_1
     59 %rdalo_17 17:3 !function=times_2
     60 
     61 # Data-processing (register)
     62 
     63 %imm5_12_6       12:3 6:2
     64 
     65 @s_rrr_shi       ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \
     66                  &s_rrr_shi shim=%imm5_12_6
     67 @s_rxr_shi       ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \
     68                  &s_rrr_shi shim=%imm5_12_6 rn=0
     69 @S_xrr_shi       ....... .... .   rn:4 .... .... .. shty:2 rm:4 \
     70                  &s_rrr_shi shim=%imm5_12_6 s=1 rd=0
     71 
     72 @mve_shl_ri      ....... .... . ... . . ... ... . .. .. .... \
     73                  &mve_shl_ri shim=%imm5_12_6 rdalo=%rdalo_17 rdahi=%rdahi_9
     74 @mve_shl_rr      ....... .... . ... . rm:4  ... . .. .. .... \
     75                  &mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9
     76 @mve_sh_ri       ....... .... . rda:4 . ... ... . .. .. .... \
     77                  &mve_sh_ri shim=%imm5_12_6
     78 @mve_sh_rr       ....... .... . rda:4 rm:4 .... .... .... &mve_sh_rr
     79 
     80 {
     81   TST_xrri       1110101 0000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
     82   AND_rrri       1110101 0000 . .... 0 ... .... .... ....     @s_rrr_shi
     83 }
     84 BIC_rrri         1110101 0001 . .... 0 ... .... .... ....     @s_rrr_shi
     85 {
     86   # The v8.1M MVE shift insns overlap in encoding with MOVS/ORRS
     87   # and are distinguished by having Rm==13 or 15. Those are UNPREDICTABLE
     88   # cases for MOVS/ORRS. We decode the MVE cases first, ensuring that
     89   # they explicitly call unallocated_encoding() for cases that must UNDEF
     90   # (eg "using a new shift insn on a v8.1M CPU without MVE"), and letting
     91   # the rest fall through (where ORR_rrri and MOV_rxri will end up
     92   # handling them as r13 and r15 accesses with the same semantics as A32).
     93   [
     94     {
     95       UQSHL_ri   1110101 0010 1 ....  0 ...  1111 .. 00 1111  @mve_sh_ri
     96       LSLL_ri    1110101 0010 1 ... 0 0 ... ... 1 .. 00 1111  @mve_shl_ri
     97       UQSHLL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 00 1111  @mve_shl_ri
     98     }
     99 
    100     {
    101       URSHR_ri   1110101 0010 1 ....  0 ...  1111 .. 01 1111  @mve_sh_ri
    102       LSRL_ri    1110101 0010 1 ... 0 0 ... ... 1 .. 01 1111  @mve_shl_ri
    103       URSHRL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 01 1111  @mve_shl_ri
    104     }
    105 
    106     {
    107       SRSHR_ri   1110101 0010 1 ....  0 ...  1111 .. 10 1111  @mve_sh_ri
    108       ASRL_ri    1110101 0010 1 ... 0 0 ... ... 1 .. 10 1111  @mve_shl_ri
    109       SRSHRL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 10 1111  @mve_shl_ri
    110     }
    111 
    112     {
    113       SQSHL_ri   1110101 0010 1 ....  0 ...  1111 .. 11 1111  @mve_sh_ri
    114       SQSHLL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 11 1111  @mve_shl_ri
    115     }
    116 
    117     {
    118       UQRSHL_rr    1110101 0010 1 ....  ....  1111 0000 1101  @mve_sh_rr
    119       LSLL_rr      1110101 0010 1 ... 0 .... ... 1 0000 1101  @mve_shl_rr
    120       UQRSHLL64_rr 1110101 0010 1 ... 1 .... ... 1 0000 1101  @mve_shl_rr
    121     }
    122 
    123     {
    124       SQRSHR_rr    1110101 0010 1 ....  ....  1111 0010 1101  @mve_sh_rr
    125       ASRL_rr      1110101 0010 1 ... 0 .... ... 1 0010 1101  @mve_shl_rr
    126       SQRSHRL64_rr 1110101 0010 1 ... 1 .... ... 1 0010 1101  @mve_shl_rr
    127     }
    128 
    129     UQRSHLL48_rr 1110101 0010 1 ... 1 ....  ... 1  1000 1101  @mve_shl_rr
    130     SQRSHRL48_rr 1110101 0010 1 ... 1 ....  ... 1  1010 1101  @mve_shl_rr
    131   ]
    132 
    133   MOV_rxri       1110101 0010 . 1111 0 ... .... .... ....     @s_rxr_shi
    134   ORR_rrri       1110101 0010 . .... 0 ... .... .... ....     @s_rrr_shi
    135 
    136   # v8.1M CSEL and friends
    137   CSEL           1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4
    138 }
    139 {
    140   MVN_rxri       1110101 0011 . 1111 0 ... .... .... ....     @s_rxr_shi
    141   ORN_rrri       1110101 0011 . .... 0 ... .... .... ....     @s_rrr_shi
    142 }
    143 {
    144   TEQ_xrri       1110101 0100 1 .... 0 ... 1111 .... ....     @S_xrr_shi
    145   EOR_rrri       1110101 0100 . .... 0 ... .... .... ....     @s_rrr_shi
    146 }
    147 PKH              1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
    148                  &pkh imm=%imm5_12_6
    149 {
    150   CMN_xrri       1110101 1000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
    151   ADD_rrri       1110101 1000 . .... 0 ... .... .... ....     @s_rrr_shi
    152 }
    153 ADC_rrri         1110101 1010 . .... 0 ... .... .... ....     @s_rrr_shi
    154 SBC_rrri         1110101 1011 . .... 0 ... .... .... ....     @s_rrr_shi
    155 {
    156   CMP_xrri       1110101 1101 1 .... 0 ... 1111 .... ....     @S_xrr_shi
    157   SUB_rrri       1110101 1101 . .... 0 ... .... .... ....     @s_rrr_shi
    158 }
    159 RSB_rrri         1110101 1110 . .... 0 ... .... .... ....     @s_rrr_shi
    160 
    161 # Data-processing (register-shifted register)
    162 
    163 MOV_rxrr         1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
    164                  &s_rrr_shr rn=0
    165 
    166 # Data-processing (immediate)
    167 
    168 %t32extrot       26:1 12:3 0:8  !function=t32_expandimm_rot
    169 %t32extimm       26:1 12:3 0:8  !function=t32_expandimm_imm
    170 
    171 @s_rri_rot       ....... .... s:1 rn:4 . ... rd:4 ........ \
    172                  &s_rri_rot imm=%t32extimm rot=%t32extrot
    173 @s_rxi_rot       ....... .... s:1 .... . ... rd:4 ........ \
    174                  &s_rri_rot imm=%t32extimm rot=%t32extrot rn=0
    175 @S_xri_rot       ....... .... .   rn:4 . ... .... ........ \
    176                  &s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0
    177 
    178 {
    179   TST_xri        1111 0.0 0000 1 .... 0 ... 1111 ........     @S_xri_rot
    180   AND_rri        1111 0.0 0000 . .... 0 ... .... ........     @s_rri_rot
    181 }
    182 BIC_rri          1111 0.0 0001 . .... 0 ... .... ........     @s_rri_rot
    183 {
    184   MOV_rxi        1111 0.0 0010 . 1111 0 ... .... ........     @s_rxi_rot
    185   ORR_rri        1111 0.0 0010 . .... 0 ... .... ........     @s_rri_rot
    186 }
    187 {
    188   MVN_rxi        1111 0.0 0011 . 1111 0 ... .... ........     @s_rxi_rot
    189   ORN_rri        1111 0.0 0011 . .... 0 ... .... ........     @s_rri_rot
    190 }
    191 {
    192   TEQ_xri        1111 0.0 0100 1 .... 0 ... 1111 ........     @S_xri_rot
    193   EOR_rri        1111 0.0 0100 . .... 0 ... .... ........     @s_rri_rot
    194 }
    195 {
    196   CMN_xri        1111 0.0 1000 1 .... 0 ... 1111 ........     @S_xri_rot
    197   ADD_rri        1111 0.0 1000 . .... 0 ... .... ........     @s_rri_rot
    198 }
    199 ADC_rri          1111 0.0 1010 . .... 0 ... .... ........     @s_rri_rot
    200 SBC_rri          1111 0.0 1011 . .... 0 ... .... ........     @s_rri_rot
    201 {
    202   CMP_xri        1111 0.0 1101 1 .... 0 ... 1111 ........     @S_xri_rot
    203   SUB_rri        1111 0.0 1101 . .... 0 ... .... ........     @s_rri_rot
    204 }
    205 RSB_rri          1111 0.0 1110 . .... 0 ... .... ........     @s_rri_rot
    206 
    207 # Data processing (plain binary immediate)
    208 
    209 %imm12_26_12_0   26:1 12:3 0:8
    210 %neg12_26_12_0   26:1 12:3 0:8 !function=negate
    211 @s0_rri_12       .... ... .... . rn:4 . ... rd:4 ........ \
    212                  &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0
    213 
    214 {
    215   ADR            1111 0.1 0000 0 1111 0 ... rd:4 ........ \
    216                  &ri imm=%imm12_26_12_0
    217   ADD_rri        1111 0.1 0000 0 .... 0 ... .... ........     @s0_rri_12
    218 }
    219 {
    220   ADR            1111 0.1 0101 0 1111 0 ... rd:4 ........ \
    221                  &ri imm=%neg12_26_12_0
    222   SUB_rri        1111 0.1 0101 0 .... 0 ... .... ........     @s0_rri_12
    223 }
    224 
    225 # Move Wide
    226 
    227 %imm16_26_16_12_0 16:4 26:1 12:3 0:8
    228 @mov16           .... .... .... .... .... rd:4 .... .... \
    229                  &ri imm=%imm16_26_16_12_0
    230 
    231 MOVW             1111 0.10 0100 .... 0 ... .... ........      @mov16
    232 MOVT             1111 0.10 1100 .... 0 ... .... ........      @mov16
    233 
    234 # Saturate, bitfield
    235 
    236 @sat             .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \
    237                  &sat imm=%imm5_12_6
    238 @sat16           .... .... .. .    . rn:4 . ... rd:4 .. . satimm:5 \
    239                  &sat sh=0 imm=0
    240 
    241 {
    242   SSAT16         1111 0011 001 0 .... 0 000 .... 00 0 .....   @sat16
    243   SSAT           1111 0011 00. 0 .... 0 ... .... .. 0 .....   @sat
    244 }
    245 {
    246   USAT16         1111 0011 101 0 .... 0 000 .... 00 0 .....   @sat16
    247   USAT           1111 0011 10. 0 .... 0 ... .... .. 0 .....   @sat
    248 }
    249 
    250 @bfx             .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \
    251                  &bfx lsb=%imm5_12_6
    252 @bfi             .... .... ... . rn:4 . ... rd:4 .. . msb:5 \
    253                  &bfi lsb=%imm5_12_6
    254 
    255 SBFX             1111 0011 010 0 .... 0 ... .... ..0.....     @bfx
    256 UBFX             1111 0011 110 0 .... 0 ... .... ..0.....     @bfx
    257 
    258 # bfc is bfi w/ rn=15
    259 BFCI             1111 0011 011 0 .... 0 ... .... ..0.....     @bfi
    260 
    261 # Multiply and multiply accumulate
    262 
    263 @s0_rnadm        .... .... .... rn:4 ra:4 rd:4 .... rm:4      &s_rrrr s=0
    264 @s0_rn0dm        .... .... .... rn:4 .... rd:4 .... rm:4      &s_rrrr ra=0 s=0
    265 @rnadm           .... .... .... rn:4 ra:4 rd:4 .... rm:4      &rrrr
    266 @rn0dm           .... .... .... rn:4 .... rd:4 .... rm:4      &rrrr ra=0
    267 @rndm            .... .... .... rn:4 .... rd:4 .... rm:4      &rrr
    268 @rdm             .... .... .... .... .... rd:4 .... rm:4      &rr
    269 
    270 {
    271   MUL            1111 1011 0000 .... 1111 .... 0000 ....      @s0_rn0dm
    272   MLA            1111 1011 0000 .... .... .... 0000 ....      @s0_rnadm
    273 }
    274 MLS              1111 1011 0000 .... .... .... 0001 ....      @rnadm
    275 SMULL            1111 1011 1000 .... .... .... 0000 ....      @s0_rnadm
    276 UMULL            1111 1011 1010 .... .... .... 0000 ....      @s0_rnadm
    277 SMLAL            1111 1011 1100 .... .... .... 0000 ....      @s0_rnadm
    278 UMLAL            1111 1011 1110 .... .... .... 0000 ....      @s0_rnadm
    279 UMAAL            1111 1011 1110 .... .... .... 0110 ....      @rnadm
    280 {
    281   SMULWB         1111 1011 0011 .... 1111 .... 0000 ....      @rn0dm
    282   SMLAWB         1111 1011 0011 .... .... .... 0000 ....      @rnadm
    283 }
    284 {
    285   SMULWT         1111 1011 0011 .... 1111 .... 0001 ....      @rn0dm
    286   SMLAWT         1111 1011 0011 .... .... .... 0001 ....      @rnadm
    287 }
    288 {
    289   SMULBB         1111 1011 0001 .... 1111 .... 0000 ....      @rn0dm
    290   SMLABB         1111 1011 0001 .... .... .... 0000 ....      @rnadm
    291 }
    292 {
    293   SMULBT         1111 1011 0001 .... 1111 .... 0001 ....      @rn0dm
    294   SMLABT         1111 1011 0001 .... .... .... 0001 ....      @rnadm
    295 }
    296 {
    297   SMULTB         1111 1011 0001 .... 1111 .... 0010 ....      @rn0dm
    298   SMLATB         1111 1011 0001 .... .... .... 0010 ....      @rnadm
    299 }
    300 {
    301   SMULTT         1111 1011 0001 .... 1111 .... 0011 ....      @rn0dm
    302   SMLATT         1111 1011 0001 .... .... .... 0011 ....      @rnadm
    303 }
    304 SMLALBB          1111 1011 1100 .... .... .... 1000 ....      @rnadm
    305 SMLALBT          1111 1011 1100 .... .... .... 1001 ....      @rnadm
    306 SMLALTB          1111 1011 1100 .... .... .... 1010 ....      @rnadm
    307 SMLALTT          1111 1011 1100 .... .... .... 1011 ....      @rnadm
    308 
    309 # usad8 is usada8 w/ ra=15
    310 USADA8           1111 1011 0111 .... .... .... 0000 ....      @rnadm
    311 
    312 SMLAD            1111 1011 0010 .... .... .... 0000 ....      @rnadm
    313 SMLADX           1111 1011 0010 .... .... .... 0001 ....      @rnadm
    314 SMLSD            1111 1011 0100 .... .... .... 0000 ....      @rnadm
    315 SMLSDX           1111 1011 0100 .... .... .... 0001 ....      @rnadm
    316 
    317 SMLALD           1111 1011 1100 .... .... .... 1100 ....      @rnadm
    318 SMLALDX          1111 1011 1100 .... .... .... 1101 ....      @rnadm
    319 SMLSLD           1111 1011 1101 .... .... .... 1100 ....      @rnadm
    320 SMLSLDX          1111 1011 1101 .... .... .... 1101 ....      @rnadm
    321 
    322 SMMLA            1111 1011 0101 .... .... .... 0000 ....      @rnadm
    323 SMMLAR           1111 1011 0101 .... .... .... 0001 ....      @rnadm
    324 SMMLS            1111 1011 0110 .... .... .... 0000 ....      @rnadm
    325 SMMLSR           1111 1011 0110 .... .... .... 0001 ....      @rnadm
    326 
    327 SDIV             1111 1011 1001 .... 1111 .... 1111 ....      @rndm
    328 UDIV             1111 1011 1011 .... 1111 .... 1111 ....      @rndm
    329 
    330 # Data-processing (two source registers)
    331 
    332 QADD             1111 1010 1000 .... 1111 .... 1000 ....      @rndm
    333 QSUB             1111 1010 1000 .... 1111 .... 1010 ....      @rndm
    334 QDADD            1111 1010 1000 .... 1111 .... 1001 ....      @rndm
    335 QDSUB            1111 1010 1000 .... 1111 .... 1011 ....      @rndm
    336 
    337 CRC32B           1111 1010 1100 .... 1111 .... 1000 ....      @rndm
    338 CRC32H           1111 1010 1100 .... 1111 .... 1001 ....      @rndm
    339 CRC32W           1111 1010 1100 .... 1111 .... 1010 ....      @rndm
    340 CRC32CB          1111 1010 1101 .... 1111 .... 1000 ....      @rndm
    341 CRC32CH          1111 1010 1101 .... 1111 .... 1001 ....      @rndm
    342 CRC32CW          1111 1010 1101 .... 1111 .... 1010 ....      @rndm
    343 
    344 SEL              1111 1010 1010 .... 1111 .... 1000 ....      @rndm
    345 
    346 # Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
    347 REV              1111 1010 1001 ---- 1111 .... 1000 ....      @rdm
    348 REV16            1111 1010 1001 ---- 1111 .... 1001 ....      @rdm
    349 RBIT             1111 1010 1001 ---- 1111 .... 1010 ....      @rdm
    350 REVSH            1111 1010 1001 ---- 1111 .... 1011 ....      @rdm
    351 CLZ              1111 1010 1011 ---- 1111 .... 1000 ....      @rdm
    352 
    353 # Branches and miscellaneous control
    354 
    355 %msr_sysm        4:1 8:4
    356 %mrs_sysm        4:1 16:4
    357 %imm16_16_0      16:4 0:12
    358 %imm21           26:s1 11:1 13:1 16:6 0:11 !function=times_2
    359 &ci              cond imm
    360 
    361 {
    362   # Group insn[25:23] = 111, which is cond=111x for the branch below,
    363   # or unconditional, which would be illegal for the branch.
    364   [
    365     # Hints, and CPS
    366     {
    367       [
    368         YIELD    1111 0011 1010 1111 1000 0000 0000 0001
    369         WFE      1111 0011 1010 1111 1000 0000 0000 0010
    370         WFI      1111 0011 1010 1111 1000 0000 0000 0011
    371 
    372         # TODO: Implement SEV, SEVL; may help SMP performance.
    373         # SEV    1111 0011 1010 1111 1000 0000 0000 0100
    374         # SEVL   1111 0011 1010 1111 1000 0000 0000 0101
    375 
    376         ESB      1111 0011 1010 1111 1000 0000 0001 0000
    377       ]
    378 
    379       # The canonical nop ends in 0000 0000, but the whole rest
    380       # of the space is "reserved hint, behaves as nop".
    381       NOP        1111 0011 1010 1111 1000 0000 ---- ----
    382 
    383       # If imod == '00' && M == '0' then SEE "Hint instructions", above.
    384       CPS        1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \
    385                  &cps
    386     }
    387 
    388     # Miscellaneous control
    389     CLREX        1111 0011 1011 1111 1000 1111 0010 1111
    390     DSB          1111 0011 1011 1111 1000 1111 0100 ----
    391     DMB          1111 0011 1011 1111 1000 1111 0101 ----
    392     ISB          1111 0011 1011 1111 1000 1111 0110 ----
    393     SB           1111 0011 1011 1111 1000 1111 0111 0000
    394 
    395     # Note that the v7m insn overlaps both the normal and banked insn.
    396     {
    397       MRS_bank   1111 0011 111 r:1 .... 1000 rd:4   001. 0000  \
    398                  &mrs_bank sysm=%mrs_sysm
    399       MRS_reg    1111 0011 111 r:1 1111 1000 rd:4   0000 0000  &mrs_reg
    400       MRS_v7m    1111 0011 111 0   1111 1000 rd:4   sysm:8
    401     }
    402     {
    403       MSR_bank   1111 0011 100 r:1 rn:4 1000 ....   001. 0000  \
    404                  &msr_bank sysm=%msr_sysm
    405       MSR_reg    1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000  &msr_reg
    406       MSR_v7m    1111 0011 100 0   rn:4 1000 mask:2 00 sysm:8
    407     }
    408     BXJ          1111 0011 1100 rm:4 1000 1111 0000 0000      &r
    409     {
    410       # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
    411       # every other encoding of SUBS.  With v7VE, IMM=0 is redefined as ERET.
    412       # The distinction between the two only matters for Hyp mode.
    413       ERET       1111 0011 1101 1110 1000 1111 0000 0000
    414       SUB_rri    1111 0011 1101 1110 1000 1111 imm:8 \
    415                  &s_rri_rot rot=0 s=1 rd=15 rn=14
    416     }
    417     SMC          1111 0111 1111 imm:4 1000 0000 0000 0000     &i
    418     HVC          1111 0111 1110 ....  1000 .... .... ....     \
    419                  &i imm=%imm16_16_0
    420     UDF          1111 0111 1111 ----  1010 ---- ---- ----
    421   ]
    422   B_cond_thumb   1111 0. cond:4 ...... 10.0 ............      &ci imm=%imm21
    423 }
    424 
    425 # Load/store (register, immediate, literal)
    426 
    427 @ldst_rr         .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \
    428                  &ldst_rr p=1 w=0 u=1 shtype=0
    429 @ldst_ri_idx     .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \
    430                  &ldst_ri w=1
    431 @ldst_ri_neg     .... .... .... rn:4 rt:4 .... imm:8 \
    432                  &ldst_ri p=1 w=0 u=0
    433 @ldst_ri_unp     .... .... .... rn:4 rt:4 .... imm:8 \
    434                  &ldst_ri p=1 w=0 u=1
    435 @ldst_ri_pos     .... .... .... rn:4 rt:4 imm:12 \
    436                  &ldst_ri p=1 w=0 u=1
    437 @ldst_ri_lit     .... .... u:1 ... .... rt:4 imm:12 \
    438                  &ldst_ri p=1 w=0 rn=15
    439 
    440 STRB_rr          1111 1000 0000 .... .... 000000 .. ....      @ldst_rr
    441 STRB_ri          1111 1000 0000 .... .... 1..1 ........       @ldst_ri_idx
    442 STRB_ri          1111 1000 0000 .... .... 1100 ........       @ldst_ri_neg
    443 STRBT_ri         1111 1000 0000 .... .... 1110 ........       @ldst_ri_unp
    444 STRB_ri          1111 1000 1000 .... .... ............        @ldst_ri_pos
    445 
    446 STRH_rr          1111 1000 0010 .... .... 000000 .. ....      @ldst_rr
    447 STRH_ri          1111 1000 0010 .... .... 1..1 ........       @ldst_ri_idx
    448 STRH_ri          1111 1000 0010 .... .... 1100 ........       @ldst_ri_neg
    449 STRHT_ri         1111 1000 0010 .... .... 1110 ........       @ldst_ri_unp
    450 STRH_ri          1111 1000 1010 .... .... ............        @ldst_ri_pos
    451 
    452 STR_rr           1111 1000 0100 .... .... 000000 .. ....      @ldst_rr
    453 STR_ri           1111 1000 0100 .... .... 1..1 ........       @ldst_ri_idx
    454 STR_ri           1111 1000 0100 .... .... 1100 ........       @ldst_ri_neg
    455 STRT_ri          1111 1000 0100 .... .... 1110 ........       @ldst_ri_unp
    456 STR_ri           1111 1000 1100 .... .... ............        @ldst_ri_pos
    457 
    458 # Note that Load, unsigned (literal) overlaps all other load encodings.
    459 {
    460   {
    461     NOP          1111 1000 -001 1111 1111 ------------        # PLD
    462     LDRB_ri      1111 1000 .001 1111 .... ............        @ldst_ri_lit
    463   }
    464   {
    465     NOP          1111 1000 1001 ---- 1111 ------------        # PLD
    466     LDRB_ri      1111 1000 1001 .... .... ............        @ldst_ri_pos
    467   }
    468   LDRB_ri        1111 1000 0001 .... .... 1..1 ........       @ldst_ri_idx
    469   {
    470     NOP          1111 1000 0001 ---- 1111 1100 --------       # PLD
    471     LDRB_ri      1111 1000 0001 .... .... 1100 ........       @ldst_ri_neg
    472   }
    473   LDRBT_ri       1111 1000 0001 .... .... 1110 ........       @ldst_ri_unp
    474   {
    475     NOP          1111 1000 0001 ---- 1111 000000 -- ----      # PLD
    476     LDRB_rr      1111 1000 0001 .... .... 000000 .. ....      @ldst_rr
    477   }
    478 }
    479 {
    480   {
    481     NOP          1111 1000 -011 1111 1111 ------------        # PLD
    482     LDRH_ri      1111 1000 .011 1111 .... ............        @ldst_ri_lit
    483   }
    484   {
    485     NOP          1111 1000 1011 ---- 1111 ------------        # PLDW
    486     LDRH_ri      1111 1000 1011 .... .... ............        @ldst_ri_pos
    487   }
    488   LDRH_ri        1111 1000 0011 .... .... 1..1 ........       @ldst_ri_idx
    489   {
    490     NOP          1111 1000 0011 ---- 1111 1100 --------       # PLDW
    491     LDRH_ri      1111 1000 0011 .... .... 1100 ........       @ldst_ri_neg
    492   }
    493   LDRHT_ri       1111 1000 0011 .... .... 1110 ........       @ldst_ri_unp
    494   {
    495     NOP          1111 1000 0011 ---- 1111 000000 -- ----      # PLDW
    496     LDRH_rr      1111 1000 0011 .... .... 000000 .. ....      @ldst_rr
    497   }
    498 }
    499 {
    500   LDR_ri         1111 1000 .101 1111 .... ............        @ldst_ri_lit
    501   LDR_ri         1111 1000 1101 .... .... ............        @ldst_ri_pos
    502   LDR_ri         1111 1000 0101 .... .... 1..1 ........       @ldst_ri_idx
    503   LDR_ri         1111 1000 0101 .... .... 1100 ........       @ldst_ri_neg
    504   LDRT_ri        1111 1000 0101 .... .... 1110 ........       @ldst_ri_unp
    505   LDR_rr         1111 1000 0101 .... .... 000000 .. ....      @ldst_rr
    506 }
    507 # NOPs here are PLI.
    508 {
    509   {
    510     NOP          1111 1001 -001 1111 1111 ------------
    511     LDRSB_ri     1111 1001 .001 1111 .... ............        @ldst_ri_lit
    512   }
    513   {
    514     NOP          1111 1001 1001 ---- 1111 ------------
    515     LDRSB_ri     1111 1001 1001 .... .... ............        @ldst_ri_pos
    516   }
    517   LDRSB_ri       1111 1001 0001 .... .... 1..1 ........       @ldst_ri_idx
    518   {
    519     NOP          1111 1001 0001 ---- 1111 1100 --------
    520     LDRSB_ri     1111 1001 0001 .... .... 1100 ........       @ldst_ri_neg
    521   }
    522   LDRSBT_ri      1111 1001 0001 .... .... 1110 ........       @ldst_ri_unp
    523   {
    524     NOP          1111 1001 0001 ---- 1111 000000 -- ----
    525     LDRSB_rr     1111 1001 0001 .... .... 000000 .. ....      @ldst_rr
    526   }
    527 }
    528 # NOPs here are unallocated memory hints, treated as NOP.
    529 {
    530   {
    531     NOP          1111 1001 -011 1111 1111 ------------
    532     LDRSH_ri     1111 1001 .011 1111 .... ............        @ldst_ri_lit
    533   }
    534   {
    535     NOP          1111 1001 1011 ---- 1111 ------------
    536     LDRSH_ri     1111 1001 1011 .... .... ............        @ldst_ri_pos
    537   }
    538   LDRSH_ri       1111 1001 0011 .... .... 1..1 ........       @ldst_ri_idx
    539   {
    540     NOP          1111 1001 0011 ---- 1111 1100 --------
    541     LDRSH_ri     1111 1001 0011 .... .... 1100 ........       @ldst_ri_neg
    542   }
    543   LDRSHT_ri      1111 1001 0011 .... .... 1110 ........       @ldst_ri_unp
    544   {
    545     NOP          1111 1001 0011 ---- 1111 000000 -- ----
    546     LDRSH_rr     1111 1001 0011 .... .... 000000 .. ....      @ldst_rr
    547   }
    548 }
    549 
    550 %imm8x4          0:8 !function=times_4
    551 &ldst_ri2        p w u rn rt rt2 imm
    552 @ldstd_ri8       .... .... u:1 ... rn:4 rt:4 rt2:4 ........   \
    553                  &ldst_ri2 imm=%imm8x4
    554 
    555 STRD_ri_t32      1110 1000 .110 .... .... .... ........    @ldstd_ri8 w=1 p=0
    556 LDRD_ri_t32      1110 1000 .111 .... .... .... ........    @ldstd_ri8 w=1 p=0
    557 
    558 STRD_ri_t32      1110 1001 .100 .... .... .... ........    @ldstd_ri8 w=0 p=1
    559 LDRD_ri_t32      1110 1001 .101 .... .... .... ........    @ldstd_ri8 w=0 p=1
    560 
    561 STRD_ri_t32      1110 1001 .110 .... .... .... ........    @ldstd_ri8 w=1 p=1
    562 {
    563   SG             1110 1001 0111 1111 1110 1001 01111111
    564   LDRD_ri_t32    1110 1001 .111 .... .... .... ........    @ldstd_ri8 w=1 p=1
    565 }
    566 
    567 # Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
    568 
    569 @strex_i         .... .... .... rn:4 rt:4 rd:4 .... .... \
    570                  &strex rt2=15 imm=%imm8x4
    571 @strex_0         .... .... .... rn:4 rt:4 .... .... rd:4 \
    572                  &strex rt2=15 imm=0
    573 @strex_d         .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
    574                  &strex imm=0
    575 
    576 @ldrex_i         .... .... .... rn:4 rt:4 .... .... .... \
    577                  &ldrex rt2=15 imm=%imm8x4
    578 @ldrex_0         .... .... .... rn:4 rt:4 .... .... .... \
    579                  &ldrex rt2=15 imm=0
    580 @ldrex_d         .... .... .... rn:4 rt:4 rt2:4 .... .... \
    581                  &ldrex imm=0
    582 
    583 {
    584   TT             1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
    585   STREX          1110 1000 0100 .... .... .... .... ....      @strex_i
    586 }
    587 STREXB           1110 1000 1100 .... .... 1111 0100 ....      @strex_0
    588 STREXH           1110 1000 1100 .... .... 1111 0101 ....      @strex_0
    589 STREXD_t32       1110 1000 1100 .... .... .... 0111 ....      @strex_d
    590 
    591 STLEX            1110 1000 1100 .... .... 1111 1110 ....      @strex_0
    592 STLEXB           1110 1000 1100 .... .... 1111 1100 ....      @strex_0
    593 STLEXH           1110 1000 1100 .... .... 1111 1101 ....      @strex_0
    594 STLEXD_t32       1110 1000 1100 .... .... .... 1111 ....      @strex_d
    595 
    596 STL              1110 1000 1100 .... .... 1111 1010 1111      @ldrex_0
    597 STLB             1110 1000 1100 .... .... 1111 1000 1111      @ldrex_0
    598 STLH             1110 1000 1100 .... .... 1111 1001 1111      @ldrex_0
    599 
    600 LDREX            1110 1000 0101 .... .... 1111 .... ....      @ldrex_i
    601 LDREXB           1110 1000 1101 .... .... 1111 0100 1111      @ldrex_0
    602 LDREXH           1110 1000 1101 .... .... 1111 0101 1111      @ldrex_0
    603 LDREXD_t32       1110 1000 1101 .... .... .... 0111 1111      @ldrex_d
    604 
    605 LDAEX            1110 1000 1101 .... .... 1111 1110 1111      @ldrex_0
    606 LDAEXB           1110 1000 1101 .... .... 1111 1100 1111      @ldrex_0
    607 LDAEXH           1110 1000 1101 .... .... 1111 1101 1111      @ldrex_0
    608 LDAEXD_t32       1110 1000 1101 .... .... .... 1111 1111      @ldrex_d
    609 
    610 LDA              1110 1000 1101 .... .... 1111 1010 1111      @ldrex_0
    611 LDAB             1110 1000 1101 .... .... 1111 1000 1111      @ldrex_0
    612 LDAH             1110 1000 1101 .... .... 1111 1001 1111      @ldrex_0
    613 
    614 &tbranch         rn rm
    615 @tbranch         .... .... .... rn:4 .... .... .... rm:4      &tbranch
    616 
    617 TBB              1110 1000 1101 .... 1111 0000 0000 ....      @tbranch
    618 TBH              1110 1000 1101 .... 1111 0000 0001 ....      @tbranch
    619 
    620 # Parallel addition and subtraction
    621 
    622 SADD8            1111 1010 1000 .... 1111 .... 0000 ....      @rndm
    623 QADD8            1111 1010 1000 .... 1111 .... 0001 ....      @rndm
    624 SHADD8           1111 1010 1000 .... 1111 .... 0010 ....      @rndm
    625 UADD8            1111 1010 1000 .... 1111 .... 0100 ....      @rndm
    626 UQADD8           1111 1010 1000 .... 1111 .... 0101 ....      @rndm
    627 UHADD8           1111 1010 1000 .... 1111 .... 0110 ....      @rndm
    628 
    629 SADD16           1111 1010 1001 .... 1111 .... 0000 ....      @rndm
    630 QADD16           1111 1010 1001 .... 1111 .... 0001 ....      @rndm
    631 SHADD16          1111 1010 1001 .... 1111 .... 0010 ....      @rndm
    632 UADD16           1111 1010 1001 .... 1111 .... 0100 ....      @rndm
    633 UQADD16          1111 1010 1001 .... 1111 .... 0101 ....      @rndm
    634 UHADD16          1111 1010 1001 .... 1111 .... 0110 ....      @rndm
    635 
    636 SASX             1111 1010 1010 .... 1111 .... 0000 ....      @rndm
    637 QASX             1111 1010 1010 .... 1111 .... 0001 ....      @rndm
    638 SHASX            1111 1010 1010 .... 1111 .... 0010 ....      @rndm
    639 UASX             1111 1010 1010 .... 1111 .... 0100 ....      @rndm
    640 UQASX            1111 1010 1010 .... 1111 .... 0101 ....      @rndm
    641 UHASX            1111 1010 1010 .... 1111 .... 0110 ....      @rndm
    642 
    643 SSUB8            1111 1010 1100 .... 1111 .... 0000 ....      @rndm
    644 QSUB8            1111 1010 1100 .... 1111 .... 0001 ....      @rndm
    645 SHSUB8           1111 1010 1100 .... 1111 .... 0010 ....      @rndm
    646 USUB8            1111 1010 1100 .... 1111 .... 0100 ....      @rndm
    647 UQSUB8           1111 1010 1100 .... 1111 .... 0101 ....      @rndm
    648 UHSUB8           1111 1010 1100 .... 1111 .... 0110 ....      @rndm
    649 
    650 SSUB16           1111 1010 1101 .... 1111 .... 0000 ....      @rndm
    651 QSUB16           1111 1010 1101 .... 1111 .... 0001 ....      @rndm
    652 SHSUB16          1111 1010 1101 .... 1111 .... 0010 ....      @rndm
    653 USUB16           1111 1010 1101 .... 1111 .... 0100 ....      @rndm
    654 UQSUB16          1111 1010 1101 .... 1111 .... 0101 ....      @rndm
    655 UHSUB16          1111 1010 1101 .... 1111 .... 0110 ....      @rndm
    656 
    657 SSAX             1111 1010 1110 .... 1111 .... 0000 ....      @rndm
    658 QSAX             1111 1010 1110 .... 1111 .... 0001 ....      @rndm
    659 SHSAX            1111 1010 1110 .... 1111 .... 0010 ....      @rndm
    660 USAX             1111 1010 1110 .... 1111 .... 0100 ....      @rndm
    661 UQSAX            1111 1010 1110 .... 1111 .... 0101 ....      @rndm
    662 UHSAX            1111 1010 1110 .... 1111 .... 0110 ....      @rndm
    663 
    664 # Register extends
    665 
    666 @rrr_rot         .... .... .... rn:4 .... rd:4 .. rot:2 rm:4  &rrr_rot
    667 
    668 SXTAH            1111 1010 0000 .... 1111 .... 10.. ....      @rrr_rot
    669 UXTAH            1111 1010 0001 .... 1111 .... 10.. ....      @rrr_rot
    670 SXTAB16          1111 1010 0010 .... 1111 .... 10.. ....      @rrr_rot
    671 UXTAB16          1111 1010 0011 .... 1111 .... 10.. ....      @rrr_rot
    672 SXTAB            1111 1010 0100 .... 1111 .... 10.. ....      @rrr_rot
    673 UXTAB            1111 1010 0101 .... 1111 .... 10.. ....      @rrr_rot
    674 
    675 # Load/store multiple
    676 
    677 @ldstm           .... .... .. w:1 . rn:4 list:16              &ldst_block u=0
    678 
    679 STM_t32          1110 1000 10.0 .... ................         @ldstm i=1 b=0
    680 STM_t32          1110 1001 00.0 .... ................         @ldstm i=0 b=1
    681 {
    682   # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding
    683   CLRM           1110 1000 1001 1111 list:16
    684   LDM_t32        1110 1000 10.1 .... ................         @ldstm i=1 b=0
    685 }
    686 LDM_t32          1110 1001 00.1 .... ................         @ldstm i=0 b=1
    687 
    688 &rfe             !extern rn w pu
    689 @rfe             .... .... .. w:1 . rn:4 ................     &rfe
    690 
    691 RFE              1110 1000 00.1 .... 1100000000000000         @rfe pu=2
    692 RFE              1110 1001 10.1 .... 1100000000000000         @rfe pu=1
    693 
    694 &srs             !extern mode w pu
    695 @srs             .... .... .. w:1 . .... ........... mode:5   &srs
    696 
    697 SRS              1110 1000 00.0 1101 1100 0000 000. ....      @srs pu=2
    698 SRS              1110 1001 10.0 1101 1100 0000 000. ....      @srs pu=1
    699 
    700 # Coprocessor instructions
    701 
    702 # We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
    703 # other coprocessor instructions always UNDEF.
    704 # The trans_ functions for these will ignore cp values 8..13 for v7 or
    705 # earlier, and 0..13 for v8 and later, because those areas of the
    706 # encoding space may be used for other things, such as VFP or Neon.
    707 
    708 @mcr             .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4
    709 @mcrr            .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4
    710 
    711 MCRR             1110 1100 0100 .... .... .... .... .... @mcrr
    712 MRRC             1110 1100 0101 .... .... .... .... .... @mcrr
    713 
    714 MCR              1110 1110 ... 0 .... .... .... ... 1 .... @mcr
    715 MRC              1110 1110 ... 1 .... .... .... ... 1 .... @mcr
    716 
    717 # Branches
    718 
    719 %imm24           26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
    720 @branch24        ................................             &i imm=%imm24
    721 
    722 B                1111 0. .......... 10.1 ............         @branch24
    723 BL               1111 0. .......... 11.1 ............         @branch24
    724 {
    725   # BLX_i is non-M-profile only
    726   BLX_i          1111 0. .......... 11.0 ............         @branch24
    727   # M-profile only: loop and branch insns
    728   [
    729     # All these BF insns have boff != 0b0000; we NOP them all
    730     BF           1111 0 boff:4  ------- 1100 - ---------- 1    # BFL
    731     BF           1111 0 boff:4 0 ------ 1110 - ---------- 1    # BFCSEL
    732     BF           1111 0 boff:4 10 ----- 1110 - ---------- 1    # BF
    733     BF           1111 0 boff:4 11 ----- 1110 0 0000000000 1    # BFX, BFLX
    734   ]
    735   [
    736     # LE and WLS immediate
    737     %lob_imm 1:10 11:1 !function=times_2
    738 
    739     DLS          1111 0 0000 100     rn:4 1110 0000 0000 0001 size=4
    740     WLS          1111 0 0000 100     rn:4 1100 . .......... 1 imm=%lob_imm size=4
    741     {
    742       LE         1111 0 0000 0 f:1 tp:1 1111 1100 . .......... 1 imm=%lob_imm
    743       # This is WLSTP
    744       WLS        1111 0 0000 0 size:2 rn:4 1100 . .......... 1 imm=%lob_imm
    745     }
    746     {
    747       LCTP       1111 0 0000 000     1111 1110 0000 0000 0001
    748       # This is DLSTP
    749       DLS        1111 0 0000 0 size:2 rn:4 1110 0000 0000 0001
    750     }
    751     VCTP         1111 0 0000 0 size:2 rn:4 1110 1000 0000 0001
    752   ]
    753 }