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