]> git.proxmox.com Git - mirror_qemu.git/blame - target/arm/t32.decode
Merge tag 'pull-target-arm-20220509' of https://git.linaro.org/people/pmaydell/qemu...
[mirror_qemu.git] / target / arm / t32.decode
CommitLineData
51409b9e
RH
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
50f57e09 8# version 2.1 of the License, or (at your option) any later version.
51409b9e
RH
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#
25ae32c5 21
63130596 22&empty !extern
25ae32c5 23&s_rrr_shi !extern s rd rn rm shim shty
5be2c123 24&s_rrr_shr !extern s rn rd rm rs shty
581c6ebd 25&s_rri_rot !extern s rn rd imm rot
bd92fe35
RH
26&s_rrrr !extern s rd rn rm ra
27&rrrr !extern rd rn rm ra
46497f6a 28&rrr_rot !extern rd rn rm rot
6d0730a8 29&rrr !extern rd rn rm
4c97f5b2 30&rr !extern rd rm
145952e8 31&ri !extern rd imm
4ed95abd 32&r !extern rm
2cde9ea5 33&i !extern imm
d0b26644
RH
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
5e291fe1
RH
38&ldst_rr !extern p w u rn rt rm shimm shtype
39&ldst_ri !extern p w u rn rt imm
c5c426d4 40&ldst_block !extern rn i b u w list
1efdd407
RH
41&strex !extern rn rd rt rt2 imm
42&ldrex !extern rn rt rt2 imm
86d21e4b
RH
43&bfx !extern rd rn lsb widthm1
44&bfi !extern rd rn lsb msb
46497f6a
RH
45&sat !extern rd rn satimm imm sh
46&pkh !extern rd rn rm imm tb
52f83b9c 47&cps !extern mode imod M A I F
4c498dcf
PM
48&mcr !extern cp opc1 crn crm opc2 rt
49&mcrr !extern cp opc1 crm rt rt2
25ae32c5 50
f4ae6c8c 51&mve_shl_ri rdalo rdahi shim
0aa4b4c3 52&mve_shl_rr rdalo rdahi rm
46321d47 53&mve_sh_ri rda shim
04ea4d3c 54&mve_sh_rr rda rm
f4ae6c8c
PM
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
25ae32c5
RH
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
f4ae6c8c
PM
72@mve_shl_ri ....... .... . ... . . ... ... . .. .. .... \
73 &mve_shl_ri shim=%imm5_12_6 rdalo=%rdalo_17 rdahi=%rdahi_9
0aa4b4c3
PM
74@mve_shl_rr ....... .... . ... . rm:4 ... . .. .. .... \
75 &mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9
46321d47
PM
76@mve_sh_ri ....... .... . rda:4 . ... ... . .. .. .... \
77 &mve_sh_ri shim=%imm5_12_6
04ea4d3c 78@mve_sh_rr ....... .... . rda:4 rm:4 .... .... .... &mve_sh_rr
f4ae6c8c 79
25ae32c5
RH
80{
81 TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi
82 AND_rrri 1110101 0000 . .... 0 ... .... .... .... @s_rrr_shi
83}
84BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi
85{
f4ae6c8c
PM
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 [
46321d47
PM
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 }
f4ae6c8c 99
46321d47
PM
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 }
0aa4b4c3 116
04ea4d3c
PM
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
0aa4b4c3
PM
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
f4ae6c8c
PM
131 ]
132
25ae32c5
RH
133 MOV_rxri 1110101 0010 . 1111 0 ... .... .... .... @s_rxr_shi
134 ORR_rrri 1110101 0010 . .... 0 ... .... .... .... @s_rrr_shi
0aa4b4c3
PM
135
136 # v8.1M CSEL and friends
137 CSEL 1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4
25ae32c5
RH
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}
46497f6a
RH
147PKH 1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
148 &pkh imm=%imm5_12_6
25ae32c5
RH
149{
150 CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi
151 ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi
152}
153ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi
154SBC_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}
159RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi
5be2c123
RH
160
161# Data-processing (register-shifted register)
162
163MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
164 &s_rrr_shr rn=0
581c6ebd
RH
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}
182BIC_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}
199ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot
200SBC_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}
205RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot
bd92fe35 206
145952e8
RH
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
8f445127
RH
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
231MOVW 1111 0.10 0100 .... 0 ... .... ........ @mov16
232MOVT 1111 0.10 1100 .... 0 ... .... ........ @mov16
233
86d21e4b
RH
234# Saturate, bitfield
235
46497f6a
RH
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
86d21e4b
RH
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
255SBFX 1111 0011 010 0 .... 0 ... .... ..0..... @bfx
256UBFX 1111 0011 110 0 .... 0 ... .... ..0..... @bfx
257
258# bfc is bfi w/ rn=15
259BFCI 1111 0011 011 0 .... 0 ... .... ..0..... @bfi
260
bd92fe35
RH
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
26c6923d 266@rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &rrrr ra=0
6d0730a8 267@rndm .... .... .... rn:4 .... rd:4 .... rm:4 &rrr
4c97f5b2 268@rdm .... .... .... .... .... rd:4 .... rm:4 &rr
bd92fe35
RH
269
270{
271 MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm
272 MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm
273}
274MLS 1111 1011 0000 .... .... .... 0001 .... @rnadm
275SMULL 1111 1011 1000 .... .... .... 0000 .... @s0_rnadm
276UMULL 1111 1011 1010 .... .... .... 0000 .... @s0_rnadm
277SMLAL 1111 1011 1100 .... .... .... 0000 .... @s0_rnadm
278UMLAL 1111 1011 1110 .... .... .... 0000 .... @s0_rnadm
279UMAAL 1111 1011 1110 .... .... .... 0110 .... @rnadm
26c6923d
RH
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}
304SMLALBB 1111 1011 1100 .... .... .... 1000 .... @rnadm
305SMLALBT 1111 1011 1100 .... .... .... 1001 .... @rnadm
306SMLALTB 1111 1011 1100 .... .... .... 1010 .... @rnadm
307SMLALTT 1111 1011 1100 .... .... .... 1011 .... @rnadm
6d0730a8 308
86d21e4b
RH
309# usad8 is usada8 w/ ra=15
310USADA8 1111 1011 0111 .... .... .... 0000 .... @rnadm
311
2c7c4e09
RH
312SMLAD 1111 1011 0010 .... .... .... 0000 .... @rnadm
313SMLADX 1111 1011 0010 .... .... .... 0001 .... @rnadm
314SMLSD 1111 1011 0100 .... .... .... 0000 .... @rnadm
315SMLSDX 1111 1011 0100 .... .... .... 0001 .... @rnadm
316
317SMLALD 1111 1011 1100 .... .... .... 1100 .... @rnadm
318SMLALDX 1111 1011 1100 .... .... .... 1101 .... @rnadm
319SMLSLD 1111 1011 1101 .... .... .... 1100 .... @rnadm
320SMLSLDX 1111 1011 1101 .... .... .... 1101 .... @rnadm
321
322SMMLA 1111 1011 0101 .... .... .... 0000 .... @rnadm
323SMMLAR 1111 1011 0101 .... .... .... 0001 .... @rnadm
324SMMLS 1111 1011 0110 .... .... .... 0000 .... @rnadm
325SMMLSR 1111 1011 0110 .... .... .... 0001 .... @rnadm
326
327SDIV 1111 1011 1001 .... 1111 .... 1111 .... @rndm
328UDIV 1111 1011 1011 .... 1111 .... 1111 .... @rndm
329
6d0730a8
RH
330# Data-processing (two source registers)
331
332QADD 1111 1010 1000 .... 1111 .... 1000 .... @rndm
333QSUB 1111 1010 1000 .... 1111 .... 1010 .... @rndm
334QDADD 1111 1010 1000 .... 1111 .... 1001 .... @rndm
335QDSUB 1111 1010 1000 .... 1111 .... 1011 .... @rndm
63130596 336
6c35d53f
RH
337CRC32B 1111 1010 1100 .... 1111 .... 1000 .... @rndm
338CRC32H 1111 1010 1100 .... 1111 .... 1001 .... @rndm
339CRC32W 1111 1010 1100 .... 1111 .... 1010 .... @rndm
340CRC32CB 1111 1010 1101 .... 1111 .... 1000 .... @rndm
341CRC32CH 1111 1010 1101 .... 1111 .... 1001 .... @rndm
342CRC32CW 1111 1010 1101 .... 1111 .... 1010 .... @rndm
343
46497f6a
RH
344SEL 1111 1010 1010 .... 1111 .... 1000 .... @rndm
345
4c97f5b2 346# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
46497f6a
RH
347REV 1111 1010 1001 ---- 1111 .... 1000 .... @rdm
348REV16 1111 1010 1001 ---- 1111 .... 1001 .... @rdm
349RBIT 1111 1010 1001 ---- 1111 .... 1010 .... @rdm
350REVSH 1111 1010 1001 ---- 1111 .... 1011 .... @rdm
4c97f5b2
RH
351CLZ 1111 1010 1011 ---- 1111 .... 1000 .... @rdm
352
63130596
RH
353# Branches and miscellaneous control
354
d0b26644
RH
355%msr_sysm 4:1 8:4
356%mrs_sysm 4:1 16:4
2cde9ea5 357%imm16_16_0 16:4 0:12
360144f3
RH
358%imm21 26:s1 11:1 13:1 16:6 0:11 !function=times_2
359&ci cond imm
d0b26644
RH
360
361{
360144f3
RH
362 # Group insn[25:23] = 111, which is cond=111x for the branch below,
363 # or unconditional, which would be illegal for the branch.
45f11876
PM
364 [
365 # Hints, and CPS
360144f3 366 {
13954587
RH
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
360144f3 371
13954587
RH
372 # TODO: Implement SEV, SEVL; may help SMP performance.
373 # SEV 1111 0011 1010 1111 1000 0000 0000 0100
374 # SEVL 1111 0011 1010 1111 1000 0000 0000 0101
360144f3 375
13954587
RH
376 ESB 1111 0011 1010 1111 1000 0000 0001 0000
377 ]
46f4976f 378
360144f3
RH
379 # The canonical nop ends in 0000 0000, but the whole rest
380 # of the space is "reserved hint, behaves as nop".
381 NOP 1111 0011 1010 1111 1000 0000 ---- ----
519b8471 382
45f11876
PM
383 # If imod == '00' && M == '0' then SEE "Hint instructions", above.
384 CPS 1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \
52f83b9c 385 &cps
45f11876 386 }
52f83b9c 387
519b8471 388 # Miscellaneous control
45f11876
PM
389 CLREX 1111 0011 1011 1111 1000 1111 0010 1111
390 DSB 1111 0011 1011 1111 1000 1111 0100 ----
391 DMB 1111 0011 1011 1111 1000 1111 0101 ----
392 ISB 1111 0011 1011 1111 1000 1111 0110 ----
393 SB 1111 0011 1011 1111 1000 1111 0111 0000
519b8471 394
360144f3
RH
395 # Note that the v7m insn overlaps both the normal and banked insn.
396 {
397 MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \
d0b26644 398 &mrs_bank sysm=%mrs_sysm
360144f3
RH
399 MRS_reg 1111 0011 111 r:1 1111 1000 rd:4 0000 0000 &mrs_reg
400 MRS_v7m 1111 0011 111 0 1111 1000 rd:4 sysm:8
401 }
402 {
403 MSR_bank 1111 0011 100 r:1 rn:4 1000 .... 001. 0000 \
d0b26644 404 &msr_bank sysm=%msr_sysm
360144f3
RH
405 MSR_reg 1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000 &msr_reg
406 MSR_v7m 1111 0011 100 0 rn:4 1000 mask:2 00 sysm:8
407 }
408 BXJ 1111 0011 1100 rm:4 1000 1111 0000 0000 &r
409 {
410 # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
411 # every other encoding of SUBS. With v7VE, IMM=0 is redefined as ERET.
412 # The distinction between the two only matters for Hyp mode.
413 ERET 1111 0011 1101 1110 1000 1111 0000 0000
414 SUB_rri 1111 0011 1101 1110 1000 1111 imm:8 \
ef11bc3c 415 &s_rri_rot rot=0 s=1 rd=15 rn=14
360144f3
RH
416 }
417 SMC 1111 0111 1111 imm:4 1000 0000 0000 0000 &i
418 HVC 1111 0111 1110 .... 1000 .... .... .... \
2cde9ea5 419 &i imm=%imm16_16_0
360144f3 420 UDF 1111 0111 1111 ---- 1010 ---- ---- ----
45f11876 421 ]
360144f3 422 B_cond_thumb 1111 0. cond:4 ...... 10.0 ............ &ci imm=%imm21
63130596 423}
5e291fe1
RH
424
425# Load/store (register, immediate, literal)
426
427@ldst_rr .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \
428 &ldst_rr p=1 w=0 u=1 shtype=0
429@ldst_ri_idx .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \
430 &ldst_ri w=1
431@ldst_ri_neg .... .... .... rn:4 rt:4 .... imm:8 \
432 &ldst_ri p=1 w=0 u=0
433@ldst_ri_unp .... .... .... rn:4 rt:4 .... imm:8 \
434 &ldst_ri p=1 w=0 u=1
435@ldst_ri_pos .... .... .... rn:4 rt:4 imm:12 \
436 &ldst_ri p=1 w=0 u=1
437@ldst_ri_lit .... .... u:1 ... .... rt:4 imm:12 \
438 &ldst_ri p=1 w=0 rn=15
439
440STRB_rr 1111 1000 0000 .... .... 000000 .. .... @ldst_rr
441STRB_ri 1111 1000 0000 .... .... 1..1 ........ @ldst_ri_idx
442STRB_ri 1111 1000 0000 .... .... 1100 ........ @ldst_ri_neg
443STRBT_ri 1111 1000 0000 .... .... 1110 ........ @ldst_ri_unp
444STRB_ri 1111 1000 1000 .... .... ............ @ldst_ri_pos
445
446STRH_rr 1111 1000 0010 .... .... 000000 .. .... @ldst_rr
447STRH_ri 1111 1000 0010 .... .... 1..1 ........ @ldst_ri_idx
448STRH_ri 1111 1000 0010 .... .... 1100 ........ @ldst_ri_neg
449STRHT_ri 1111 1000 0010 .... .... 1110 ........ @ldst_ri_unp
450STRH_ri 1111 1000 1010 .... .... ............ @ldst_ri_pos
451
452STR_rr 1111 1000 0100 .... .... 000000 .. .... @ldst_rr
453STR_ri 1111 1000 0100 .... .... 1..1 ........ @ldst_ri_idx
454STR_ri 1111 1000 0100 .... .... 1100 ........ @ldst_ri_neg
455STRT_ri 1111 1000 0100 .... .... 1110 ........ @ldst_ri_unp
456STR_ri 1111 1000 1100 .... .... ............ @ldst_ri_pos
457
458# Note that Load, unsigned (literal) overlaps all other load encodings.
459{
460 {
461 NOP 1111 1000 -001 1111 1111 ------------ # PLD
462 LDRB_ri 1111 1000 .001 1111 .... ............ @ldst_ri_lit
463 }
464 {
465 NOP 1111 1000 1001 ---- 1111 ------------ # PLD
466 LDRB_ri 1111 1000 1001 .... .... ............ @ldst_ri_pos
467 }
468 LDRB_ri 1111 1000 0001 .... .... 1..1 ........ @ldst_ri_idx
469 {
470 NOP 1111 1000 0001 ---- 1111 1100 -------- # PLD
471 LDRB_ri 1111 1000 0001 .... .... 1100 ........ @ldst_ri_neg
472 }
473 LDRBT_ri 1111 1000 0001 .... .... 1110 ........ @ldst_ri_unp
474 {
475 NOP 1111 1000 0001 ---- 1111 000000 -- ---- # PLD
476 LDRB_rr 1111 1000 0001 .... .... 000000 .. .... @ldst_rr
477 }
478}
479{
480 {
481 NOP 1111 1000 -011 1111 1111 ------------ # PLD
482 LDRH_ri 1111 1000 .011 1111 .... ............ @ldst_ri_lit
483 }
484 {
485 NOP 1111 1000 1011 ---- 1111 ------------ # PLDW
486 LDRH_ri 1111 1000 1011 .... .... ............ @ldst_ri_pos
487 }
488 LDRH_ri 1111 1000 0011 .... .... 1..1 ........ @ldst_ri_idx
489 {
490 NOP 1111 1000 0011 ---- 1111 1100 -------- # PLDW
491 LDRH_ri 1111 1000 0011 .... .... 1100 ........ @ldst_ri_neg
492 }
493 LDRHT_ri 1111 1000 0011 .... .... 1110 ........ @ldst_ri_unp
494 {
495 NOP 1111 1000 0011 ---- 1111 000000 -- ---- # PLDW
496 LDRH_rr 1111 1000 0011 .... .... 000000 .. .... @ldst_rr
497 }
498}
499{
500 LDR_ri 1111 1000 .101 1111 .... ............ @ldst_ri_lit
501 LDR_ri 1111 1000 1101 .... .... ............ @ldst_ri_pos
502 LDR_ri 1111 1000 0101 .... .... 1..1 ........ @ldst_ri_idx
503 LDR_ri 1111 1000 0101 .... .... 1100 ........ @ldst_ri_neg
504 LDRT_ri 1111 1000 0101 .... .... 1110 ........ @ldst_ri_unp
505 LDR_rr 1111 1000 0101 .... .... 000000 .. .... @ldst_rr
506}
507# NOPs here are PLI.
508{
509 {
510 NOP 1111 1001 -001 1111 1111 ------------
511 LDRSB_ri 1111 1001 .001 1111 .... ............ @ldst_ri_lit
512 }
513 {
514 NOP 1111 1001 1001 ---- 1111 ------------
515 LDRSB_ri 1111 1001 1001 .... .... ............ @ldst_ri_pos
516 }
517 LDRSB_ri 1111 1001 0001 .... .... 1..1 ........ @ldst_ri_idx
518 {
519 NOP 1111 1001 0001 ---- 1111 1100 --------
520 LDRSB_ri 1111 1001 0001 .... .... 1100 ........ @ldst_ri_neg
521 }
522 LDRSBT_ri 1111 1001 0001 .... .... 1110 ........ @ldst_ri_unp
523 {
524 NOP 1111 1001 0001 ---- 1111 000000 -- ----
525 LDRSB_rr 1111 1001 0001 .... .... 000000 .. .... @ldst_rr
526 }
527}
528# NOPs here are unallocated memory hints, treated as NOP.
529{
530 {
531 NOP 1111 1001 -011 1111 1111 ------------
532 LDRSH_ri 1111 1001 .011 1111 .... ............ @ldst_ri_lit
533 }
534 {
535 NOP 1111 1001 1011 ---- 1111 ------------
536 LDRSH_ri 1111 1001 1011 .... .... ............ @ldst_ri_pos
537 }
538 LDRSH_ri 1111 1001 0011 .... .... 1..1 ........ @ldst_ri_idx
539 {
540 NOP 1111 1001 0011 ---- 1111 1100 --------
541 LDRSH_ri 1111 1001 0011 .... .... 1100 ........ @ldst_ri_neg
542 }
543 LDRSHT_ri 1111 1001 0011 .... .... 1110 ........ @ldst_ri_unp
544 {
545 NOP 1111 1001 0011 ---- 1111 000000 -- ----
546 LDRSH_rr 1111 1001 0011 .... .... 000000 .. .... @ldst_rr
547 }
548}
549
550%imm8x4 0:8 !function=times_4
551&ldst_ri2 p w u rn rt rt2 imm
552@ldstd_ri8 .... .... u:1 ... rn:4 rt:4 rt2:4 ........ \
553 &ldst_ri2 imm=%imm8x4
554
555STRD_ri_t32 1110 1000 .110 .... .... .... ........ @ldstd_ri8 w=1 p=0
556LDRD_ri_t32 1110 1000 .111 .... .... .... ........ @ldstd_ri8 w=1 p=0
557
558STRD_ri_t32 1110 1001 .100 .... .... .... ........ @ldstd_ri8 w=0 p=1
559LDRD_ri_t32 1110 1001 .101 .... .... .... ........ @ldstd_ri8 w=0 p=1
560
561STRD_ri_t32 1110 1001 .110 .... .... .... ........ @ldstd_ri8 w=1 p=1
35d240ac
RH
562{
563 SG 1110 1001 0111 1111 1110 1001 01111111
564 LDRD_ri_t32 1110 1001 .111 .... .... .... ........ @ldstd_ri8 w=1 p=1
565}
1efdd407 566
808092bb 567# Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
1efdd407
RH
568
569@strex_i .... .... .... rn:4 rt:4 rd:4 .... .... \
570 &strex rt2=15 imm=%imm8x4
571@strex_0 .... .... .... rn:4 rt:4 .... .... rd:4 \
572 &strex rt2=15 imm=0
573@strex_d .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
574 &strex imm=0
575
576@ldrex_i .... .... .... rn:4 rt:4 .... .... .... \
577 &ldrex rt2=15 imm=%imm8x4
578@ldrex_0 .... .... .... rn:4 rt:4 .... .... .... \
579 &ldrex rt2=15 imm=0
580@ldrex_d .... .... .... rn:4 rt:4 rt2:4 .... .... \
581 &ldrex imm=0
582
d449f174
RH
583{
584 TT 1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
585 STREX 1110 1000 0100 .... .... .... .... .... @strex_i
586}
1efdd407
RH
587STREXB 1110 1000 1100 .... .... 1111 0100 .... @strex_0
588STREXH 1110 1000 1100 .... .... 1111 0101 .... @strex_0
589STREXD_t32 1110 1000 1100 .... .... .... 0111 .... @strex_d
590
591STLEX 1110 1000 1100 .... .... 1111 1110 .... @strex_0
592STLEXB 1110 1000 1100 .... .... 1111 1100 .... @strex_0
593STLEXH 1110 1000 1100 .... .... 1111 1101 .... @strex_0
594STLEXD_t32 1110 1000 1100 .... .... .... 1111 .... @strex_d
595
596STL 1110 1000 1100 .... .... 1111 1010 1111 @ldrex_0
597STLB 1110 1000 1100 .... .... 1111 1000 1111 @ldrex_0
598STLH 1110 1000 1100 .... .... 1111 1001 1111 @ldrex_0
599
600LDREX 1110 1000 0101 .... .... 1111 .... .... @ldrex_i
601LDREXB 1110 1000 1101 .... .... 1111 0100 1111 @ldrex_0
602LDREXH 1110 1000 1101 .... .... 1111 0101 1111 @ldrex_0
603LDREXD_t32 1110 1000 1101 .... .... .... 0111 1111 @ldrex_d
604
605LDAEX 1110 1000 1101 .... .... 1111 1110 1111 @ldrex_0
606LDAEXB 1110 1000 1101 .... .... 1111 1100 1111 @ldrex_0
607LDAEXH 1110 1000 1101 .... .... 1111 1101 1111 @ldrex_0
608LDAEXD_t32 1110 1000 1101 .... .... .... 1111 1111 @ldrex_d
609
610LDA 1110 1000 1101 .... .... 1111 1010 1111 @ldrex_0
611LDAB 1110 1000 1101 .... .... 1111 1000 1111 @ldrex_0
612LDAH 1110 1000 1101 .... .... 1111 1001 1111 @ldrex_0
adf1a566 613
808092bb
RH
614&tbranch rn rm
615@tbranch .... .... .... rn:4 .... .... .... rm:4 &tbranch
616
617TBB 1110 1000 1101 .... 1111 0000 0000 .... @tbranch
618TBH 1110 1000 1101 .... 1111 0000 0001 .... @tbranch
619
adf1a566
RH
620# Parallel addition and subtraction
621
622SADD8 1111 1010 1000 .... 1111 .... 0000 .... @rndm
623QADD8 1111 1010 1000 .... 1111 .... 0001 .... @rndm
624SHADD8 1111 1010 1000 .... 1111 .... 0010 .... @rndm
625UADD8 1111 1010 1000 .... 1111 .... 0100 .... @rndm
626UQADD8 1111 1010 1000 .... 1111 .... 0101 .... @rndm
627UHADD8 1111 1010 1000 .... 1111 .... 0110 .... @rndm
628
629SADD16 1111 1010 1001 .... 1111 .... 0000 .... @rndm
630QADD16 1111 1010 1001 .... 1111 .... 0001 .... @rndm
631SHADD16 1111 1010 1001 .... 1111 .... 0010 .... @rndm
632UADD16 1111 1010 1001 .... 1111 .... 0100 .... @rndm
633UQADD16 1111 1010 1001 .... 1111 .... 0101 .... @rndm
634UHADD16 1111 1010 1001 .... 1111 .... 0110 .... @rndm
635
636SASX 1111 1010 1010 .... 1111 .... 0000 .... @rndm
637QASX 1111 1010 1010 .... 1111 .... 0001 .... @rndm
638SHASX 1111 1010 1010 .... 1111 .... 0010 .... @rndm
639UASX 1111 1010 1010 .... 1111 .... 0100 .... @rndm
640UQASX 1111 1010 1010 .... 1111 .... 0101 .... @rndm
641UHASX 1111 1010 1010 .... 1111 .... 0110 .... @rndm
642
643SSUB8 1111 1010 1100 .... 1111 .... 0000 .... @rndm
644QSUB8 1111 1010 1100 .... 1111 .... 0001 .... @rndm
645SHSUB8 1111 1010 1100 .... 1111 .... 0010 .... @rndm
646USUB8 1111 1010 1100 .... 1111 .... 0100 .... @rndm
647UQSUB8 1111 1010 1100 .... 1111 .... 0101 .... @rndm
648UHSUB8 1111 1010 1100 .... 1111 .... 0110 .... @rndm
649
650SSUB16 1111 1010 1101 .... 1111 .... 0000 .... @rndm
651QSUB16 1111 1010 1101 .... 1111 .... 0001 .... @rndm
652SHSUB16 1111 1010 1101 .... 1111 .... 0010 .... @rndm
653USUB16 1111 1010 1101 .... 1111 .... 0100 .... @rndm
654UQSUB16 1111 1010 1101 .... 1111 .... 0101 .... @rndm
655UHSUB16 1111 1010 1101 .... 1111 .... 0110 .... @rndm
656
657SSAX 1111 1010 1110 .... 1111 .... 0000 .... @rndm
658QSAX 1111 1010 1110 .... 1111 .... 0001 .... @rndm
659SHSAX 1111 1010 1110 .... 1111 .... 0010 .... @rndm
660USAX 1111 1010 1110 .... 1111 .... 0100 .... @rndm
661UQSAX 1111 1010 1110 .... 1111 .... 0101 .... @rndm
662UHSAX 1111 1010 1110 .... 1111 .... 0110 .... @rndm
46497f6a
RH
663
664# Register extends
665
666@rrr_rot .... .... .... rn:4 .... rd:4 .. rot:2 rm:4 &rrr_rot
667
668SXTAH 1111 1010 0000 .... 1111 .... 10.. .... @rrr_rot
669UXTAH 1111 1010 0001 .... 1111 .... 10.. .... @rrr_rot
670SXTAB16 1111 1010 0010 .... 1111 .... 10.. .... @rrr_rot
671UXTAB16 1111 1010 0011 .... 1111 .... 10.. .... @rrr_rot
672SXTAB 1111 1010 0100 .... 1111 .... 10.. .... @rrr_rot
673UXTAB 1111 1010 0101 .... 1111 .... 10.. .... @rrr_rot
c5c426d4
RH
674
675# Load/store multiple
676
677@ldstm .... .... .. w:1 . rn:4 list:16 &ldst_block u=0
678
679STM_t32 1110 1000 10.0 .... ................ @ldstm i=1 b=0
680STM_t32 1110 1001 00.0 .... ................ @ldstm i=0 b=1
6e21a013
PM
681{
682 # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding
683 CLRM 1110 1000 1001 1111 list:16
684 LDM_t32 1110 1000 10.1 .... ................ @ldstm i=1 b=0
685}
c5c426d4 686LDM_t32 1110 1001 00.1 .... ................ @ldstm i=0 b=1
360144f3 687
885782a7
RH
688&rfe !extern rn w pu
689@rfe .... .... .. w:1 . rn:4 ................ &rfe
690
691RFE 1110 1000 00.1 .... 1100000000000000 @rfe pu=2
692RFE 1110 1001 10.1 .... 1100000000000000 @rfe pu=1
693
694&srs !extern mode w pu
695@srs .... .... .. w:1 . .... ........... mode:5 &srs
696
697SRS 1110 1000 00.0 1101 1100 0000 000. .... @srs pu=2
698SRS 1110 1001 10.0 1101 1100 0000 000. .... @srs pu=1
699
4c498dcf
PM
700# Coprocessor instructions
701
702# We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
703# other coprocessor instructions always UNDEF.
704# The trans_ functions for these will ignore cp values 8..13 for v7 or
705# earlier, and 0..13 for v8 and later, because those areas of the
706# encoding space may be used for other things, such as VFP or Neon.
707
708@mcr .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4
709@mcrr .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4
710
711MCRR 1110 1100 0100 .... .... .... .... .... @mcrr
712MRRC 1110 1100 0101 .... .... .... .... .... @mcrr
713
714MCR 1110 1110 ... 0 .... .... .... ... 1 .... @mcr
715MRC 1110 1110 ... 1 .... .... .... ... 1 .... @mcr
716
360144f3
RH
717# Branches
718
719%imm24 26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
720@branch24 ................................ &i imm=%imm24
721
722B 1111 0. .......... 10.1 ............ @branch24
723BL 1111 0. .......... 11.1 ............ @branch24
05903f03
PM
724{
725 # BLX_i is non-M-profile only
726 BLX_i 1111 0. .......... 11.0 ............ @branch24
727 # M-profile only: loop and branch insns
728 [
729 # All these BF insns have boff != 0b0000; we NOP them all
730 BF 1111 0 boff:4 ------- 1100 - ---------- 1 # BFL
731 BF 1111 0 boff:4 0 ------ 1110 - ---------- 1 # BFCSEL
732 BF 1111 0 boff:4 10 ----- 1110 - ---------- 1 # BF
733 BF 1111 0 boff:4 11 ----- 1110 0 0000000000 1 # BFX, BFLX
734 ]
b7226369
PM
735 [
736 # LE and WLS immediate
737 %lob_imm 1:10 11:1 !function=times_2
738
40a36f00 739 DLS 1111 0 0000 100 rn:4 1110 0000 0000 0001 size=4
6822abfd
PM
740 WLS 1111 0 0000 100 rn:4 1100 . .......... 1 imm=%lob_imm size=4
741 {
a454ea1e 742 LE 1111 0 0000 0 f:1 tp:1 1111 1100 . .......... 1 imm=%lob_imm
6822abfd
PM
743 # This is WLSTP
744 WLS 1111 0 0000 0 size:2 rn:4 1100 . .......... 1 imm=%lob_imm
745 }
40a36f00
PM
746 {
747 LCTP 1111 0 0000 000 1111 1110 0000 0000 0001
748 # This is DLSTP
749 DLS 1111 0 0000 0 size:2 rn:4 1110 0000 0000 0001
750 }
0f31e37c 751 VCTP 1111 0 0000 0 size:2 rn:4 1110 1000 0000 0001
b7226369 752 ]
05903f03 753}