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