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