3 # Copyright (c) 2019 Linaro, Ltd
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License, or (at your option) any later version.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 # This file is processed by scripts/decodetree.py
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
34 &msr_reg !extern rn r mask
36 &msr_bank !extern rn r sysm
37 &mrs_bank !extern rd r sysm
38 &ldst_rr !extern p w u rn rt rm shimm shtype
39 &ldst_ri !extern p w u rn rt imm
40 &ldst_block !extern rn i b u w list
41 &strex !extern rn rd rt rt2 imm
42 &ldrex !extern rn rt rt2 imm
43 &bfx !extern rd rn lsb widthm1
44 &bfi !extern rd rn lsb msb
45 &sat !extern rd rn satimm imm sh
46 &pkh !extern rd rn rm imm tb
47 &cps !extern mode imod M A I F
48 &mcr !extern cp opc1 crn crm opc2 rt
49 &mcrr !extern cp opc1 crm rt rt2
51 # Data-processing (register)
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
63 TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi
64 AND_rrri 1110101 0000 . .... 0 ... .... .... .... @s_rrr_shi
66 BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi
68 MOV_rxri 1110101 0010 . 1111 0 ... .... .... .... @s_rxr_shi
69 ORR_rrri 1110101 0010 . .... 0 ... .... .... .... @s_rrr_shi
72 MVN_rxri 1110101 0011 . 1111 0 ... .... .... .... @s_rxr_shi
73 ORN_rrri 1110101 0011 . .... 0 ... .... .... .... @s_rrr_shi
76 TEQ_xrri 1110101 0100 1 .... 0 ... 1111 .... .... @S_xrr_shi
77 EOR_rrri 1110101 0100 . .... 0 ... .... .... .... @s_rrr_shi
79 PKH 1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
82 CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi
83 ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi
85 ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi
86 SBC_rrri 1110101 1011 . .... 0 ... .... .... .... @s_rrr_shi
88 CMP_xrri 1110101 1101 1 .... 0 ... 1111 .... .... @S_xrr_shi
89 SUB_rrri 1110101 1101 . .... 0 ... .... .... .... @s_rrr_shi
91 RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi
93 # v8.1M CSEL and friends
94 CSEL 1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4
96 # Data-processing (register-shifted register)
98 MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
101 # Data-processing (immediate)
103 %t32extrot 26:1 12:3 0:8 !function=t32_expandimm_rot
104 %t32extimm 26:1 12:3 0:8 !function=t32_expandimm_imm
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
114 TST_xri 1111 0.0 0000 1 .... 0 ... 1111 ........ @S_xri_rot
115 AND_rri 1111 0.0 0000 . .... 0 ... .... ........ @s_rri_rot
117 BIC_rri 1111 0.0 0001 . .... 0 ... .... ........ @s_rri_rot
119 MOV_rxi 1111 0.0 0010 . 1111 0 ... .... ........ @s_rxi_rot
120 ORR_rri 1111 0.0 0010 . .... 0 ... .... ........ @s_rri_rot
123 MVN_rxi 1111 0.0 0011 . 1111 0 ... .... ........ @s_rxi_rot
124 ORN_rri 1111 0.0 0011 . .... 0 ... .... ........ @s_rri_rot
127 TEQ_xri 1111 0.0 0100 1 .... 0 ... 1111 ........ @S_xri_rot
128 EOR_rri 1111 0.0 0100 . .... 0 ... .... ........ @s_rri_rot
131 CMN_xri 1111 0.0 1000 1 .... 0 ... 1111 ........ @S_xri_rot
132 ADD_rri 1111 0.0 1000 . .... 0 ... .... ........ @s_rri_rot
134 ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot
135 SBC_rri 1111 0.0 1011 . .... 0 ... .... ........ @s_rri_rot
137 CMP_xri 1111 0.0 1101 1 .... 0 ... 1111 ........ @S_xri_rot
138 SUB_rri 1111 0.0 1101 . .... 0 ... .... ........ @s_rri_rot
140 RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot
142 # Data processing (plain binary immediate)
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
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
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
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
166 MOVW 1111 0.10 0100 .... 0 ... .... ........ @mov16
167 MOVT 1111 0.10 1100 .... 0 ... .... ........ @mov16
171 @sat .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \
173 @sat16 .... .... .. . . rn:4 . ... rd:4 .. . satimm:5 \
177 SSAT16 1111 0011 001 0 .... 0 000 .... 00 0 ..... @sat16
178 SSAT 1111 0011 00. 0 .... 0 ... .... .. 0 ..... @sat
181 USAT16 1111 0011 101 0 .... 0 000 .... 00 0 ..... @sat16
182 USAT 1111 0011 10. 0 .... 0 ... .... .. 0 ..... @sat
185 @bfx .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \
187 @bfi .... .... ... . rn:4 . ... rd:4 .. . msb:5 \
190 SBFX 1111 0011 010 0 .... 0 ... .... ..0..... @bfx
191 UBFX 1111 0011 110 0 .... 0 ... .... ..0..... @bfx
193 # bfc is bfi w/ rn=15
194 BFCI 1111 0011 011 0 .... 0 ... .... ..0..... @bfi
196 # Multiply and multiply accumulate
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
206 MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm
207 MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm
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
216 SMULWB 1111 1011 0011 .... 1111 .... 0000 .... @rn0dm
217 SMLAWB 1111 1011 0011 .... .... .... 0000 .... @rnadm
220 SMULWT 1111 1011 0011 .... 1111 .... 0001 .... @rn0dm
221 SMLAWT 1111 1011 0011 .... .... .... 0001 .... @rnadm
224 SMULBB 1111 1011 0001 .... 1111 .... 0000 .... @rn0dm
225 SMLABB 1111 1011 0001 .... .... .... 0000 .... @rnadm
228 SMULBT 1111 1011 0001 .... 1111 .... 0001 .... @rn0dm
229 SMLABT 1111 1011 0001 .... .... .... 0001 .... @rnadm
232 SMULTB 1111 1011 0001 .... 1111 .... 0010 .... @rn0dm
233 SMLATB 1111 1011 0001 .... .... .... 0010 .... @rnadm
236 SMULTT 1111 1011 0001 .... 1111 .... 0011 .... @rn0dm
237 SMLATT 1111 1011 0001 .... .... .... 0011 .... @rnadm
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
244 # usad8 is usada8 w/ ra=15
245 USADA8 1111 1011 0111 .... .... .... 0000 .... @rnadm
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
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
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
262 SDIV 1111 1011 1001 .... 1111 .... 1111 .... @rndm
263 UDIV 1111 1011 1011 .... 1111 .... 1111 .... @rndm
265 # Data-processing (two source registers)
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
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
279 SEL 1111 1010 1010 .... 1111 .... 1000 .... @rndm
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
288 # Branches and miscellaneous control
292 %imm16_16_0 16:4 0:12
293 %imm21 26:s1 11:1 13:1 16:6 0:11 !function=times_2
297 # Group insn[25:23] = 111, which is cond=111x for the branch below,
298 # or unconditional, which would be illegal for the branch.
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
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
310 # For M-profile minimal-RAS ESB can be a NOP, which is the
311 # default behaviour since it is in the hint space.
312 # ESB 1111 0011 1010 1111 1000 0000 0001 0000
314 # The canonical nop ends in 0000 0000, but the whole rest
315 # of the space is "reserved hint, behaves as nop".
316 NOP 1111 0011 1010 1111 1000 0000 ---- ----
318 # If imod == '00' && M == '0' then SEE "Hint instructions", above.
319 CPS 1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \
323 # Miscellaneous control
324 CLREX 1111 0011 1011 1111 1000 1111 0010 1111
325 DSB 1111 0011 1011 1111 1000 1111 0100 ----
326 DMB 1111 0011 1011 1111 1000 1111 0101 ----
327 ISB 1111 0011 1011 1111 1000 1111 0110 ----
328 SB 1111 0011 1011 1111 1000 1111 0111 0000
330 # Note that the v7m insn overlaps both the normal and banked insn.
332 MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \
333 &mrs_bank sysm=%mrs_sysm
334 MRS_reg 1111 0011 111 r:1 1111 1000 rd:4 0000 0000 &mrs_reg
335 MRS_v7m 1111 0011 111 0 1111 1000 rd:4 sysm:8
338 MSR_bank 1111 0011 100 r:1 rn:4 1000 .... 001. 0000 \
339 &msr_bank sysm=%msr_sysm
340 MSR_reg 1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000 &msr_reg
341 MSR_v7m 1111 0011 100 0 rn:4 1000 mask:2 00 sysm:8
343 BXJ 1111 0011 1100 rm:4 1000 1111 0000 0000 &r
345 # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
346 # every other encoding of SUBS. With v7VE, IMM=0 is redefined as ERET.
347 # The distinction between the two only matters for Hyp mode.
348 ERET 1111 0011 1101 1110 1000 1111 0000 0000
349 SUB_rri 1111 0011 1101 1110 1000 1111 imm:8 \
350 &s_rri_rot rot=0 s=1 rd=15 rn=14
352 SMC 1111 0111 1111 imm:4 1000 0000 0000 0000 &i
353 HVC 1111 0111 1110 .... 1000 .... .... .... \
355 UDF 1111 0111 1111 ---- 1010 ---- ---- ----
357 B_cond_thumb 1111 0. cond:4 ...... 10.0 ............ &ci imm=%imm21
360 # Load/store (register, immediate, literal)
362 @ldst_rr .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \
363 &ldst_rr p=1 w=0 u=1 shtype=0
364 @ldst_ri_idx .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \
366 @ldst_ri_neg .... .... .... rn:4 rt:4 .... imm:8 \
368 @ldst_ri_unp .... .... .... rn:4 rt:4 .... imm:8 \
370 @ldst_ri_pos .... .... .... rn:4 rt:4 imm:12 \
372 @ldst_ri_lit .... .... u:1 ... .... rt:4 imm:12 \
373 &ldst_ri p=1 w=0 rn=15
375 STRB_rr 1111 1000 0000 .... .... 000000 .. .... @ldst_rr
376 STRB_ri 1111 1000 0000 .... .... 1..1 ........ @ldst_ri_idx
377 STRB_ri 1111 1000 0000 .... .... 1100 ........ @ldst_ri_neg
378 STRBT_ri 1111 1000 0000 .... .... 1110 ........ @ldst_ri_unp
379 STRB_ri 1111 1000 1000 .... .... ............ @ldst_ri_pos
381 STRH_rr 1111 1000 0010 .... .... 000000 .. .... @ldst_rr
382 STRH_ri 1111 1000 0010 .... .... 1..1 ........ @ldst_ri_idx
383 STRH_ri 1111 1000 0010 .... .... 1100 ........ @ldst_ri_neg
384 STRHT_ri 1111 1000 0010 .... .... 1110 ........ @ldst_ri_unp
385 STRH_ri 1111 1000 1010 .... .... ............ @ldst_ri_pos
387 STR_rr 1111 1000 0100 .... .... 000000 .. .... @ldst_rr
388 STR_ri 1111 1000 0100 .... .... 1..1 ........ @ldst_ri_idx
389 STR_ri 1111 1000 0100 .... .... 1100 ........ @ldst_ri_neg
390 STRT_ri 1111 1000 0100 .... .... 1110 ........ @ldst_ri_unp
391 STR_ri 1111 1000 1100 .... .... ............ @ldst_ri_pos
393 # Note that Load, unsigned (literal) overlaps all other load encodings.
396 NOP 1111 1000 -001 1111 1111 ------------ # PLD
397 LDRB_ri 1111 1000 .001 1111 .... ............ @ldst_ri_lit
400 NOP 1111 1000 1001 ---- 1111 ------------ # PLD
401 LDRB_ri 1111 1000 1001 .... .... ............ @ldst_ri_pos
403 LDRB_ri 1111 1000 0001 .... .... 1..1 ........ @ldst_ri_idx
405 NOP 1111 1000 0001 ---- 1111 1100 -------- # PLD
406 LDRB_ri 1111 1000 0001 .... .... 1100 ........ @ldst_ri_neg
408 LDRBT_ri 1111 1000 0001 .... .... 1110 ........ @ldst_ri_unp
410 NOP 1111 1000 0001 ---- 1111 000000 -- ---- # PLD
411 LDRB_rr 1111 1000 0001 .... .... 000000 .. .... @ldst_rr
416 NOP 1111 1000 -011 1111 1111 ------------ # PLD
417 LDRH_ri 1111 1000 .011 1111 .... ............ @ldst_ri_lit
420 NOP 1111 1000 1011 ---- 1111 ------------ # PLDW
421 LDRH_ri 1111 1000 1011 .... .... ............ @ldst_ri_pos
423 LDRH_ri 1111 1000 0011 .... .... 1..1 ........ @ldst_ri_idx
425 NOP 1111 1000 0011 ---- 1111 1100 -------- # PLDW
426 LDRH_ri 1111 1000 0011 .... .... 1100 ........ @ldst_ri_neg
428 LDRHT_ri 1111 1000 0011 .... .... 1110 ........ @ldst_ri_unp
430 NOP 1111 1000 0011 ---- 1111 000000 -- ---- # PLDW
431 LDRH_rr 1111 1000 0011 .... .... 000000 .. .... @ldst_rr
435 LDR_ri 1111 1000 .101 1111 .... ............ @ldst_ri_lit
436 LDR_ri 1111 1000 1101 .... .... ............ @ldst_ri_pos
437 LDR_ri 1111 1000 0101 .... .... 1..1 ........ @ldst_ri_idx
438 LDR_ri 1111 1000 0101 .... .... 1100 ........ @ldst_ri_neg
439 LDRT_ri 1111 1000 0101 .... .... 1110 ........ @ldst_ri_unp
440 LDR_rr 1111 1000 0101 .... .... 000000 .. .... @ldst_rr
445 NOP 1111 1001 -001 1111 1111 ------------
446 LDRSB_ri 1111 1001 .001 1111 .... ............ @ldst_ri_lit
449 NOP 1111 1001 1001 ---- 1111 ------------
450 LDRSB_ri 1111 1001 1001 .... .... ............ @ldst_ri_pos
452 LDRSB_ri 1111 1001 0001 .... .... 1..1 ........ @ldst_ri_idx
454 NOP 1111 1001 0001 ---- 1111 1100 --------
455 LDRSB_ri 1111 1001 0001 .... .... 1100 ........ @ldst_ri_neg
457 LDRSBT_ri 1111 1001 0001 .... .... 1110 ........ @ldst_ri_unp
459 NOP 1111 1001 0001 ---- 1111 000000 -- ----
460 LDRSB_rr 1111 1001 0001 .... .... 000000 .. .... @ldst_rr
463 # NOPs here are unallocated memory hints, treated as NOP.
466 NOP 1111 1001 -011 1111 1111 ------------
467 LDRSH_ri 1111 1001 .011 1111 .... ............ @ldst_ri_lit
470 NOP 1111 1001 1011 ---- 1111 ------------
471 LDRSH_ri 1111 1001 1011 .... .... ............ @ldst_ri_pos
473 LDRSH_ri 1111 1001 0011 .... .... 1..1 ........ @ldst_ri_idx
475 NOP 1111 1001 0011 ---- 1111 1100 --------
476 LDRSH_ri 1111 1001 0011 .... .... 1100 ........ @ldst_ri_neg
478 LDRSHT_ri 1111 1001 0011 .... .... 1110 ........ @ldst_ri_unp
480 NOP 1111 1001 0011 ---- 1111 000000 -- ----
481 LDRSH_rr 1111 1001 0011 .... .... 000000 .. .... @ldst_rr
485 %imm8x4 0:8 !function=times_4
486 &ldst_ri2 p w u rn rt rt2 imm
487 @ldstd_ri8 .... .... u:1 ... rn:4 rt:4 rt2:4 ........ \
488 &ldst_ri2 imm=%imm8x4
490 STRD_ri_t32 1110 1000 .110 .... .... .... ........ @ldstd_ri8 w=1 p=0
491 LDRD_ri_t32 1110 1000 .111 .... .... .... ........ @ldstd_ri8 w=1 p=0
493 STRD_ri_t32 1110 1001 .100 .... .... .... ........ @ldstd_ri8 w=0 p=1
494 LDRD_ri_t32 1110 1001 .101 .... .... .... ........ @ldstd_ri8 w=0 p=1
496 STRD_ri_t32 1110 1001 .110 .... .... .... ........ @ldstd_ri8 w=1 p=1
498 SG 1110 1001 0111 1111 1110 1001 01111111
499 LDRD_ri_t32 1110 1001 .111 .... .... .... ........ @ldstd_ri8 w=1 p=1
502 # Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
504 @strex_i .... .... .... rn:4 rt:4 rd:4 .... .... \
505 &strex rt2=15 imm=%imm8x4
506 @strex_0 .... .... .... rn:4 rt:4 .... .... rd:4 \
508 @strex_d .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
511 @ldrex_i .... .... .... rn:4 rt:4 .... .... .... \
512 &ldrex rt2=15 imm=%imm8x4
513 @ldrex_0 .... .... .... rn:4 rt:4 .... .... .... \
515 @ldrex_d .... .... .... rn:4 rt:4 rt2:4 .... .... \
519 TT 1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
520 STREX 1110 1000 0100 .... .... .... .... .... @strex_i
522 STREXB 1110 1000 1100 .... .... 1111 0100 .... @strex_0
523 STREXH 1110 1000 1100 .... .... 1111 0101 .... @strex_0
524 STREXD_t32 1110 1000 1100 .... .... .... 0111 .... @strex_d
526 STLEX 1110 1000 1100 .... .... 1111 1110 .... @strex_0
527 STLEXB 1110 1000 1100 .... .... 1111 1100 .... @strex_0
528 STLEXH 1110 1000 1100 .... .... 1111 1101 .... @strex_0
529 STLEXD_t32 1110 1000 1100 .... .... .... 1111 .... @strex_d
531 STL 1110 1000 1100 .... .... 1111 1010 1111 @ldrex_0
532 STLB 1110 1000 1100 .... .... 1111 1000 1111 @ldrex_0
533 STLH 1110 1000 1100 .... .... 1111 1001 1111 @ldrex_0
535 LDREX 1110 1000 0101 .... .... 1111 .... .... @ldrex_i
536 LDREXB 1110 1000 1101 .... .... 1111 0100 1111 @ldrex_0
537 LDREXH 1110 1000 1101 .... .... 1111 0101 1111 @ldrex_0
538 LDREXD_t32 1110 1000 1101 .... .... .... 0111 1111 @ldrex_d
540 LDAEX 1110 1000 1101 .... .... 1111 1110 1111 @ldrex_0
541 LDAEXB 1110 1000 1101 .... .... 1111 1100 1111 @ldrex_0
542 LDAEXH 1110 1000 1101 .... .... 1111 1101 1111 @ldrex_0
543 LDAEXD_t32 1110 1000 1101 .... .... .... 1111 1111 @ldrex_d
545 LDA 1110 1000 1101 .... .... 1111 1010 1111 @ldrex_0
546 LDAB 1110 1000 1101 .... .... 1111 1000 1111 @ldrex_0
547 LDAH 1110 1000 1101 .... .... 1111 1001 1111 @ldrex_0
550 @tbranch .... .... .... rn:4 .... .... .... rm:4 &tbranch
552 TBB 1110 1000 1101 .... 1111 0000 0000 .... @tbranch
553 TBH 1110 1000 1101 .... 1111 0000 0001 .... @tbranch
555 # Parallel addition and subtraction
557 SADD8 1111 1010 1000 .... 1111 .... 0000 .... @rndm
558 QADD8 1111 1010 1000 .... 1111 .... 0001 .... @rndm
559 SHADD8 1111 1010 1000 .... 1111 .... 0010 .... @rndm
560 UADD8 1111 1010 1000 .... 1111 .... 0100 .... @rndm
561 UQADD8 1111 1010 1000 .... 1111 .... 0101 .... @rndm
562 UHADD8 1111 1010 1000 .... 1111 .... 0110 .... @rndm
564 SADD16 1111 1010 1001 .... 1111 .... 0000 .... @rndm
565 QADD16 1111 1010 1001 .... 1111 .... 0001 .... @rndm
566 SHADD16 1111 1010 1001 .... 1111 .... 0010 .... @rndm
567 UADD16 1111 1010 1001 .... 1111 .... 0100 .... @rndm
568 UQADD16 1111 1010 1001 .... 1111 .... 0101 .... @rndm
569 UHADD16 1111 1010 1001 .... 1111 .... 0110 .... @rndm
571 SASX 1111 1010 1010 .... 1111 .... 0000 .... @rndm
572 QASX 1111 1010 1010 .... 1111 .... 0001 .... @rndm
573 SHASX 1111 1010 1010 .... 1111 .... 0010 .... @rndm
574 UASX 1111 1010 1010 .... 1111 .... 0100 .... @rndm
575 UQASX 1111 1010 1010 .... 1111 .... 0101 .... @rndm
576 UHASX 1111 1010 1010 .... 1111 .... 0110 .... @rndm
578 SSUB8 1111 1010 1100 .... 1111 .... 0000 .... @rndm
579 QSUB8 1111 1010 1100 .... 1111 .... 0001 .... @rndm
580 SHSUB8 1111 1010 1100 .... 1111 .... 0010 .... @rndm
581 USUB8 1111 1010 1100 .... 1111 .... 0100 .... @rndm
582 UQSUB8 1111 1010 1100 .... 1111 .... 0101 .... @rndm
583 UHSUB8 1111 1010 1100 .... 1111 .... 0110 .... @rndm
585 SSUB16 1111 1010 1101 .... 1111 .... 0000 .... @rndm
586 QSUB16 1111 1010 1101 .... 1111 .... 0001 .... @rndm
587 SHSUB16 1111 1010 1101 .... 1111 .... 0010 .... @rndm
588 USUB16 1111 1010 1101 .... 1111 .... 0100 .... @rndm
589 UQSUB16 1111 1010 1101 .... 1111 .... 0101 .... @rndm
590 UHSUB16 1111 1010 1101 .... 1111 .... 0110 .... @rndm
592 SSAX 1111 1010 1110 .... 1111 .... 0000 .... @rndm
593 QSAX 1111 1010 1110 .... 1111 .... 0001 .... @rndm
594 SHSAX 1111 1010 1110 .... 1111 .... 0010 .... @rndm
595 USAX 1111 1010 1110 .... 1111 .... 0100 .... @rndm
596 UQSAX 1111 1010 1110 .... 1111 .... 0101 .... @rndm
597 UHSAX 1111 1010 1110 .... 1111 .... 0110 .... @rndm
601 @rrr_rot .... .... .... rn:4 .... rd:4 .. rot:2 rm:4 &rrr_rot
603 SXTAH 1111 1010 0000 .... 1111 .... 10.. .... @rrr_rot
604 UXTAH 1111 1010 0001 .... 1111 .... 10.. .... @rrr_rot
605 SXTAB16 1111 1010 0010 .... 1111 .... 10.. .... @rrr_rot
606 UXTAB16 1111 1010 0011 .... 1111 .... 10.. .... @rrr_rot
607 SXTAB 1111 1010 0100 .... 1111 .... 10.. .... @rrr_rot
608 UXTAB 1111 1010 0101 .... 1111 .... 10.. .... @rrr_rot
610 # Load/store multiple
612 @ldstm .... .... .. w:1 . rn:4 list:16 &ldst_block u=0
614 STM_t32 1110 1000 10.0 .... ................ @ldstm i=1 b=0
615 STM_t32 1110 1001 00.0 .... ................ @ldstm i=0 b=1
617 # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding
618 CLRM 1110 1000 1001 1111 list:16
619 LDM_t32 1110 1000 10.1 .... ................ @ldstm i=1 b=0
621 LDM_t32 1110 1001 00.1 .... ................ @ldstm i=0 b=1
624 @rfe .... .... .. w:1 . rn:4 ................ &rfe
626 RFE 1110 1000 00.1 .... 1100000000000000 @rfe pu=2
627 RFE 1110 1001 10.1 .... 1100000000000000 @rfe pu=1
629 &srs !extern mode w pu
630 @srs .... .... .. w:1 . .... ........... mode:5 &srs
632 SRS 1110 1000 00.0 1101 1100 0000 000. .... @srs pu=2
633 SRS 1110 1001 10.0 1101 1100 0000 000. .... @srs pu=1
635 # Coprocessor instructions
637 # We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
638 # other coprocessor instructions always UNDEF.
639 # The trans_ functions for these will ignore cp values 8..13 for v7 or
640 # earlier, and 0..13 for v8 and later, because those areas of the
641 # encoding space may be used for other things, such as VFP or Neon.
643 @mcr .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4
644 @mcrr .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4
646 MCRR 1110 1100 0100 .... .... .... .... .... @mcrr
647 MRRC 1110 1100 0101 .... .... .... .... .... @mcrr
649 MCR 1110 1110 ... 0 .... .... .... ... 1 .... @mcr
650 MRC 1110 1110 ... 1 .... .... .... ... 1 .... @mcr
654 %imm24 26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
655 @branch24 ................................ &i imm=%imm24
657 B 1111 0. .......... 10.1 ............ @branch24
658 BL 1111 0. .......... 11.1 ............ @branch24
660 # BLX_i is non-M-profile only
661 BLX_i 1111 0. .......... 11.0 ............ @branch24
662 # M-profile only: loop and branch insns
664 # All these BF insns have boff != 0b0000; we NOP them all
665 BF 1111 0 boff:4 ------- 1100 - ---------- 1 # BFL
666 BF 1111 0 boff:4 0 ------ 1110 - ---------- 1 # BFCSEL
667 BF 1111 0 boff:4 10 ----- 1110 - ---------- 1 # BF
668 BF 1111 0 boff:4 11 ----- 1110 0 0000000000 1 # BFX, BFLX
671 # LE and WLS immediate
672 %lob_imm 1:10 11:1 !function=times_2
674 DLS 1111 0 0000 100 rn:4 1110 0000 0000 0001
675 WLS 1111 0 0000 100 rn:4 1100 . .......... 1 imm=%lob_imm
676 LE 1111 0 0000 0 f:1 0 1111 1100 . .......... 1 imm=%lob_imm