master
decode 751 lines 31.3 KB
Raw
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 &mve_shl_ri rdalo rdahi shim
52 &mve_shl_rr rdalo rdahi rm
53 &mve_sh_ri rda shim
54 &mve_sh_rr rda rm
55
56 # rdahi: bits [3:1] from insn, bit 0 is 1
57 # rdalo: bits [3:1] from insn, bit 0 is 0
58 %rdahi_9 9:3 !function=times_2_plus_1
59 %rdalo_17 17:3 !function=times_2
60
61 # Data-processing (register)
62
63 %imm5_12_6 12:3 6:2
64
65 @s_rrr_shi ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \
66 &s_rrr_shi shim=%imm5_12_6
67 @s_rxr_shi ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \
68 &s_rrr_shi shim=%imm5_12_6 rn=0
69 @S_xrr_shi ....... .... . rn:4 .... .... .. shty:2 rm:4 \
70 &s_rrr_shi shim=%imm5_12_6 s=1 rd=0
71
72 @mve_shl_ri ....... .... . ... . . ... ... . .. .. .... \
73 &mve_shl_ri shim=%imm5_12_6 rdalo=%rdalo_17 rdahi=%rdahi_9
74 @mve_shl_rr ....... .... . ... . rm:4 ... . .. .. .... \
75 &mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9
76 @mve_sh_ri ....... .... . rda:4 . ... ... . .. .. .... \
77 &mve_sh_ri shim=%imm5_12_6
78 @mve_sh_rr ....... .... . rda:4 rm:4 .... .... .... &mve_sh_rr
79
80 {
81 TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi
82 AND_rrri 1110101 0000 . .... 0 ... .... .... .... @s_rrr_shi
83 }
84 BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi
85 {
86 # The v8.1M MVE shift insns overlap in encoding with MOVS/ORRS
87 # and are distinguished by having Rm==13 or 15. Those are UNPREDICTABLE
88 # cases for MOVS/ORRS. We decode the MVE cases first, ensuring that
89 # they explicitly call unallocated_encoding() for cases that must UNDEF
90 # (eg "using a new shift insn on a v8.1M CPU without MVE"), and letting
91 # the rest fall through (where ORR_rrri and MOV_rxri will end up
92 # handling them as r13 and r15 accesses with the same semantics as A32).
93 [
94 {
95 UQSHL_ri 1110101 0010 1 .... 0 ... 1111 .. 00 1111 @mve_sh_ri
96 LSLL_ri 1110101 0010 1 ... 0 0 ... ... 1 .. 00 1111 @mve_shl_ri
97 UQSHLL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 00 1111 @mve_shl_ri
98 }
99
100 {
101 URSHR_ri 1110101 0010 1 .... 0 ... 1111 .. 01 1111 @mve_sh_ri
102 LSRL_ri 1110101 0010 1 ... 0 0 ... ... 1 .. 01 1111 @mve_shl_ri
103 URSHRL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 01 1111 @mve_shl_ri
104 }
105
106 {
107 SRSHR_ri 1110101 0010 1 .... 0 ... 1111 .. 10 1111 @mve_sh_ri
108 ASRL_ri 1110101 0010 1 ... 0 0 ... ... 1 .. 10 1111 @mve_shl_ri
109 SRSHRL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 10 1111 @mve_shl_ri
110 }
111
112 {
113 SQSHL_ri 1110101 0010 1 .... 0 ... 1111 .. 11 1111 @mve_sh_ri
114 SQSHLL_ri 1110101 0010 1 ... 1 0 ... ... 1 .. 11 1111 @mve_shl_ri
115 }
116
117 {
118 UQRSHL_rr 1110101 0010 1 .... .... 1111 0000 1101 @mve_sh_rr
119 LSLL_rr 1110101 0010 1 ... 0 .... ... 1 0000 1101 @mve_shl_rr
120 UQRSHLL64_rr 1110101 0010 1 ... 1 .... ... 1 0000 1101 @mve_shl_rr
121 }
122
123 {
124 SQRSHR_rr 1110101 0010 1 .... .... 1111 0010 1101 @mve_sh_rr
125 ASRL_rr 1110101 0010 1 ... 0 .... ... 1 0010 1101 @mve_shl_rr
126 SQRSHRL64_rr 1110101 0010 1 ... 1 .... ... 1 0010 1101 @mve_shl_rr
127 }
128
129 UQRSHLL48_rr 1110101 0010 1 ... 1 .... ... 1 1000 1101 @mve_shl_rr
130 SQRSHRL48_rr 1110101 0010 1 ... 1 .... ... 1 1010 1101 @mve_shl_rr
131 ]
132
133 MOV_rxri 1110101 0010 . 1111 0 ... .... .... .... @s_rxr_shi
134 ORR_rrri 1110101 0010 . .... 0 ... .... .... .... @s_rrr_shi
135
136 # v8.1M CSEL and friends
137 CSEL 1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4
138 }
139 {
140 MVN_rxri 1110101 0011 . 1111 0 ... .... .... .... @s_rxr_shi
141 ORN_rrri 1110101 0011 . .... 0 ... .... .... .... @s_rrr_shi
142 }
143 {
144 TEQ_xrri 1110101 0100 1 .... 0 ... 1111 .... .... @S_xrr_shi
145 EOR_rrri 1110101 0100 . .... 0 ... .... .... .... @s_rrr_shi
146 }
147 PKH 1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
148 &pkh imm=%imm5_12_6
149 {
150 CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi
151 ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi
152 }
153 ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi
154 SBC_rrri 1110101 1011 . .... 0 ... .... .... .... @s_rrr_shi
155 {
156 CMP_xrri 1110101 1101 1 .... 0 ... 1111 .... .... @S_xrr_shi
157 SUB_rrri 1110101 1101 . .... 0 ... .... .... .... @s_rrr_shi
158 }
159 RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi
160
161 # Data-processing (register-shifted register)
162
163 MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
164 &s_rrr_shr rn=0
165
166 # Data-processing (immediate)
167
168 %t32extrot 26:1 12:3 0:8 !function=t32_expandimm_rot
169 %t32extimm 26:1 12:3 0:8 !function=t32_expandimm_imm
170
171 @s_rri_rot ....... .... s:1 rn:4 . ... rd:4 ........ \
172 &s_rri_rot imm=%t32extimm rot=%t32extrot
173 @s_rxi_rot ....... .... s:1 .... . ... rd:4 ........ \
174 &s_rri_rot imm=%t32extimm rot=%t32extrot rn=0
175 @S_xri_rot ....... .... . rn:4 . ... .... ........ \
176 &s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0
177
178 {
179 TST_xri 1111 0.0 0000 1 .... 0 ... 1111 ........ @S_xri_rot
180 AND_rri 1111 0.0 0000 . .... 0 ... .... ........ @s_rri_rot
181 }
182 BIC_rri 1111 0.0 0001 . .... 0 ... .... ........ @s_rri_rot
183 {
184 MOV_rxi 1111 0.0 0010 . 1111 0 ... .... ........ @s_rxi_rot
185 ORR_rri 1111 0.0 0010 . .... 0 ... .... ........ @s_rri_rot
186 }
187 {
188 MVN_rxi 1111 0.0 0011 . 1111 0 ... .... ........ @s_rxi_rot
189 ORN_rri 1111 0.0 0011 . .... 0 ... .... ........ @s_rri_rot
190 }
191 {
192 TEQ_xri 1111 0.0 0100 1 .... 0 ... 1111 ........ @S_xri_rot
193 EOR_rri 1111 0.0 0100 . .... 0 ... .... ........ @s_rri_rot
194 }
195 {
196 CMN_xri 1111 0.0 1000 1 .... 0 ... 1111 ........ @S_xri_rot
197 ADD_rri 1111 0.0 1000 . .... 0 ... .... ........ @s_rri_rot
198 }
199 ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot
200 SBC_rri 1111 0.0 1011 . .... 0 ... .... ........ @s_rri_rot
201 {
202 CMP_xri 1111 0.0 1101 1 .... 0 ... 1111 ........ @S_xri_rot
203 SUB_rri 1111 0.0 1101 . .... 0 ... .... ........ @s_rri_rot
204 }
205 RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot
206
207 # Data processing (plain binary immediate)
208
209 %imm12_26_12_0 26:1 12:3 0:8
210 %neg12_26_12_0 26:1 12:3 0:8 !function=negate
211 @s0_rri_12 .... ... .... . rn:4 . ... rd:4 ........ \
212 &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0
213
214 {
215 ADR 1111 0.1 0000 0 1111 0 ... rd:4 ........ \
216 &ri imm=%imm12_26_12_0
217 ADD_rri 1111 0.1 0000 0 .... 0 ... .... ........ @s0_rri_12
218 }
219 {
220 ADR 1111 0.1 0101 0 1111 0 ... rd:4 ........ \
221 &ri imm=%neg12_26_12_0
222 SUB_rri 1111 0.1 0101 0 .... 0 ... .... ........ @s0_rri_12
223 }
224
225 # Move Wide
226
227 %imm16_26_16_12_0 16:4 26:1 12:3 0:8
228 @mov16 .... .... .... .... .... rd:4 .... .... \
229 &ri imm=%imm16_26_16_12_0
230
231 MOVW 1111 0.10 0100 .... 0 ... .... ........ @mov16
232 MOVT 1111 0.10 1100 .... 0 ... .... ........ @mov16
233
234 # Saturate, bitfield
235
236 @sat .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \
237 &sat imm=%imm5_12_6
238 @sat16 .... .... .. . . rn:4 . ... rd:4 .. . satimm:5 \
239 &sat sh=0 imm=0
240
241 {
242 SSAT16 1111 0011 001 0 .... 0 000 .... 00 0 ..... @sat16
243 SSAT 1111 0011 00. 0 .... 0 ... .... .. 0 ..... @sat
244 }
245 {
246 USAT16 1111 0011 101 0 .... 0 000 .... 00 0 ..... @sat16
247 USAT 1111 0011 10. 0 .... 0 ... .... .. 0 ..... @sat
248 }
249
250 @bfx .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \
251 &bfx lsb=%imm5_12_6
252 @bfi .... .... ... . rn:4 . ... rd:4 .. . msb:5 \
253 &bfi lsb=%imm5_12_6
254
255 SBFX 1111 0011 010 0 .... 0 ... .... ..0..... @bfx
256 UBFX 1111 0011 110 0 .... 0 ... .... ..0..... @bfx
257
258 # bfc is bfi w/ rn=15
259 BFCI 1111 0011 011 0 .... 0 ... .... ..0..... @bfi
260
261 # Multiply and multiply accumulate
262
263 @s0_rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &s_rrrr s=0
264 @s0_rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &s_rrrr ra=0 s=0
265 @rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &rrrr
266 @rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &rrrr ra=0
267 @rndm .... .... .... rn:4 .... rd:4 .... rm:4 &rrr
268 @rdm .... .... .... .... .... rd:4 .... rm:4 &rr
269
270 {
271 MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm
272 MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm
273 }
274 MLS 1111 1011 0000 .... .... .... 0001 .... @rnadm
275 SMULL 1111 1011 1000 .... .... .... 0000 .... @s0_rnadm
276 UMULL 1111 1011 1010 .... .... .... 0000 .... @s0_rnadm
277 SMLAL 1111 1011 1100 .... .... .... 0000 .... @s0_rnadm
278 UMLAL 1111 1011 1110 .... .... .... 0000 .... @s0_rnadm
279 UMAAL 1111 1011 1110 .... .... .... 0110 .... @rnadm
280 {
281 SMULWB 1111 1011 0011 .... 1111 .... 0000 .... @rn0dm
282 SMLAWB 1111 1011 0011 .... .... .... 0000 .... @rnadm
283 }
284 {
285 SMULWT 1111 1011 0011 .... 1111 .... 0001 .... @rn0dm
286 SMLAWT 1111 1011 0011 .... .... .... 0001 .... @rnadm
287 }
288 {
289 SMULBB 1111 1011 0001 .... 1111 .... 0000 .... @rn0dm
290 SMLABB 1111 1011 0001 .... .... .... 0000 .... @rnadm
291 }
292 {
293 SMULBT 1111 1011 0001 .... 1111 .... 0001 .... @rn0dm
294 SMLABT 1111 1011 0001 .... .... .... 0001 .... @rnadm
295 }
296 {
297 SMULTB 1111 1011 0001 .... 1111 .... 0010 .... @rn0dm
298 SMLATB 1111 1011 0001 .... .... .... 0010 .... @rnadm
299 }
300 {
301 SMULTT 1111 1011 0001 .... 1111 .... 0011 .... @rn0dm
302 SMLATT 1111 1011 0001 .... .... .... 0011 .... @rnadm
303 }
304 SMLALBB 1111 1011 1100 .... .... .... 1000 .... @rnadm
305 SMLALBT 1111 1011 1100 .... .... .... 1001 .... @rnadm
306 SMLALTB 1111 1011 1100 .... .... .... 1010 .... @rnadm
307 SMLALTT 1111 1011 1100 .... .... .... 1011 .... @rnadm
308
309 # usad8 is usada8 w/ ra=15
310 USADA8 1111 1011 0111 .... .... .... 0000 .... @rnadm
311
312 SMLAD 1111 1011 0010 .... .... .... 0000 .... @rnadm
313 SMLADX 1111 1011 0010 .... .... .... 0001 .... @rnadm
314 SMLSD 1111 1011 0100 .... .... .... 0000 .... @rnadm
315 SMLSDX 1111 1011 0100 .... .... .... 0001 .... @rnadm
316
317 SMLALD 1111 1011 1100 .... .... .... 1100 .... @rnadm
318 SMLALDX 1111 1011 1100 .... .... .... 1101 .... @rnadm
319 SMLSLD 1111 1011 1101 .... .... .... 1100 .... @rnadm
320 SMLSLDX 1111 1011 1101 .... .... .... 1101 .... @rnadm
321
322 SMMLA 1111 1011 0101 .... .... .... 0000 .... @rnadm
323 SMMLAR 1111 1011 0101 .... .... .... 0001 .... @rnadm
324 SMMLS 1111 1011 0110 .... .... .... 0000 .... @rnadm
325 SMMLSR 1111 1011 0110 .... .... .... 0001 .... @rnadm
326
327 SDIV 1111 1011 1001 .... 1111 .... 1111 .... @rndm
328 UDIV 1111 1011 1011 .... 1111 .... 1111 .... @rndm
329
330 # Data-processing (two source registers)
331
332 QADD 1111 1010 1000 .... 1111 .... 1000 .... @rndm
333 QSUB 1111 1010 1000 .... 1111 .... 1010 .... @rndm
334 QDADD 1111 1010 1000 .... 1111 .... 1001 .... @rndm
335 QDSUB 1111 1010 1000 .... 1111 .... 1011 .... @rndm
336
337 CRC32B 1111 1010 1100 .... 1111 .... 1000 .... @rndm
338 CRC32H 1111 1010 1100 .... 1111 .... 1001 .... @rndm
339 CRC32W 1111 1010 1100 .... 1111 .... 1010 .... @rndm
340 CRC32CB 1111 1010 1101 .... 1111 .... 1000 .... @rndm
341 CRC32CH 1111 1010 1101 .... 1111 .... 1001 .... @rndm
342 CRC32CW 1111 1010 1101 .... 1111 .... 1010 .... @rndm
343
344 SEL 1111 1010 1010 .... 1111 .... 1000 .... @rndm
345
346 # Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
347 REV 1111 1010 1001 ---- 1111 .... 1000 .... @rdm
348 REV16 1111 1010 1001 ---- 1111 .... 1001 .... @rdm
349 RBIT 1111 1010 1001 ---- 1111 .... 1010 .... @rdm
350 REVSH 1111 1010 1001 ---- 1111 .... 1011 .... @rdm
351 CLZ 1111 1010 1011 ---- 1111 .... 1000 .... @rdm
352
353 # Branches and miscellaneous control
354
355 %msr_sysm 4:1 8:4
356 %mrs_sysm 4:1 16:4
357 %imm16_16_0 16:4 0:12
358 %imm21 26:s1 11:1 13:1 16:6 0:11 !function=times_2
359 &ci cond imm
360
361 {
362 # Group insn[25:23] = 111, which is cond=111x for the branch below,
363 # or unconditional, which would be illegal for the branch.
364 [
365 # Hints, and CPS
366 {
367 [
368 YIELD 1111 0011 1010 1111 1000 0000 0000 0001
369 WFE 1111 0011 1010 1111 1000 0000 0000 0010
370 WFI 1111 0011 1010 1111 1000 0000 0000 0011
371
372 SEV 1111 0011 1010 1111 1000 0000 0000 0100
373 SEVL 1111 0011 1010 1111 1000 0000 0000 0101
374
375 ESB 1111 0011 1010 1111 1000 0000 0001 0000
376 ]
377
378 # The canonical nop ends in 0000 0000, but the whole rest
379 # of the space is "reserved hint, behaves as nop".
380 NOP 1111 0011 1010 1111 1000 0000 ---- ----
381
382 # If imod == '00' && M == '0' then SEE "Hint instructions", above.
383 CPS 1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \
384 &cps
385 }
386
387 # Miscellaneous control
388 CLREX 1111 0011 1011 1111 1000 1111 0010 1111
389 DSB 1111 0011 1011 1111 1000 1111 0100 ----
390 DMB 1111 0011 1011 1111 1000 1111 0101 ----
391 ISB 1111 0011 1011 1111 1000 1111 0110 ----
392 SB 1111 0011 1011 1111 1000 1111 0111 0000
393
394 # Note that the v7m insn overlaps both the normal and banked insn.
395 {
396 MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \
397 &mrs_bank sysm=%mrs_sysm
398 MRS_reg 1111 0011 111 r:1 1111 1000 rd:4 0000 0000 &mrs_reg
399 MRS_v7m 1111 0011 111 0 1111 1000 rd:4 sysm:8
400 }
401 {
402 MSR_bank 1111 0011 100 r:1 rn:4 1000 .... 001. 0000 \
403 &msr_bank sysm=%msr_sysm
404 MSR_reg 1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000 &msr_reg
405 MSR_v7m 1111 0011 100 0 rn:4 1000 mask:2 00 sysm:8
406 }
407 BXJ 1111 0011 1100 rm:4 1000 1111 0000 0000 &r
408 {
409 # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
410 # every other encoding of SUBS. With v7VE, IMM=0 is redefined as ERET.
411 # The distinction between the two only matters for Hyp mode.
412 ERET 1111 0011 1101 1110 1000 1111 0000 0000
413 SUB_rri 1111 0011 1101 1110 1000 1111 imm:8 \
414 &s_rri_rot rot=0 s=1 rd=15 rn=14
415 }
416 SMC 1111 0111 1111 imm:4 1000 0000 0000 0000 &i
417 HVC 1111 0111 1110 .... 1000 .... .... .... \
418 &i imm=%imm16_16_0
419 UDF 1111 0111 1111 ---- 1010 ---- ---- ----
420 ]
421 B_cond_thumb 1111 0. cond:4 ...... 10.0 ............ &ci imm=%imm21
422 }
423
424 # Load/store (register, immediate, literal)
425
426 @ldst_rr .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \
427 &ldst_rr p=1 w=0 u=1 shtype=0
428 @ldst_ri_idx .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \
429 &ldst_ri w=1
430 @ldst_ri_neg .... .... .... rn:4 rt:4 .... imm:8 \
431 &ldst_ri p=1 w=0 u=0
432 @ldst_ri_unp .... .... .... rn:4 rt:4 .... imm:8 \
433 &ldst_ri p=1 w=0 u=1
434 @ldst_ri_pos .... .... .... rn:4 rt:4 imm:12 \
435 &ldst_ri p=1 w=0 u=1
436 @ldst_ri_lit .... .... u:1 ... .... rt:4 imm:12 \
437 &ldst_ri p=1 w=0 rn=15
438
439 STRB_rr 1111 1000 0000 .... .... 000000 .. .... @ldst_rr
440 STRB_ri 1111 1000 0000 .... .... 1..1 ........ @ldst_ri_idx
441 STRB_ri 1111 1000 0000 .... .... 1100 ........ @ldst_ri_neg
442 STRBT_ri 1111 1000 0000 .... .... 1110 ........ @ldst_ri_unp
443 STRB_ri 1111 1000 1000 .... .... ............ @ldst_ri_pos
444
445 STRH_rr 1111 1000 0010 .... .... 000000 .. .... @ldst_rr
446 STRH_ri 1111 1000 0010 .... .... 1..1 ........ @ldst_ri_idx
447 STRH_ri 1111 1000 0010 .... .... 1100 ........ @ldst_ri_neg
448 STRHT_ri 1111 1000 0010 .... .... 1110 ........ @ldst_ri_unp
449 STRH_ri 1111 1000 1010 .... .... ............ @ldst_ri_pos
450
451 STR_rr 1111 1000 0100 .... .... 000000 .. .... @ldst_rr
452 STR_ri 1111 1000 0100 .... .... 1..1 ........ @ldst_ri_idx
453 STR_ri 1111 1000 0100 .... .... 1100 ........ @ldst_ri_neg
454 STRT_ri 1111 1000 0100 .... .... 1110 ........ @ldst_ri_unp
455 STR_ri 1111 1000 1100 .... .... ............ @ldst_ri_pos
456
457 # Note that Load, unsigned (literal) overlaps all other load encodings.
458 {
459 {
460 PLD 1111 1000 -001 1111 1111 ------------ # (literal)
461 LDRB_ri 1111 1000 .001 1111 .... ............ @ldst_ri_lit
462 }
463 {
464 PLD 1111 1000 1001 ---- 1111 ------------ # (immediate T1)
465 LDRB_ri 1111 1000 1001 .... .... ............ @ldst_ri_pos
466 }
467 LDRB_ri 1111 1000 0001 .... .... 1..1 ........ @ldst_ri_idx
468 {
469 PLD 1111 1000 0001 ---- 1111 1100 -------- # (immediate T2)
470 LDRB_ri 1111 1000 0001 .... .... 1100 ........ @ldst_ri_neg
471 }
472 LDRBT_ri 1111 1000 0001 .... .... 1110 ........ @ldst_ri_unp
473 {
474 PLD 1111 1000 0001 ---- 1111 000000 -- ---- # (register)
475 LDRB_rr 1111 1000 0001 .... .... 000000 .. .... @ldst_rr
476 }
477 }
478 {
479 {
480 PLD 1111 1000 -011 1111 1111 ------------ # (literal)
481 LDRH_ri 1111 1000 .011 1111 .... ............ @ldst_ri_lit
482 }
483 {
484 PLDW 1111 1000 1011 ---- 1111 ------------ # (immediate T1)
485 LDRH_ri 1111 1000 1011 .... .... ............ @ldst_ri_pos
486 }
487 LDRH_ri 1111 1000 0011 .... .... 1..1 ........ @ldst_ri_idx
488 {
489 PLDW 1111 1000 0011 ---- 1111 1100 -------- # (immediate T2)
490 LDRH_ri 1111 1000 0011 .... .... 1100 ........ @ldst_ri_neg
491 }
492 LDRHT_ri 1111 1000 0011 .... .... 1110 ........ @ldst_ri_unp
493 {
494 PLDW 1111 1000 0011 ---- 1111 000000 -- ---- # (register)
495 LDRH_rr 1111 1000 0011 .... .... 000000 .. .... @ldst_rr
496 }
497 }
498 {
499 LDR_ri 1111 1000 .101 1111 .... ............ @ldst_ri_lit
500 LDR_ri 1111 1000 1101 .... .... ............ @ldst_ri_pos
501 LDR_ri 1111 1000 0101 .... .... 1..1 ........ @ldst_ri_idx
502 LDR_ri 1111 1000 0101 .... .... 1100 ........ @ldst_ri_neg
503 LDRT_ri 1111 1000 0101 .... .... 1110 ........ @ldst_ri_unp
504 LDR_rr 1111 1000 0101 .... .... 000000 .. .... @ldst_rr
505 }
506 {
507 {
508 PLI 1111 1001 -001 1111 1111 ------------ # (literal T3)
509 LDRSB_ri 1111 1001 .001 1111 .... ............ @ldst_ri_lit
510 }
511 {
512 PLI 1111 1001 1001 ---- 1111 ------------ # (immediate T1)
513 LDRSB_ri 1111 1001 1001 .... .... ............ @ldst_ri_pos
514 }
515 LDRSB_ri 1111 1001 0001 .... .... 1..1 ........ @ldst_ri_idx
516 {
517 PLI 1111 1001 0001 ---- 1111 1100 -------- # (immediate T2)
518 LDRSB_ri 1111 1001 0001 .... .... 1100 ........ @ldst_ri_neg
519 }
520 LDRSBT_ri 1111 1001 0001 .... .... 1110 ........ @ldst_ri_unp
521 {
522 PLI 1111 1001 0001 ---- 1111 000000 -- ---- # (register)
523 LDRSB_rr 1111 1001 0001 .... .... 000000 .. .... @ldst_rr
524 }
525 }
526 # NOPs here are unallocated memory hints, treated as NOP.
527 {
528 {
529 NOP 1111 1001 -011 1111 1111 ------------
530 LDRSH_ri 1111 1001 .011 1111 .... ............ @ldst_ri_lit
531 }
532 {
533 NOP 1111 1001 1011 ---- 1111 ------------
534 LDRSH_ri 1111 1001 1011 .... .... ............ @ldst_ri_pos
535 }
536 LDRSH_ri 1111 1001 0011 .... .... 1..1 ........ @ldst_ri_idx
537 {
538 NOP 1111 1001 0011 ---- 1111 1100 --------
539 LDRSH_ri 1111 1001 0011 .... .... 1100 ........ @ldst_ri_neg
540 }
541 LDRSHT_ri 1111 1001 0011 .... .... 1110 ........ @ldst_ri_unp
542 {
543 NOP 1111 1001 0011 ---- 1111 000000 -- ----
544 LDRSH_rr 1111 1001 0011 .... .... 000000 .. .... @ldst_rr
545 }
546 }
547
548 %imm8x4 0:8 !function=times_4
549 &ldst_ri2 p w u rn rt rt2 imm
550 @ldstd_ri8 .... .... u:1 ... rn:4 rt:4 rt2:4 ........ \
551 &ldst_ri2 imm=%imm8x4
552
553 STRD_ri_t32 1110 1000 .110 .... .... .... ........ @ldstd_ri8 w=1 p=0
554 LDRD_ri_t32 1110 1000 .111 .... .... .... ........ @ldstd_ri8 w=1 p=0
555
556 STRD_ri_t32 1110 1001 .100 .... .... .... ........ @ldstd_ri8 w=0 p=1
557 LDRD_ri_t32 1110 1001 .101 .... .... .... ........ @ldstd_ri8 w=0 p=1
558
559 STRD_ri_t32 1110 1001 .110 .... .... .... ........ @ldstd_ri8 w=1 p=1
560 {
561 SG 1110 1001 0111 1111 1110 1001 01111111
562 LDRD_ri_t32 1110 1001 .111 .... .... .... ........ @ldstd_ri8 w=1 p=1
563 }
564
565 # Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
566
567 @strex_i .... .... .... rn:4 rt:4 rd:4 .... .... \
568 &strex rt2=15 imm=%imm8x4
569 @strex_0 .... .... .... rn:4 rt:4 .... .... rd:4 \
570 &strex rt2=15 imm=0
571 @strex_d .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
572 &strex imm=0
573
574 @ldrex_i .... .... .... rn:4 rt:4 .... .... .... \
575 &ldrex rt2=15 imm=%imm8x4
576 @ldrex_0 .... .... .... rn:4 rt:4 .... .... .... \
577 &ldrex rt2=15 imm=0
578 @ldrex_d .... .... .... rn:4 rt:4 rt2:4 .... .... \
579 &ldrex imm=0
580
581 {
582 TT 1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
583 STREX 1110 1000 0100 .... .... .... .... .... @strex_i
584 }
585 STREXB 1110 1000 1100 .... .... 1111 0100 .... @strex_0
586 STREXH 1110 1000 1100 .... .... 1111 0101 .... @strex_0
587 STREXD_t32 1110 1000 1100 .... .... .... 0111 .... @strex_d
588
589 STLEX 1110 1000 1100 .... .... 1111 1110 .... @strex_0
590 STLEXB 1110 1000 1100 .... .... 1111 1100 .... @strex_0
591 STLEXH 1110 1000 1100 .... .... 1111 1101 .... @strex_0
592 STLEXD_t32 1110 1000 1100 .... .... .... 1111 .... @strex_d
593
594 STL 1110 1000 1100 .... .... 1111 1010 1111 @ldrex_0
595 STLB 1110 1000 1100 .... .... 1111 1000 1111 @ldrex_0
596 STLH 1110 1000 1100 .... .... 1111 1001 1111 @ldrex_0
597
598 LDREX 1110 1000 0101 .... .... 1111 .... .... @ldrex_i
599 LDREXB 1110 1000 1101 .... .... 1111 0100 1111 @ldrex_0
600 LDREXH 1110 1000 1101 .... .... 1111 0101 1111 @ldrex_0
601 LDREXD_t32 1110 1000 1101 .... .... .... 0111 1111 @ldrex_d
602
603 LDAEX 1110 1000 1101 .... .... 1111 1110 1111 @ldrex_0
604 LDAEXB 1110 1000 1101 .... .... 1111 1100 1111 @ldrex_0
605 LDAEXH 1110 1000 1101 .... .... 1111 1101 1111 @ldrex_0
606 LDAEXD_t32 1110 1000 1101 .... .... .... 1111 1111 @ldrex_d
607
608 LDA 1110 1000 1101 .... .... 1111 1010 1111 @ldrex_0
609 LDAB 1110 1000 1101 .... .... 1111 1000 1111 @ldrex_0
610 LDAH 1110 1000 1101 .... .... 1111 1001 1111 @ldrex_0
611
612 &tbranch rn rm
613 @tbranch .... .... .... rn:4 .... .... .... rm:4 &tbranch
614
615 TBB 1110 1000 1101 .... 1111 0000 0000 .... @tbranch
616 TBH 1110 1000 1101 .... 1111 0000 0001 .... @tbranch
617
618 # Parallel addition and subtraction
619
620 SADD8 1111 1010 1000 .... 1111 .... 0000 .... @rndm
621 QADD8 1111 1010 1000 .... 1111 .... 0001 .... @rndm
622 SHADD8 1111 1010 1000 .... 1111 .... 0010 .... @rndm
623 UADD8 1111 1010 1000 .... 1111 .... 0100 .... @rndm
624 UQADD8 1111 1010 1000 .... 1111 .... 0101 .... @rndm
625 UHADD8 1111 1010 1000 .... 1111 .... 0110 .... @rndm
626
627 SADD16 1111 1010 1001 .... 1111 .... 0000 .... @rndm
628 QADD16 1111 1010 1001 .... 1111 .... 0001 .... @rndm
629 SHADD16 1111 1010 1001 .... 1111 .... 0010 .... @rndm
630 UADD16 1111 1010 1001 .... 1111 .... 0100 .... @rndm
631 UQADD16 1111 1010 1001 .... 1111 .... 0101 .... @rndm
632 UHADD16 1111 1010 1001 .... 1111 .... 0110 .... @rndm
633
634 SASX 1111 1010 1010 .... 1111 .... 0000 .... @rndm
635 QASX 1111 1010 1010 .... 1111 .... 0001 .... @rndm
636 SHASX 1111 1010 1010 .... 1111 .... 0010 .... @rndm
637 UASX 1111 1010 1010 .... 1111 .... 0100 .... @rndm
638 UQASX 1111 1010 1010 .... 1111 .... 0101 .... @rndm
639 UHASX 1111 1010 1010 .... 1111 .... 0110 .... @rndm
640
641 SSUB8 1111 1010 1100 .... 1111 .... 0000 .... @rndm
642 QSUB8 1111 1010 1100 .... 1111 .... 0001 .... @rndm
643 SHSUB8 1111 1010 1100 .... 1111 .... 0010 .... @rndm
644 USUB8 1111 1010 1100 .... 1111 .... 0100 .... @rndm
645 UQSUB8 1111 1010 1100 .... 1111 .... 0101 .... @rndm
646 UHSUB8 1111 1010 1100 .... 1111 .... 0110 .... @rndm
647
648 SSUB16 1111 1010 1101 .... 1111 .... 0000 .... @rndm
649 QSUB16 1111 1010 1101 .... 1111 .... 0001 .... @rndm
650 SHSUB16 1111 1010 1101 .... 1111 .... 0010 .... @rndm
651 USUB16 1111 1010 1101 .... 1111 .... 0100 .... @rndm
652 UQSUB16 1111 1010 1101 .... 1111 .... 0101 .... @rndm
653 UHSUB16 1111 1010 1101 .... 1111 .... 0110 .... @rndm
654
655 SSAX 1111 1010 1110 .... 1111 .... 0000 .... @rndm
656 QSAX 1111 1010 1110 .... 1111 .... 0001 .... @rndm
657 SHSAX 1111 1010 1110 .... 1111 .... 0010 .... @rndm
658 USAX 1111 1010 1110 .... 1111 .... 0100 .... @rndm
659 UQSAX 1111 1010 1110 .... 1111 .... 0101 .... @rndm
660 UHSAX 1111 1010 1110 .... 1111 .... 0110 .... @rndm
661
662 # Register extends
663
664 @rrr_rot .... .... .... rn:4 .... rd:4 .. rot:2 rm:4 &rrr_rot
665
666 SXTAH 1111 1010 0000 .... 1111 .... 10.. .... @rrr_rot
667 UXTAH 1111 1010 0001 .... 1111 .... 10.. .... @rrr_rot
668 SXTAB16 1111 1010 0010 .... 1111 .... 10.. .... @rrr_rot
669 UXTAB16 1111 1010 0011 .... 1111 .... 10.. .... @rrr_rot
670 SXTAB 1111 1010 0100 .... 1111 .... 10.. .... @rrr_rot
671 UXTAB 1111 1010 0101 .... 1111 .... 10.. .... @rrr_rot
672
673 # Load/store multiple
674
675 @ldstm .... .... .. w:1 . rn:4 list:16 &ldst_block u=0
676
677 STM_t32 1110 1000 10.0 .... ................ @ldstm i=1 b=0
678 STM_t32 1110 1001 00.0 .... ................ @ldstm i=0 b=1
679 {
680 # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding
681 CLRM 1110 1000 1001 1111 list:16
682 LDM_t32 1110 1000 10.1 .... ................ @ldstm i=1 b=0
683 }
684 LDM_t32 1110 1001 00.1 .... ................ @ldstm i=0 b=1
685
686 &rfe !extern rn w pu
687 @rfe .... .... .. w:1 . rn:4 ................ &rfe
688
689 RFE 1110 1000 00.1 .... 1100000000000000 @rfe pu=2
690 RFE 1110 1001 10.1 .... 1100000000000000 @rfe pu=1
691
692 &srs !extern mode w pu
693 @srs .... .... .. w:1 . .... ........... mode:5 &srs
694
695 SRS 1110 1000 00.0 1101 1100 0000 000. .... @srs pu=2
696 SRS 1110 1001 10.0 1101 1100 0000 000. .... @srs pu=1
697
698 # Coprocessor instructions
699
700 # We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
701 # other coprocessor instructions always UNDEF.
702 # The trans_ functions for these will ignore cp values 8..13 for v7 or
703 # earlier, and 0..13 for v8 and later, because those areas of the
704 # encoding space may be used for other things, such as VFP or Neon.
705
706 @mcr .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4
707 @mcrr .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4
708
709 MCRR 1110 1100 0100 .... .... .... .... .... @mcrr
710 MRRC 1110 1100 0101 .... .... .... .... .... @mcrr
711
712 MCR 1110 1110 ... 0 .... .... .... ... 1 .... @mcr
713 MRC 1110 1110 ... 1 .... .... .... ... 1 .... @mcr
714
715 # Branches
716
717 %imm24 26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
718 @branch24 ................................ &i imm=%imm24
719
720 B 1111 0. .......... 10.1 ............ @branch24
721 BL 1111 0. .......... 11.1 ............ @branch24
722 {
723 # BLX_i is non-M-profile only
724 BLX_i 1111 0. .......... 11.0 ............ @branch24
725 # M-profile only: loop and branch insns
726 [
727 # All these BF insns have boff != 0b0000; we NOP them all
728 BF 1111 0 boff:4 ------- 1100 - ---------- 1 # BFL
729 BF 1111 0 boff:4 0 ------ 1110 - ---------- 1 # BFCSEL
730 BF 1111 0 boff:4 10 ----- 1110 - ---------- 1 # BF
731 BF 1111 0 boff:4 11 ----- 1110 0 0000000000 1 # BFX, BFLX
732 ]
733 [
734 # LE and WLS immediate
735 %lob_imm 1:10 11:1 !function=times_2
736
737 DLS 1111 0 0000 100 rn:4 1110 0000 0000 0001 size=4
738 WLS 1111 0 0000 100 rn:4 1100 . .......... 1 imm=%lob_imm size=4
739 {
740 LE 1111 0 0000 0 f:1 tp:1 1111 1100 . .......... 1 imm=%lob_imm
741 # This is WLSTP
742 WLS 1111 0 0000 0 size:2 rn:4 1100 . .......... 1 imm=%lob_imm
743 }
744 {
745 LCTP 1111 0 0000 000 1111 1110 0000 0000 0001
746 # This is DLSTP
747 DLS 1111 0 0000 0 size:2 rn:4 1110 0000 0000 0001
748 }
749 VCTP 1111 0 0000 0 size:2 rn:4 1110 1000 0000 0001
750 ]
751 }