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