cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

t32.decode (32057B)


      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}