target/arm: Fix MTE access checks for disabled SEL2
[qemu.git] / target / arm / t32.decode
blob78fadef9d621890a820356b2aaa862e01f5340e0
1 # Thumb2 instructions
3 #  Copyright (c) 2019 Linaro, Ltd
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.
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.
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/>.
19 # This file is processed by scripts/decodetree.py
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
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
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
61 # Data-processing (register)
63 %imm5_12_6       12:3 6:2
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
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
81   TST_xrri       1110101 0000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
82   AND_rrri       1110101 0000 . .... 0 ... .... .... ....     @s_rrr_shi
84 BIC_rrri         1110101 0001 . .... 0 ... .... .... ....     @s_rrr_shi
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     }
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     }
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     }
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     }
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     }
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     }
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   ]
133   MOV_rxri       1110101 0010 . 1111 0 ... .... .... ....     @s_rxr_shi
134   ORR_rrri       1110101 0010 . .... 0 ... .... .... ....     @s_rrr_shi
136   # v8.1M CSEL and friends
137   CSEL           1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4
140   MVN_rxri       1110101 0011 . 1111 0 ... .... .... ....     @s_rxr_shi
141   ORN_rrri       1110101 0011 . .... 0 ... .... .... ....     @s_rrr_shi
144   TEQ_xrri       1110101 0100 1 .... 0 ... 1111 .... ....     @S_xrr_shi
145   EOR_rrri       1110101 0100 . .... 0 ... .... .... ....     @s_rrr_shi
147 PKH              1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
148                  &pkh imm=%imm5_12_6
150   CMN_xrri       1110101 1000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
151   ADD_rrri       1110101 1000 . .... 0 ... .... .... ....     @s_rrr_shi
153 ADC_rrri         1110101 1010 . .... 0 ... .... .... ....     @s_rrr_shi
154 SBC_rrri         1110101 1011 . .... 0 ... .... .... ....     @s_rrr_shi
156   CMP_xrri       1110101 1101 1 .... 0 ... 1111 .... ....     @S_xrr_shi
157   SUB_rrri       1110101 1101 . .... 0 ... .... .... ....     @s_rrr_shi
159 RSB_rrri         1110101 1110 . .... 0 ... .... .... ....     @s_rrr_shi
161 # Data-processing (register-shifted register)
163 MOV_rxrr         1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
164                  &s_rrr_shr rn=0
166 # Data-processing (immediate)
168 %t32extrot       26:1 12:3 0:8  !function=t32_expandimm_rot
169 %t32extimm       26:1 12:3 0:8  !function=t32_expandimm_imm
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
179   TST_xri        1111 0.0 0000 1 .... 0 ... 1111 ........     @S_xri_rot
180   AND_rri        1111 0.0 0000 . .... 0 ... .... ........     @s_rri_rot
182 BIC_rri          1111 0.0 0001 . .... 0 ... .... ........     @s_rri_rot
184   MOV_rxi        1111 0.0 0010 . 1111 0 ... .... ........     @s_rxi_rot
185   ORR_rri        1111 0.0 0010 . .... 0 ... .... ........     @s_rri_rot
188   MVN_rxi        1111 0.0 0011 . 1111 0 ... .... ........     @s_rxi_rot
189   ORN_rri        1111 0.0 0011 . .... 0 ... .... ........     @s_rri_rot
192   TEQ_xri        1111 0.0 0100 1 .... 0 ... 1111 ........     @S_xri_rot
193   EOR_rri        1111 0.0 0100 . .... 0 ... .... ........     @s_rri_rot
196   CMN_xri        1111 0.0 1000 1 .... 0 ... 1111 ........     @S_xri_rot
197   ADD_rri        1111 0.0 1000 . .... 0 ... .... ........     @s_rri_rot
199 ADC_rri          1111 0.0 1010 . .... 0 ... .... ........     @s_rri_rot
200 SBC_rri          1111 0.0 1011 . .... 0 ... .... ........     @s_rri_rot
202   CMP_xri        1111 0.0 1101 1 .... 0 ... 1111 ........     @S_xri_rot
203   SUB_rri        1111 0.0 1101 . .... 0 ... .... ........     @s_rri_rot
205 RSB_rri          1111 0.0 1110 . .... 0 ... .... ........     @s_rri_rot
207 # Data processing (plain binary immediate)
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
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
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
225 # Move Wide
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
231 MOVW             1111 0.10 0100 .... 0 ... .... ........      @mov16
232 MOVT             1111 0.10 1100 .... 0 ... .... ........      @mov16
234 # Saturate, bitfield
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
242   SSAT16         1111 0011 001 0 .... 0 000 .... 00 0 .....   @sat16
243   SSAT           1111 0011 00. 0 .... 0 ... .... .. 0 .....   @sat
246   USAT16         1111 0011 101 0 .... 0 000 .... 00 0 .....   @sat16
247   USAT           1111 0011 10. 0 .... 0 ... .... .. 0 .....   @sat
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
255 SBFX             1111 0011 010 0 .... 0 ... .... ..0.....     @bfx
256 UBFX             1111 0011 110 0 .... 0 ... .... ..0.....     @bfx
258 # bfc is bfi w/ rn=15
259 BFCI             1111 0011 011 0 .... 0 ... .... ..0.....     @bfi
261 # Multiply and multiply accumulate
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
271   MUL            1111 1011 0000 .... 1111 .... 0000 ....      @s0_rn0dm
272   MLA            1111 1011 0000 .... .... .... 0000 ....      @s0_rnadm
274 MLS              1111 1011 0000 .... .... .... 0001 ....      @rnadm
275 SMULL            1111 1011 1000 .... .... .... 0000 ....      @s0_rnadm
276 UMULL            1111 1011 1010 .... .... .... 0000 ....      @s0_rnadm
277 SMLAL            1111 1011 1100 .... .... .... 0000 ....      @s0_rnadm
278 UMLAL            1111 1011 1110 .... .... .... 0000 ....      @s0_rnadm
279 UMAAL            1111 1011 1110 .... .... .... 0110 ....      @rnadm
281   SMULWB         1111 1011 0011 .... 1111 .... 0000 ....      @rn0dm
282   SMLAWB         1111 1011 0011 .... .... .... 0000 ....      @rnadm
285   SMULWT         1111 1011 0011 .... 1111 .... 0001 ....      @rn0dm
286   SMLAWT         1111 1011 0011 .... .... .... 0001 ....      @rnadm
289   SMULBB         1111 1011 0001 .... 1111 .... 0000 ....      @rn0dm
290   SMLABB         1111 1011 0001 .... .... .... 0000 ....      @rnadm
293   SMULBT         1111 1011 0001 .... 1111 .... 0001 ....      @rn0dm
294   SMLABT         1111 1011 0001 .... .... .... 0001 ....      @rnadm
297   SMULTB         1111 1011 0001 .... 1111 .... 0010 ....      @rn0dm
298   SMLATB         1111 1011 0001 .... .... .... 0010 ....      @rnadm
301   SMULTT         1111 1011 0001 .... 1111 .... 0011 ....      @rn0dm
302   SMLATT         1111 1011 0001 .... .... .... 0011 ....      @rnadm
304 SMLALBB          1111 1011 1100 .... .... .... 1000 ....      @rnadm
305 SMLALBT          1111 1011 1100 .... .... .... 1001 ....      @rnadm
306 SMLALTB          1111 1011 1100 .... .... .... 1010 ....      @rnadm
307 SMLALTT          1111 1011 1100 .... .... .... 1011 ....      @rnadm
309 # usad8 is usada8 w/ ra=15
310 USADA8           1111 1011 0111 .... .... .... 0000 ....      @rnadm
312 SMLAD            1111 1011 0010 .... .... .... 0000 ....      @rnadm
313 SMLADX           1111 1011 0010 .... .... .... 0001 ....      @rnadm
314 SMLSD            1111 1011 0100 .... .... .... 0000 ....      @rnadm
315 SMLSDX           1111 1011 0100 .... .... .... 0001 ....      @rnadm
317 SMLALD           1111 1011 1100 .... .... .... 1100 ....      @rnadm
318 SMLALDX          1111 1011 1100 .... .... .... 1101 ....      @rnadm
319 SMLSLD           1111 1011 1101 .... .... .... 1100 ....      @rnadm
320 SMLSLDX          1111 1011 1101 .... .... .... 1101 ....      @rnadm
322 SMMLA            1111 1011 0101 .... .... .... 0000 ....      @rnadm
323 SMMLAR           1111 1011 0101 .... .... .... 0001 ....      @rnadm
324 SMMLS            1111 1011 0110 .... .... .... 0000 ....      @rnadm
325 SMMLSR           1111 1011 0110 .... .... .... 0001 ....      @rnadm
327 SDIV             1111 1011 1001 .... 1111 .... 1111 ....      @rndm
328 UDIV             1111 1011 1011 .... 1111 .... 1111 ....      @rndm
330 # Data-processing (two source registers)
332 QADD             1111 1010 1000 .... 1111 .... 1000 ....      @rndm
333 QSUB             1111 1010 1000 .... 1111 .... 1010 ....      @rndm
334 QDADD            1111 1010 1000 .... 1111 .... 1001 ....      @rndm
335 QDSUB            1111 1010 1000 .... 1111 .... 1011 ....      @rndm
337 CRC32B           1111 1010 1100 .... 1111 .... 1000 ....      @rndm
338 CRC32H           1111 1010 1100 .... 1111 .... 1001 ....      @rndm
339 CRC32W           1111 1010 1100 .... 1111 .... 1010 ....      @rndm
340 CRC32CB          1111 1010 1101 .... 1111 .... 1000 ....      @rndm
341 CRC32CH          1111 1010 1101 .... 1111 .... 1001 ....      @rndm
342 CRC32CW          1111 1010 1101 .... 1111 .... 1010 ....      @rndm
344 SEL              1111 1010 1010 .... 1111 .... 1000 ....      @rndm
346 # Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
347 REV              1111 1010 1001 ---- 1111 .... 1000 ....      @rdm
348 REV16            1111 1010 1001 ---- 1111 .... 1001 ....      @rdm
349 RBIT             1111 1010 1001 ---- 1111 .... 1010 ....      @rdm
350 REVSH            1111 1010 1001 ---- 1111 .... 1011 ....      @rdm
351 CLZ              1111 1010 1011 ---- 1111 .... 1000 ....      @rdm
353 # Branches and miscellaneous control
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
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
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
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
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 ---- ----
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     }
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
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
425 # Load/store (register, immediate, literal)
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
440 STRB_rr          1111 1000 0000 .... .... 000000 .. ....      @ldst_rr
441 STRB_ri          1111 1000 0000 .... .... 1..1 ........       @ldst_ri_idx
442 STRB_ri          1111 1000 0000 .... .... 1100 ........       @ldst_ri_neg
443 STRBT_ri         1111 1000 0000 .... .... 1110 ........       @ldst_ri_unp
444 STRB_ri          1111 1000 1000 .... .... ............        @ldst_ri_pos
446 STRH_rr          1111 1000 0010 .... .... 000000 .. ....      @ldst_rr
447 STRH_ri          1111 1000 0010 .... .... 1..1 ........       @ldst_ri_idx
448 STRH_ri          1111 1000 0010 .... .... 1100 ........       @ldst_ri_neg
449 STRHT_ri         1111 1000 0010 .... .... 1110 ........       @ldst_ri_unp
450 STRH_ri          1111 1000 1010 .... .... ............        @ldst_ri_pos
452 STR_rr           1111 1000 0100 .... .... 000000 .. ....      @ldst_rr
453 STR_ri           1111 1000 0100 .... .... 1..1 ........       @ldst_ri_idx
454 STR_ri           1111 1000 0100 .... .... 1100 ........       @ldst_ri_neg
455 STRT_ri          1111 1000 0100 .... .... 1110 ........       @ldst_ri_unp
456 STR_ri           1111 1000 1100 .... .... ............        @ldst_ri_pos
458 # Note that Load, unsigned (literal) overlaps all other load encodings.
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   }
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   }
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
507 # NOPs here are PLI.
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   }
528 # NOPs here are unallocated memory hints, treated as NOP.
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   }
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
555 STRD_ri_t32      1110 1000 .110 .... .... .... ........    @ldstd_ri8 w=1 p=0
556 LDRD_ri_t32      1110 1000 .111 .... .... .... ........    @ldstd_ri8 w=1 p=0
558 STRD_ri_t32      1110 1001 .100 .... .... .... ........    @ldstd_ri8 w=0 p=1
559 LDRD_ri_t32      1110 1001 .101 .... .... .... ........    @ldstd_ri8 w=0 p=1
561 STRD_ri_t32      1110 1001 .110 .... .... .... ........    @ldstd_ri8 w=1 p=1
563   SG             1110 1001 0111 1111 1110 1001 01111111
564   LDRD_ri_t32    1110 1001 .111 .... .... .... ........    @ldstd_ri8 w=1 p=1
567 # Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
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
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
584   TT             1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
585   STREX          1110 1000 0100 .... .... .... .... ....      @strex_i
587 STREXB           1110 1000 1100 .... .... 1111 0100 ....      @strex_0
588 STREXH           1110 1000 1100 .... .... 1111 0101 ....      @strex_0
589 STREXD_t32       1110 1000 1100 .... .... .... 0111 ....      @strex_d
591 STLEX            1110 1000 1100 .... .... 1111 1110 ....      @strex_0
592 STLEXB           1110 1000 1100 .... .... 1111 1100 ....      @strex_0
593 STLEXH           1110 1000 1100 .... .... 1111 1101 ....      @strex_0
594 STLEXD_t32       1110 1000 1100 .... .... .... 1111 ....      @strex_d
596 STL              1110 1000 1100 .... .... 1111 1010 1111      @ldrex_0
597 STLB             1110 1000 1100 .... .... 1111 1000 1111      @ldrex_0
598 STLH             1110 1000 1100 .... .... 1111 1001 1111      @ldrex_0
600 LDREX            1110 1000 0101 .... .... 1111 .... ....      @ldrex_i
601 LDREXB           1110 1000 1101 .... .... 1111 0100 1111      @ldrex_0
602 LDREXH           1110 1000 1101 .... .... 1111 0101 1111      @ldrex_0
603 LDREXD_t32       1110 1000 1101 .... .... .... 0111 1111      @ldrex_d
605 LDAEX            1110 1000 1101 .... .... 1111 1110 1111      @ldrex_0
606 LDAEXB           1110 1000 1101 .... .... 1111 1100 1111      @ldrex_0
607 LDAEXH           1110 1000 1101 .... .... 1111 1101 1111      @ldrex_0
608 LDAEXD_t32       1110 1000 1101 .... .... .... 1111 1111      @ldrex_d
610 LDA              1110 1000 1101 .... .... 1111 1010 1111      @ldrex_0
611 LDAB             1110 1000 1101 .... .... 1111 1000 1111      @ldrex_0
612 LDAH             1110 1000 1101 .... .... 1111 1001 1111      @ldrex_0
614 &tbranch         rn rm
615 @tbranch         .... .... .... rn:4 .... .... .... rm:4      &tbranch
617 TBB              1110 1000 1101 .... 1111 0000 0000 ....      @tbranch
618 TBH              1110 1000 1101 .... 1111 0000 0001 ....      @tbranch
620 # Parallel addition and subtraction
622 SADD8            1111 1010 1000 .... 1111 .... 0000 ....      @rndm
623 QADD8            1111 1010 1000 .... 1111 .... 0001 ....      @rndm
624 SHADD8           1111 1010 1000 .... 1111 .... 0010 ....      @rndm
625 UADD8            1111 1010 1000 .... 1111 .... 0100 ....      @rndm
626 UQADD8           1111 1010 1000 .... 1111 .... 0101 ....      @rndm
627 UHADD8           1111 1010 1000 .... 1111 .... 0110 ....      @rndm
629 SADD16           1111 1010 1001 .... 1111 .... 0000 ....      @rndm
630 QADD16           1111 1010 1001 .... 1111 .... 0001 ....      @rndm
631 SHADD16          1111 1010 1001 .... 1111 .... 0010 ....      @rndm
632 UADD16           1111 1010 1001 .... 1111 .... 0100 ....      @rndm
633 UQADD16          1111 1010 1001 .... 1111 .... 0101 ....      @rndm
634 UHADD16          1111 1010 1001 .... 1111 .... 0110 ....      @rndm
636 SASX             1111 1010 1010 .... 1111 .... 0000 ....      @rndm
637 QASX             1111 1010 1010 .... 1111 .... 0001 ....      @rndm
638 SHASX            1111 1010 1010 .... 1111 .... 0010 ....      @rndm
639 UASX             1111 1010 1010 .... 1111 .... 0100 ....      @rndm
640 UQASX            1111 1010 1010 .... 1111 .... 0101 ....      @rndm
641 UHASX            1111 1010 1010 .... 1111 .... 0110 ....      @rndm
643 SSUB8            1111 1010 1100 .... 1111 .... 0000 ....      @rndm
644 QSUB8            1111 1010 1100 .... 1111 .... 0001 ....      @rndm
645 SHSUB8           1111 1010 1100 .... 1111 .... 0010 ....      @rndm
646 USUB8            1111 1010 1100 .... 1111 .... 0100 ....      @rndm
647 UQSUB8           1111 1010 1100 .... 1111 .... 0101 ....      @rndm
648 UHSUB8           1111 1010 1100 .... 1111 .... 0110 ....      @rndm
650 SSUB16           1111 1010 1101 .... 1111 .... 0000 ....      @rndm
651 QSUB16           1111 1010 1101 .... 1111 .... 0001 ....      @rndm
652 SHSUB16          1111 1010 1101 .... 1111 .... 0010 ....      @rndm
653 USUB16           1111 1010 1101 .... 1111 .... 0100 ....      @rndm
654 UQSUB16          1111 1010 1101 .... 1111 .... 0101 ....      @rndm
655 UHSUB16          1111 1010 1101 .... 1111 .... 0110 ....      @rndm
657 SSAX             1111 1010 1110 .... 1111 .... 0000 ....      @rndm
658 QSAX             1111 1010 1110 .... 1111 .... 0001 ....      @rndm
659 SHSAX            1111 1010 1110 .... 1111 .... 0010 ....      @rndm
660 USAX             1111 1010 1110 .... 1111 .... 0100 ....      @rndm
661 UQSAX            1111 1010 1110 .... 1111 .... 0101 ....      @rndm
662 UHSAX            1111 1010 1110 .... 1111 .... 0110 ....      @rndm
664 # Register extends
666 @rrr_rot         .... .... .... rn:4 .... rd:4 .. rot:2 rm:4  &rrr_rot
668 SXTAH            1111 1010 0000 .... 1111 .... 10.. ....      @rrr_rot
669 UXTAH            1111 1010 0001 .... 1111 .... 10.. ....      @rrr_rot
670 SXTAB16          1111 1010 0010 .... 1111 .... 10.. ....      @rrr_rot
671 UXTAB16          1111 1010 0011 .... 1111 .... 10.. ....      @rrr_rot
672 SXTAB            1111 1010 0100 .... 1111 .... 10.. ....      @rrr_rot
673 UXTAB            1111 1010 0101 .... 1111 .... 10.. ....      @rrr_rot
675 # Load/store multiple
677 @ldstm           .... .... .. w:1 . rn:4 list:16              &ldst_block u=0
679 STM_t32          1110 1000 10.0 .... ................         @ldstm i=1 b=0
680 STM_t32          1110 1001 00.0 .... ................         @ldstm i=0 b=1
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
686 LDM_t32          1110 1001 00.1 .... ................         @ldstm i=0 b=1
688 &rfe             !extern rn w pu
689 @rfe             .... .... .. w:1 . rn:4 ................     &rfe
691 RFE              1110 1000 00.1 .... 1100000000000000         @rfe pu=2
692 RFE              1110 1001 10.1 .... 1100000000000000         @rfe pu=1
694 &srs             !extern mode w pu
695 @srs             .... .... .. w:1 . .... ........... mode:5   &srs
697 SRS              1110 1000 00.0 1101 1100 0000 000. ....      @srs pu=2
698 SRS              1110 1001 10.0 1101 1100 0000 000. ....      @srs pu=1
700 # Coprocessor instructions
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.
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
711 MCRR             1110 1100 0100 .... .... .... .... .... @mcrr
712 MRRC             1110 1100 0101 .... .... .... .... .... @mcrr
714 MCR              1110 1110 ... 0 .... .... .... ... 1 .... @mcr
715 MRC              1110 1110 ... 1 .... .... .... ... 1 .... @mcr
717 # Branches
719 %imm24           26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
720 @branch24        ................................             &i imm=%imm24
722 B                1111 0. .......... 10.1 ............         @branch24
723 BL               1111 0. .......... 11.1 ............         @branch24
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
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   ]