qemu/target/arm/t32.decode
<<
>>
Prefs
   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}
  84BIC_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}
 147PKH              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}
 153ADC_rrri         1110101 1010 . .... 0 ... .... .... ....     @s_rrr_shi
 154SBC_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}
 159RSB_rrri         1110101 1110 . .... 0 ... .... .... ....     @s_rrr_shi
 160
 161# Data-processing (register-shifted register)
 162
 163MOV_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}
 182BIC_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}
 199ADC_rri          1111 0.0 1010 . .... 0 ... .... ........     @s_rri_rot
 200SBC_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}
 205RSB_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
 231MOVW             1111 0.10 0100 .... 0 ... .... ........      @mov16
 232MOVT             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
 255SBFX             1111 0011 010 0 .... 0 ... .... ..0.....     @bfx
 256UBFX             1111 0011 110 0 .... 0 ... .... ..0.....     @bfx
 257
 258# bfc is bfi w/ rn=15
 259BFCI             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}
 274MLS              1111 1011 0000 .... .... .... 0001 ....      @rnadm
 275SMULL            1111 1011 1000 .... .... .... 0000 ....      @s0_rnadm
 276UMULL            1111 1011 1010 .... .... .... 0000 ....      @s0_rnadm
 277SMLAL            1111 1011 1100 .... .... .... 0000 ....      @s0_rnadm
 278UMLAL            1111 1011 1110 .... .... .... 0000 ....      @s0_rnadm
 279UMAAL            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}
 304SMLALBB          1111 1011 1100 .... .... .... 1000 ....      @rnadm
 305SMLALBT          1111 1011 1100 .... .... .... 1001 ....      @rnadm
 306SMLALTB          1111 1011 1100 .... .... .... 1010 ....      @rnadm
 307SMLALTT          1111 1011 1100 .... .... .... 1011 ....      @rnadm
 308
 309# usad8 is usada8 w/ ra=15
 310USADA8           1111 1011 0111 .... .... .... 0000 ....      @rnadm
 311
 312SMLAD            1111 1011 0010 .... .... .... 0000 ....      @rnadm
 313SMLADX           1111 1011 0010 .... .... .... 0001 ....      @rnadm
 314SMLSD            1111 1011 0100 .... .... .... 0000 ....      @rnadm
 315SMLSDX           1111 1011 0100 .... .... .... 0001 ....      @rnadm
 316
 317SMLALD           1111 1011 1100 .... .... .... 1100 ....      @rnadm
 318SMLALDX          1111 1011 1100 .... .... .... 1101 ....      @rnadm
 319SMLSLD           1111 1011 1101 .... .... .... 1100 ....      @rnadm
 320SMLSLDX          1111 1011 1101 .... .... .... 1101 ....      @rnadm
 321
 322SMMLA            1111 1011 0101 .... .... .... 0000 ....      @rnadm
 323SMMLAR           1111 1011 0101 .... .... .... 0001 ....      @rnadm
 324SMMLS            1111 1011 0110 .... .... .... 0000 ....      @rnadm
 325SMMLSR           1111 1011 0110 .... .... .... 0001 ....      @rnadm
 326
 327SDIV             1111 1011 1001 .... 1111 .... 1111 ....      @rndm
 328UDIV             1111 1011 1011 .... 1111 .... 1111 ....      @rndm
 329
 330# Data-processing (two source registers)
 331
 332QADD             1111 1010 1000 .... 1111 .... 1000 ....      @rndm
 333QSUB             1111 1010 1000 .... 1111 .... 1010 ....      @rndm
 334QDADD            1111 1010 1000 .... 1111 .... 1001 ....      @rndm
 335QDSUB            1111 1010 1000 .... 1111 .... 1011 ....      @rndm
 336
 337CRC32B           1111 1010 1100 .... 1111 .... 1000 ....      @rndm
 338CRC32H           1111 1010 1100 .... 1111 .... 1001 ....      @rndm
 339CRC32W           1111 1010 1100 .... 1111 .... 1010 ....      @rndm
 340CRC32CB          1111 1010 1101 .... 1111 .... 1000 ....      @rndm
 341CRC32CH          1111 1010 1101 .... 1111 .... 1001 ....      @rndm
 342CRC32CW          1111 1010 1101 .... 1111 .... 1010 ....      @rndm
 343
 344SEL              1111 1010 1010 .... 1111 .... 1000 ....      @rndm
 345
 346# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
 347REV              1111 1010 1001 ---- 1111 .... 1000 ....      @rdm
 348REV16            1111 1010 1001 ---- 1111 .... 1001 ....      @rdm
 349RBIT             1111 1010 1001 ---- 1111 .... 1010 ....      @rdm
 350REVSH            1111 1010 1001 ---- 1111 .... 1011 ....      @rdm
 351CLZ              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      YIELD      1111 0011 1010 1111 1000 0000 0000 0001
 368      WFE        1111 0011 1010 1111 1000 0000 0000 0010
 369      WFI        1111 0011 1010 1111 1000 0000 0000 0011
 370
 371      # TODO: Implement SEV, SEVL; may help SMP performance.
 372      # SEV      1111 0011 1010 1111 1000 0000 0000 0100
 373      # SEVL     1111 0011 1010 1111 1000 0000 0000 0101
 374
 375      # For M-profile minimal-RAS ESB can be a NOP, which is the
 376      # default behaviour since it is in the hint space.
 377      # ESB      1111 0011 1010 1111 1000 0000 0001 0000
 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
 440STRB_rr          1111 1000 0000 .... .... 000000 .. ....      @ldst_rr
 441STRB_ri          1111 1000 0000 .... .... 1..1 ........       @ldst_ri_idx
 442STRB_ri          1111 1000 0000 .... .... 1100 ........       @ldst_ri_neg
 443STRBT_ri         1111 1000 0000 .... .... 1110 ........       @ldst_ri_unp
 444STRB_ri          1111 1000 1000 .... .... ............        @ldst_ri_pos
 445
 446STRH_rr          1111 1000 0010 .... .... 000000 .. ....      @ldst_rr
 447STRH_ri          1111 1000 0010 .... .... 1..1 ........       @ldst_ri_idx
 448STRH_ri          1111 1000 0010 .... .... 1100 ........       @ldst_ri_neg
 449STRHT_ri         1111 1000 0010 .... .... 1110 ........       @ldst_ri_unp
 450STRH_ri          1111 1000 1010 .... .... ............        @ldst_ri_pos
 451
 452STR_rr           1111 1000 0100 .... .... 000000 .. ....      @ldst_rr
 453STR_ri           1111 1000 0100 .... .... 1..1 ........       @ldst_ri_idx
 454STR_ri           1111 1000 0100 .... .... 1100 ........       @ldst_ri_neg
 455STRT_ri          1111 1000 0100 .... .... 1110 ........       @ldst_ri_unp
 456STR_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
 555STRD_ri_t32      1110 1000 .110 .... .... .... ........    @ldstd_ri8 w=1 p=0
 556LDRD_ri_t32      1110 1000 .111 .... .... .... ........    @ldstd_ri8 w=1 p=0
 557
 558STRD_ri_t32      1110 1001 .100 .... .... .... ........    @ldstd_ri8 w=0 p=1
 559LDRD_ri_t32      1110 1001 .101 .... .... .... ........    @ldstd_ri8 w=0 p=1
 560
 561STRD_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}
 587STREXB           1110 1000 1100 .... .... 1111 0100 ....      @strex_0
 588STREXH           1110 1000 1100 .... .... 1111 0101 ....      @strex_0
 589STREXD_t32       1110 1000 1100 .... .... .... 0111 ....      @strex_d
 590
 591STLEX            1110 1000 1100 .... .... 1111 1110 ....      @strex_0
 592STLEXB           1110 1000 1100 .... .... 1111 1100 ....      @strex_0
 593STLEXH           1110 1000 1100 .... .... 1111 1101 ....      @strex_0
 594STLEXD_t32       1110 1000 1100 .... .... .... 1111 ....      @strex_d
 595
 596STL              1110 1000 1100 .... .... 1111 1010 1111      @ldrex_0
 597STLB             1110 1000 1100 .... .... 1111 1000 1111      @ldrex_0
 598STLH             1110 1000 1100 .... .... 1111 1001 1111      @ldrex_0
 599
 600LDREX            1110 1000 0101 .... .... 1111 .... ....      @ldrex_i
 601LDREXB           1110 1000 1101 .... .... 1111 0100 1111      @ldrex_0
 602LDREXH           1110 1000 1101 .... .... 1111 0101 1111      @ldrex_0
 603LDREXD_t32       1110 1000 1101 .... .... .... 0111 1111      @ldrex_d
 604
 605LDAEX            1110 1000 1101 .... .... 1111 1110 1111      @ldrex_0
 606LDAEXB           1110 1000 1101 .... .... 1111 1100 1111      @ldrex_0
 607LDAEXH           1110 1000 1101 .... .... 1111 1101 1111      @ldrex_0
 608LDAEXD_t32       1110 1000 1101 .... .... .... 1111 1111      @ldrex_d
 609
 610LDA              1110 1000 1101 .... .... 1111 1010 1111      @ldrex_0
 611LDAB             1110 1000 1101 .... .... 1111 1000 1111      @ldrex_0
 612LDAH             1110 1000 1101 .... .... 1111 1001 1111      @ldrex_0
 613
 614&tbranch         rn rm
 615@tbranch         .... .... .... rn:4 .... .... .... rm:4      &tbranch
 616
 617TBB              1110 1000 1101 .... 1111 0000 0000 ....      @tbranch
 618TBH              1110 1000 1101 .... 1111 0000 0001 ....      @tbranch
 619
 620# Parallel addition and subtraction
 621
 622SADD8            1111 1010 1000 .... 1111 .... 0000 ....      @rndm
 623QADD8            1111 1010 1000 .... 1111 .... 0001 ....      @rndm
 624SHADD8           1111 1010 1000 .... 1111 .... 0010 ....      @rndm
 625UADD8            1111 1010 1000 .... 1111 .... 0100 ....      @rndm
 626UQADD8           1111 1010 1000 .... 1111 .... 0101 ....      @rndm
 627UHADD8           1111 1010 1000 .... 1111 .... 0110 ....      @rndm
 628
 629SADD16           1111 1010 1001 .... 1111 .... 0000 ....      @rndm
 630QADD16           1111 1010 1001 .... 1111 .... 0001 ....      @rndm
 631SHADD16          1111 1010 1001 .... 1111 .... 0010 ....      @rndm
 632UADD16           1111 1010 1001 .... 1111 .... 0100 ....      @rndm
 633UQADD16          1111 1010 1001 .... 1111 .... 0101 ....      @rndm
 634UHADD16          1111 1010 1001 .... 1111 .... 0110 ....      @rndm
 635
 636SASX             1111 1010 1010 .... 1111 .... 0000 ....      @rndm
 637QASX             1111 1010 1010 .... 1111 .... 0001 ....      @rndm
 638SHASX            1111 1010 1010 .... 1111 .... 0010 ....      @rndm
 639UASX             1111 1010 1010 .... 1111 .... 0100 ....      @rndm
 640UQASX            1111 1010 1010 .... 1111 .... 0101 ....      @rndm
 641UHASX            1111 1010 1010 .... 1111 .... 0110 ....      @rndm
 642
 643SSUB8            1111 1010 1100 .... 1111 .... 0000 ....      @rndm
 644QSUB8            1111 1010 1100 .... 1111 .... 0001 ....      @rndm
 645SHSUB8           1111 1010 1100 .... 1111 .... 0010 ....      @rndm
 646USUB8            1111 1010 1100 .... 1111 .... 0100 ....      @rndm
 647UQSUB8           1111 1010 1100 .... 1111 .... 0101 ....      @rndm
 648UHSUB8           1111 1010 1100 .... 1111 .... 0110 ....      @rndm
 649
 650SSUB16           1111 1010 1101 .... 1111 .... 0000 ....      @rndm
 651QSUB16           1111 1010 1101 .... 1111 .... 0001 ....      @rndm
 652SHSUB16          1111 1010 1101 .... 1111 .... 0010 ....      @rndm
 653USUB16           1111 1010 1101 .... 1111 .... 0100 ....      @rndm
 654UQSUB16          1111 1010 1101 .... 1111 .... 0101 ....      @rndm
 655UHSUB16          1111 1010 1101 .... 1111 .... 0110 ....      @rndm
 656
 657SSAX             1111 1010 1110 .... 1111 .... 0000 ....      @rndm
 658QSAX             1111 1010 1110 .... 1111 .... 0001 ....      @rndm
 659SHSAX            1111 1010 1110 .... 1111 .... 0010 ....      @rndm
 660USAX             1111 1010 1110 .... 1111 .... 0100 ....      @rndm
 661UQSAX            1111 1010 1110 .... 1111 .... 0101 ....      @rndm
 662UHSAX            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
 668SXTAH            1111 1010 0000 .... 1111 .... 10.. ....      @rrr_rot
 669UXTAH            1111 1010 0001 .... 1111 .... 10.. ....      @rrr_rot
 670SXTAB16          1111 1010 0010 .... 1111 .... 10.. ....      @rrr_rot
 671UXTAB16          1111 1010 0011 .... 1111 .... 10.. ....      @rrr_rot
 672SXTAB            1111 1010 0100 .... 1111 .... 10.. ....      @rrr_rot
 673UXTAB            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
 679STM_t32          1110 1000 10.0 .... ................         @ldstm i=1 b=0
 680STM_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}
 686LDM_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
 691RFE              1110 1000 00.1 .... 1100000000000000         @rfe pu=2
 692RFE              1110 1001 10.1 .... 1100000000000000         @rfe pu=1
 693
 694&srs             !extern mode w pu
 695@srs             .... .... .. w:1 . .... ........... mode:5   &srs
 696
 697SRS              1110 1000 00.0 1101 1100 0000 000. ....      @srs pu=2
 698SRS              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
 711MCRR             1110 1100 0100 .... .... .... .... .... @mcrr
 712MRRC             1110 1100 0101 .... .... .... .... .... @mcrr
 713
 714MCR              1110 1110 ... 0 .... .... .... ... 1 .... @mcr
 715MRC              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
 722B                1111 0. .......... 10.1 ............         @branch24
 723BL               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}
 754