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