xref: /openbmc/qemu/target/arm/tcg/a32.decode (revision 7d87775f)
1# A32 conditional 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# All of the insn that have a COND field in insn[31:28] are here.
22# All insns that have 0xf in insn[31:28] are in a32-uncond.decode.
23#
24
25&empty
26&s_rrr_shi       s rd rn rm shim shty
27&s_rrr_shr       s rn rd rm rs shty
28&s_rri_rot       s rn rd imm rot
29&s_rrrr          s rd rn rm ra
30&rrrr            rd rn rm ra
31&rrr_rot         rd rn rm rot
32&rrr             rd rn rm
33&rr              rd rm
34&ri              rd imm
35&r               rm
36&i               imm
37&msr_reg         rn r mask
38&mrs_reg         rd r
39&msr_bank        rn r sysm
40&mrs_bank        rd r sysm
41&ldst_rr         p w u rn rt rm shimm shtype
42&ldst_ri         p w u rn rt imm
43&ldst_block      rn i b u w list
44&strex           rn rd rt rt2 imm
45&ldrex           rn rt rt2 imm
46&bfx             rd rn lsb widthm1
47&bfi             rd rn lsb msb
48&sat             rd rn satimm imm sh
49&pkh             rd rn rm imm tb
50&mcr             cp opc1 crn crm opc2 rt
51&mcrr            cp opc1 crm rt rt2
52
53# Data-processing (register)
54
55@s_rrr_shi       ---- ... .... s:1 rn:4 rd:4 shim:5 shty:2 . rm:4 \
56                 &s_rrr_shi
57@s_rxr_shi       ---- ... .... s:1 .... rd:4 shim:5 shty:2 . rm:4 \
58                 &s_rrr_shi rn=0
59@S_xrr_shi       ---- ... .... .   rn:4 .... shim:5 shty:2 . rm:4 \
60                 &s_rrr_shi s=1 rd=0
61
62AND_rrri         .... 000 0000 . .... .... ..... .. 0 ....    @s_rrr_shi
63EOR_rrri         .... 000 0001 . .... .... ..... .. 0 ....    @s_rrr_shi
64SUB_rrri         .... 000 0010 . .... .... ..... .. 0 ....    @s_rrr_shi
65RSB_rrri         .... 000 0011 . .... .... ..... .. 0 ....    @s_rrr_shi
66ADD_rrri         .... 000 0100 . .... .... ..... .. 0 ....    @s_rrr_shi
67ADC_rrri         .... 000 0101 . .... .... ..... .. 0 ....    @s_rrr_shi
68SBC_rrri         .... 000 0110 . .... .... ..... .. 0 ....    @s_rrr_shi
69RSC_rrri         .... 000 0111 . .... .... ..... .. 0 ....    @s_rrr_shi
70TST_xrri         .... 000 1000 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
71TEQ_xrri         .... 000 1001 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
72CMP_xrri         .... 000 1010 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
73CMN_xrri         .... 000 1011 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
74ORR_rrri         .... 000 1100 . .... .... ..... .. 0 ....    @s_rrr_shi
75MOV_rxri         .... 000 1101 . 0000 .... ..... .. 0 ....    @s_rxr_shi
76BIC_rrri         .... 000 1110 . .... .... ..... .. 0 ....    @s_rrr_shi
77MVN_rxri         .... 000 1111 . 0000 .... ..... .. 0 ....    @s_rxr_shi
78
79%imm16           16:4 0:12
80@mov16           ---- .... .... .... rd:4 ............        &ri imm=%imm16
81
82MOVW             .... 0011 0000 .... .... ............        @mov16
83MOVT             .... 0011 0100 .... .... ............        @mov16
84
85# Data-processing (register-shifted register)
86
87@s_rrr_shr       ---- ... .... s:1 rn:4 rd:4 rs:4 . shty:2 . rm:4 \
88                 &s_rrr_shr
89@s_rxr_shr       ---- ... .... s:1 .... rd:4 rs:4 . shty:2 . rm:4 \
90                 &s_rrr_shr rn=0
91@S_xrr_shr       ---- ... .... .   rn:4 .... rs:4 . shty:2 . rm:4 \
92                 &s_rrr_shr rd=0 s=1
93
94AND_rrrr         .... 000 0000 . .... .... .... 0 .. 1 ....   @s_rrr_shr
95EOR_rrrr         .... 000 0001 . .... .... .... 0 .. 1 ....   @s_rrr_shr
96SUB_rrrr         .... 000 0010 . .... .... .... 0 .. 1 ....   @s_rrr_shr
97RSB_rrrr         .... 000 0011 . .... .... .... 0 .. 1 ....   @s_rrr_shr
98ADD_rrrr         .... 000 0100 . .... .... .... 0 .. 1 ....   @s_rrr_shr
99ADC_rrrr         .... 000 0101 . .... .... .... 0 .. 1 ....   @s_rrr_shr
100SBC_rrrr         .... 000 0110 . .... .... .... 0 .. 1 ....   @s_rrr_shr
101RSC_rrrr         .... 000 0111 . .... .... .... 0 .. 1 ....   @s_rrr_shr
102TST_xrrr         .... 000 1000 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
103TEQ_xrrr         .... 000 1001 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
104CMP_xrrr         .... 000 1010 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
105CMN_xrrr         .... 000 1011 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
106ORR_rrrr         .... 000 1100 . .... .... .... 0 .. 1 ....   @s_rrr_shr
107MOV_rxrr         .... 000 1101 . 0000 .... .... 0 .. 1 ....   @s_rxr_shr
108BIC_rrrr         .... 000 1110 . .... .... .... 0 .. 1 ....   @s_rrr_shr
109MVN_rxrr         .... 000 1111 . 0000 .... .... 0 .. 1 ....   @s_rxr_shr
110
111# Data-processing (immediate)
112
113%a32extrot       8:4 !function=times_2
114
115@s_rri_rot       ---- ... .... s:1 rn:4 rd:4 .... imm:8 \
116                 &s_rri_rot rot=%a32extrot
117@s_rxi_rot       ---- ... .... s:1 .... rd:4 .... imm:8 \
118                 &s_rri_rot rot=%a32extrot rn=0
119@S_xri_rot       ---- ... .... .   rn:4 .... .... imm:8 \
120                 &s_rri_rot rot=%a32extrot rd=0 s=1
121
122AND_rri          .... 001 0000 . .... .... ............       @s_rri_rot
123EOR_rri          .... 001 0001 . .... .... ............       @s_rri_rot
124SUB_rri          .... 001 0010 . .... .... ............       @s_rri_rot
125RSB_rri          .... 001 0011 . .... .... ............       @s_rri_rot
126ADD_rri          .... 001 0100 . .... .... ............       @s_rri_rot
127ADC_rri          .... 001 0101 . .... .... ............       @s_rri_rot
128SBC_rri          .... 001 0110 . .... .... ............       @s_rri_rot
129RSC_rri          .... 001 0111 . .... .... ............       @s_rri_rot
130TST_xri          .... 001 1000 1 .... 0000 ............       @S_xri_rot
131TEQ_xri          .... 001 1001 1 .... 0000 ............       @S_xri_rot
132CMP_xri          .... 001 1010 1 .... 0000 ............       @S_xri_rot
133CMN_xri          .... 001 1011 1 .... 0000 ............       @S_xri_rot
134ORR_rri          .... 001 1100 . .... .... ............       @s_rri_rot
135MOV_rxi          .... 001 1101 . 0000 .... ............       @s_rxi_rot
136BIC_rri          .... 001 1110 . .... .... ............       @s_rri_rot
137MVN_rxi          .... 001 1111 . 0000 .... ............       @s_rxi_rot
138
139# Multiply and multiply accumulate
140
141@s_rdamn         ---- .... ... s:1 rd:4 ra:4 rm:4 .... rn:4   &s_rrrr
142@s_rd0mn         ---- .... ... s:1 rd:4 .... rm:4 .... rn:4   &s_rrrr ra=0
143@rdamn           ---- .... ... .   rd:4 ra:4 rm:4 .... rn:4   &rrrr
144@rd0mn           ---- .... ... .   rd:4 .... rm:4 .... rn:4   &rrrr ra=0
145
146MUL              .... 0000 000 . .... 0000 .... 1001 ....     @s_rd0mn
147MLA              .... 0000 001 . .... .... .... 1001 ....     @s_rdamn
148UMAAL            .... 0000 010 0 .... .... .... 1001 ....     @rdamn
149MLS              .... 0000 011 0 .... .... .... 1001 ....     @rdamn
150UMULL            .... 0000 100 . .... .... .... 1001 ....     @s_rdamn
151UMLAL            .... 0000 101 . .... .... .... 1001 ....     @s_rdamn
152SMULL            .... 0000 110 . .... .... .... 1001 ....     @s_rdamn
153SMLAL            .... 0000 111 . .... .... .... 1001 ....     @s_rdamn
154
155# Saturating addition and subtraction
156
157@rndm            ---- .... .... rn:4 rd:4 .... .... rm:4      &rrr
158
159QADD             .... 0001 0000 .... .... 0000 0101 ....      @rndm
160QSUB             .... 0001 0010 .... .... 0000 0101 ....      @rndm
161QDADD            .... 0001 0100 .... .... 0000 0101 ....      @rndm
162QDSUB            .... 0001 0110 .... .... 0000 0101 ....      @rndm
163
164# Halfword multiply and multiply accumulate
165
166SMLABB           .... 0001 0000 .... .... .... 1000 ....      @rdamn
167SMLABT           .... 0001 0000 .... .... .... 1100 ....      @rdamn
168SMLATB           .... 0001 0000 .... .... .... 1010 ....      @rdamn
169SMLATT           .... 0001 0000 .... .... .... 1110 ....      @rdamn
170SMLAWB           .... 0001 0010 .... .... .... 1000 ....      @rdamn
171SMULWB           .... 0001 0010 .... 0000 .... 1010 ....      @rd0mn
172SMLAWT           .... 0001 0010 .... .... .... 1100 ....      @rdamn
173SMULWT           .... 0001 0010 .... 0000 .... 1110 ....      @rd0mn
174SMLALBB          .... 0001 0100 .... .... .... 1000 ....      @rdamn
175SMLALBT          .... 0001 0100 .... .... .... 1100 ....      @rdamn
176SMLALTB          .... 0001 0100 .... .... .... 1010 ....      @rdamn
177SMLALTT          .... 0001 0100 .... .... .... 1110 ....      @rdamn
178SMULBB           .... 0001 0110 .... 0000 .... 1000 ....      @rd0mn
179SMULBT           .... 0001 0110 .... 0000 .... 1100 ....      @rd0mn
180SMULTB           .... 0001 0110 .... 0000 .... 1010 ....      @rd0mn
181SMULTT           .... 0001 0110 .... 0000 .... 1110 ....      @rd0mn
182
183# MSR (immediate) and hints
184
185&msr_i           r mask rot imm
186@msr_i           ---- .... .... mask:4 .... rot:4 imm:8       &msr_i
187
188{
189  {
190    [
191      YIELD      ---- 0011 0010 0000 1111 ---- 0000 0001
192      WFE        ---- 0011 0010 0000 1111 ---- 0000 0010
193      WFI        ---- 0011 0010 0000 1111 ---- 0000 0011
194
195      # TODO: Implement SEV, SEVL; may help SMP performance.
196      # SEV      ---- 0011 0010 0000 1111 ---- 0000 0100
197      # SEVL     ---- 0011 0010 0000 1111 ---- 0000 0101
198
199      ESB        ---- 0011 0010 0000 1111 ---- 0001 0000
200    ]
201
202    # The canonical nop ends in 00000000, but the whole of the
203    # rest of the space executes as nop if otherwise unsupported.
204    NOP          ---- 0011 0010 0000 1111 ---- ---- ----
205  }
206  # Note mask = 0 is covered by NOP
207  MSR_imm        .... 0011 0010 .... 1111 .... .... ....      @msr_i r=0
208}
209MSR_imm          .... 0011 0110 .... 1111 .... .... ....      @msr_i r=1
210
211# Cyclic Redundancy Check
212
213CRC32B           .... 0001 0000 .... .... 0000 0100 ....      @rndm
214CRC32H           .... 0001 0010 .... .... 0000 0100 ....      @rndm
215CRC32W           .... 0001 0100 .... .... 0000 0100 ....      @rndm
216CRC32CB          .... 0001 0000 .... .... 0010 0100 ....      @rndm
217CRC32CH          .... 0001 0010 .... .... 0010 0100 ....      @rndm
218CRC32CW          .... 0001 0100 .... .... 0010 0100 ....      @rndm
219
220# Miscellaneous instructions
221
222%sysm            8:1 16:4
223%imm16_8_0       8:12 0:4
224
225@rm              ---- .... .... .... .... .... .... rm:4      &r
226@rdm             ---- .... .... .... rd:4 .... .... rm:4      &rr
227@i16             ---- .... .... .... .... .... .... ....      &i imm=%imm16_8_0
228
229MRS_bank         ---- 0001 0 r:1 00 .... rd:4 001. 0000 0000  &mrs_bank %sysm
230MSR_bank         ---- 0001 0 r:1 10 .... 1111 001. 0000 rn:4  &msr_bank %sysm
231
232MRS_reg          ---- 0001 0 r:1 00 1111   rd:4 0000 0000 0000  &mrs_reg
233MSR_reg          ---- 0001 0 r:1 10 mask:4 1111 0000 0000 rn:4  &msr_reg
234
235BX               .... 0001 0010 1111 1111 1111 0001 ....      @rm
236BXJ              .... 0001 0010 1111 1111 1111 0010 ....      @rm
237BLX_r            .... 0001 0010 1111 1111 1111 0011 ....      @rm
238
239CLZ              .... 0001 0110 1111 .... 1111 0001 ....      @rdm
240
241ERET             ---- 0001 0110 0000 0000 0000 0110 1110
242
243HLT              .... 0001 0000 .... .... .... 0111 ....      @i16
244BKPT             .... 0001 0010 .... .... .... 0111 ....      @i16
245HVC              .... 0001 0100 .... .... .... 0111 ....      @i16
246SMC              ---- 0001 0110 0000 0000 0000 0111 imm:4     &i
247
248# Load/Store Dual, Half, Signed Byte (register)
249
250@ldst_rr_p1w     ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... rm:4 \
251                 &ldst_rr p=1 shimm=0 shtype=0
252@ldst_rr_pw0     ---- ...0 u:1 . 0   . rn:4 rt:4 .... .... rm:4 \
253                 &ldst_rr p=0 w=0 shimm=0 shtype=0
254
255STRH_rr          .... 000. .0.0 .... .... 0000 1011 ....      @ldst_rr_pw0
256STRH_rr          .... 000. .0.0 .... .... 0000 1011 ....      @ldst_rr_p1w
257
258LDRD_rr          .... 000. .0.0 .... .... 0000 1101 ....      @ldst_rr_pw0
259LDRD_rr          .... 000. .0.0 .... .... 0000 1101 ....      @ldst_rr_p1w
260
261STRD_rr          .... 000. .0.0 .... .... 0000 1111 ....      @ldst_rr_pw0
262STRD_rr          .... 000. .0.0 .... .... 0000 1111 ....      @ldst_rr_p1w
263
264LDRH_rr          .... 000. .0.1 .... .... 0000 1011 ....      @ldst_rr_pw0
265LDRH_rr          .... 000. .0.1 .... .... 0000 1011 ....      @ldst_rr_p1w
266
267LDRSB_rr         .... 000. .0.1 .... .... 0000 1101 ....      @ldst_rr_pw0
268LDRSB_rr         .... 000. .0.1 .... .... 0000 1101 ....      @ldst_rr_p1w
269
270LDRSH_rr         .... 000. .0.1 .... .... 0000 1111 ....      @ldst_rr_pw0
271LDRSH_rr         .... 000. .0.1 .... .... 0000 1111 ....      @ldst_rr_p1w
272
273# Note the unpriv load/stores use the previously invalid P=0, W=1 encoding,
274# and act as normal post-indexed (P=0, W=0).
275@ldst_rr_p0w1    ---- ...0 u:1 . 1   . rn:4 rt:4 .... .... rm:4 \
276                 &ldst_rr p=0 w=0 shimm=0 shtype=0
277
278STRHT_rr         .... 000. .0.0 .... .... 0000 1011 ....      @ldst_rr_p0w1
279LDRHT_rr         .... 000. .0.1 .... .... 0000 1011 ....      @ldst_rr_p0w1
280LDRSBT_rr        .... 000. .0.1 .... .... 0000 1101 ....      @ldst_rr_p0w1
281LDRSHT_rr        .... 000. .0.1 .... .... 0000 1111 ....      @ldst_rr_p0w1
282
283# Load/Store word and unsigned byte (register)
284
285@ldst_rs_p1w     ---- ...1 u:1 . w:1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \
286                 &ldst_rr p=1
287@ldst_rs_pw0     ---- ...0 u:1 . 0   . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \
288                 &ldst_rr p=0 w=0
289
290STR_rr           .... 011. .0.0 .... .... .... ...0 ....      @ldst_rs_pw0
291STR_rr           .... 011. .0.0 .... .... .... ...0 ....      @ldst_rs_p1w
292STRB_rr          .... 011. .1.0 .... .... .... ...0 ....      @ldst_rs_pw0
293STRB_rr          .... 011. .1.0 .... .... .... ...0 ....      @ldst_rs_p1w
294
295LDR_rr           .... 011. .0.1 .... .... .... ...0 ....      @ldst_rs_pw0
296LDR_rr           .... 011. .0.1 .... .... .... ...0 ....      @ldst_rs_p1w
297LDRB_rr          .... 011. .1.1 .... .... .... ...0 ....      @ldst_rs_pw0
298LDRB_rr          .... 011. .1.1 .... .... .... ...0 ....      @ldst_rs_p1w
299
300@ldst_rs_p0w1    ---- ...0 u:1 . 1   . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \
301                 &ldst_rr p=0 w=0
302
303STRT_rr          .... 011. .0.0 .... .... .... ...0 ....      @ldst_rs_p0w1
304STRBT_rr         .... 011. .1.0 .... .... .... ...0 ....      @ldst_rs_p0w1
305LDRT_rr          .... 011. .0.1 .... .... .... ...0 ....      @ldst_rs_p0w1
306LDRBT_rr         .... 011. .1.1 .... .... .... ...0 ....      @ldst_rs_p0w1
307
308# Load/Store Dual, Half, Signed Byte (immediate)
309
310%imm8s_8_0       8:4 0:4
311@ldst_ri8_p1w    ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... .... \
312                 &ldst_ri imm=%imm8s_8_0 p=1
313@ldst_ri8_pw0    ---- ...0 u:1 . 0   . rn:4 rt:4 .... .... .... \
314                 &ldst_ri imm=%imm8s_8_0 p=0 w=0
315
316STRH_ri          .... 000. .1.0 .... .... .... 1011 ....      @ldst_ri8_pw0
317STRH_ri          .... 000. .1.0 .... .... .... 1011 ....      @ldst_ri8_p1w
318
319LDRD_ri_a32      .... 000. .1.0 .... .... .... 1101 ....      @ldst_ri8_pw0
320LDRD_ri_a32      .... 000. .1.0 .... .... .... 1101 ....      @ldst_ri8_p1w
321
322STRD_ri_a32      .... 000. .1.0 .... .... .... 1111 ....      @ldst_ri8_pw0
323STRD_ri_a32      .... 000. .1.0 .... .... .... 1111 ....      @ldst_ri8_p1w
324
325LDRH_ri          .... 000. .1.1 .... .... .... 1011 ....      @ldst_ri8_pw0
326LDRH_ri          .... 000. .1.1 .... .... .... 1011 ....      @ldst_ri8_p1w
327
328LDRSB_ri         .... 000. .1.1 .... .... .... 1101 ....      @ldst_ri8_pw0
329LDRSB_ri         .... 000. .1.1 .... .... .... 1101 ....      @ldst_ri8_p1w
330
331LDRSH_ri         .... 000. .1.1 .... .... .... 1111 ....      @ldst_ri8_pw0
332LDRSH_ri         .... 000. .1.1 .... .... .... 1111 ....      @ldst_ri8_p1w
333
334# Note the unpriv load/stores use the previously invalid P=0, W=1 encoding,
335# and act as normal post-indexed (P=0, W=0).
336@ldst_ri8_p0w1   ---- ...0 u:1 . 1   . rn:4 rt:4 .... .... .... \
337                 &ldst_ri imm=%imm8s_8_0 p=0 w=0
338
339STRHT_ri         .... 000. .1.0 .... .... .... 1011 ....      @ldst_ri8_p0w1
340LDRHT_ri         .... 000. .1.1 .... .... .... 1011 ....      @ldst_ri8_p0w1
341LDRSBT_ri        .... 000. .1.1 .... .... .... 1101 ....      @ldst_ri8_p0w1
342LDRSHT_ri        .... 000. .1.1 .... .... .... 1111 ....      @ldst_ri8_p0w1
343
344# Load/Store word and unsigned byte (immediate)
345
346@ldst_ri12_p1w   ---- ...1 u:1 . w:1 . rn:4 rt:4 imm:12       &ldst_ri p=1
347@ldst_ri12_pw0   ---- ...0 u:1 . 0   . rn:4 rt:4 imm:12       &ldst_ri p=0 w=0
348
349STR_ri           .... 010. .0.0 .... .... ............        @ldst_ri12_p1w
350STR_ri           .... 010. .0.0 .... .... ............        @ldst_ri12_pw0
351STRB_ri          .... 010. .1.0 .... .... ............        @ldst_ri12_p1w
352STRB_ri          .... 010. .1.0 .... .... ............        @ldst_ri12_pw0
353
354LDR_ri           .... 010. .0.1 .... .... ............        @ldst_ri12_p1w
355LDR_ri           .... 010. .0.1 .... .... ............        @ldst_ri12_pw0
356LDRB_ri          .... 010. .1.1 .... .... ............        @ldst_ri12_p1w
357LDRB_ri          .... 010. .1.1 .... .... ............        @ldst_ri12_pw0
358
359@ldst_ri12_p0w1  ---- ...0 u:1 . 1 . rn:4 rt:4 imm:12         &ldst_ri p=0 w=0
360
361STRT_ri          .... 010. .0.0 .... .... ............        @ldst_ri12_p0w1
362STRBT_ri         .... 010. .1.0 .... .... ............        @ldst_ri12_p0w1
363LDRT_ri          .... 010. .0.1 .... .... ............        @ldst_ri12_p0w1
364LDRBT_ri         .... 010. .1.1 .... .... ............        @ldst_ri12_p0w1
365
366# Synchronization primitives
367
368@swp             ---- .... .... rn:4 rt:4 .... .... rt2:4
369
370SWP              .... 0001 0000 .... .... 0000 1001 ....      @swp
371SWPB             .... 0001 0100 .... .... 0000 1001 ....      @swp
372
373# Load/Store Exclusive and Load-Acquire/Store-Release
374#
375# Note rt2 for STREXD/LDREXD is set by the helper after checking rt is even.
376
377@strex           ---- .... .... rn:4 rd:4 .... .... rt:4 \
378                 &strex imm=0 rt2=15
379@ldrex           ---- .... .... rn:4 rt:4 .... .... .... \
380                 &ldrex imm=0 rt2=15
381@stl             ---- .... .... rn:4 .... .... .... rt:4 \
382                 &ldrex imm=0 rt2=15
383
384STREX            .... 0001 1000 .... .... 1111 1001 ....      @strex
385STREXD_a32       .... 0001 1010 .... .... 1111 1001 ....      @strex
386STREXB           .... 0001 1100 .... .... 1111 1001 ....      @strex
387STREXH           .... 0001 1110 .... .... 1111 1001 ....      @strex
388
389STLEX            .... 0001 1000 .... .... 1110 1001 ....      @strex
390STLEXD_a32       .... 0001 1010 .... .... 1110 1001 ....      @strex
391STLEXB           .... 0001 1100 .... .... 1110 1001 ....      @strex
392STLEXH           .... 0001 1110 .... .... 1110 1001 ....      @strex
393
394STL              .... 0001 1000 .... 1111 1100 1001 ....      @stl
395STLB             .... 0001 1100 .... 1111 1100 1001 ....      @stl
396STLH             .... 0001 1110 .... 1111 1100 1001 ....      @stl
397
398LDREX            .... 0001 1001 .... .... 1111 1001 1111      @ldrex
399LDREXD_a32       .... 0001 1011 .... .... 1111 1001 1111      @ldrex
400LDREXB           .... 0001 1101 .... .... 1111 1001 1111      @ldrex
401LDREXH           .... 0001 1111 .... .... 1111 1001 1111      @ldrex
402
403LDAEX            .... 0001 1001 .... .... 1110 1001 1111      @ldrex
404LDAEXD_a32       .... 0001 1011 .... .... 1110 1001 1111      @ldrex
405LDAEXB           .... 0001 1101 .... .... 1110 1001 1111      @ldrex
406LDAEXH           .... 0001 1111 .... .... 1110 1001 1111      @ldrex
407
408LDA              .... 0001 1001 .... .... 1100 1001 1111      @ldrex
409LDAB             .... 0001 1101 .... .... 1100 1001 1111      @ldrex
410LDAH             .... 0001 1111 .... .... 1100 1001 1111      @ldrex
411
412# Media instructions
413
414# usad8 is usada8 w/ ra=15
415USADA8           ---- 0111 1000 rd:4 ra:4 rm:4 0001 rn:4
416
417# ubfx and sbfx
418@bfx             ---- .... ... widthm1:5 rd:4 lsb:5 ... rn:4  &bfx
419
420SBFX             .... 0111 101 ..... .... ..... 101 ....      @bfx
421UBFX             .... 0111 111 ..... .... ..... 101 ....      @bfx
422
423# bfc is bfi w/ rn=15
424BFCI             ---- 0111 110 msb:5 rd:4 lsb:5 001 rn:4      &bfi
425
426# While we could get UDEF by not including this, add the pattern for
427# documentation and to conflict with any other typos in this file.
428UDF              1110 0111 1111 ---- ---- ---- 1111 ----
429
430# Parallel addition and subtraction
431
432SADD16           .... 0110 0001 .... .... 1111 0001 ....      @rndm
433SASX             .... 0110 0001 .... .... 1111 0011 ....      @rndm
434SSAX             .... 0110 0001 .... .... 1111 0101 ....      @rndm
435SSUB16           .... 0110 0001 .... .... 1111 0111 ....      @rndm
436SADD8            .... 0110 0001 .... .... 1111 1001 ....      @rndm
437SSUB8            .... 0110 0001 .... .... 1111 1111 ....      @rndm
438
439QADD16           .... 0110 0010 .... .... 1111 0001 ....      @rndm
440QASX             .... 0110 0010 .... .... 1111 0011 ....      @rndm
441QSAX             .... 0110 0010 .... .... 1111 0101 ....      @rndm
442QSUB16           .... 0110 0010 .... .... 1111 0111 ....      @rndm
443QADD8            .... 0110 0010 .... .... 1111 1001 ....      @rndm
444QSUB8            .... 0110 0010 .... .... 1111 1111 ....      @rndm
445
446SHADD16          .... 0110 0011 .... .... 1111 0001 ....      @rndm
447SHASX            .... 0110 0011 .... .... 1111 0011 ....      @rndm
448SHSAX            .... 0110 0011 .... .... 1111 0101 ....      @rndm
449SHSUB16          .... 0110 0011 .... .... 1111 0111 ....      @rndm
450SHADD8           .... 0110 0011 .... .... 1111 1001 ....      @rndm
451SHSUB8           .... 0110 0011 .... .... 1111 1111 ....      @rndm
452
453UADD16           .... 0110 0101 .... .... 1111 0001 ....      @rndm
454UASX             .... 0110 0101 .... .... 1111 0011 ....      @rndm
455USAX             .... 0110 0101 .... .... 1111 0101 ....      @rndm
456USUB16           .... 0110 0101 .... .... 1111 0111 ....      @rndm
457UADD8            .... 0110 0101 .... .... 1111 1001 ....      @rndm
458USUB8            .... 0110 0101 .... .... 1111 1111 ....      @rndm
459
460UQADD16          .... 0110 0110 .... .... 1111 0001 ....      @rndm
461UQASX            .... 0110 0110 .... .... 1111 0011 ....      @rndm
462UQSAX            .... 0110 0110 .... .... 1111 0101 ....      @rndm
463UQSUB16          .... 0110 0110 .... .... 1111 0111 ....      @rndm
464UQADD8           .... 0110 0110 .... .... 1111 1001 ....      @rndm
465UQSUB8           .... 0110 0110 .... .... 1111 1111 ....      @rndm
466
467UHADD16          .... 0110 0111 .... .... 1111 0001 ....      @rndm
468UHASX            .... 0110 0111 .... .... 1111 0011 ....      @rndm
469UHSAX            .... 0110 0111 .... .... 1111 0101 ....      @rndm
470UHSUB16          .... 0110 0111 .... .... 1111 0111 ....      @rndm
471UHADD8           .... 0110 0111 .... .... 1111 1001 ....      @rndm
472UHSUB8           .... 0110 0111 .... .... 1111 1111 ....      @rndm
473
474# Packing, unpacking, saturation, and reversal
475
476PKH              ---- 0110 1000 rn:4 rd:4 imm:5 tb:1 01 rm:4  &pkh
477
478@sat             ---- .... ... satimm:5  rd:4 imm:5 sh:1 .. rn:4  &sat
479@sat16           ---- .... .... satimm:4 rd:4 .... .... rn:4 \
480                 &sat imm=0 sh=0
481
482SSAT             .... 0110 101. .... .... .... ..01 ....      @sat
483USAT             .... 0110 111. .... .... .... ..01 ....      @sat
484
485SSAT16           .... 0110 1010 .... .... 1111 0011 ....      @sat16
486USAT16           .... 0110 1110 .... .... 1111 0011 ....      @sat16
487
488@rrr_rot         ---- .... .... rn:4 rd:4 rot:2 ...... rm:4   &rrr_rot
489
490SXTAB16          .... 0110 1000 .... .... ..00 0111 ....      @rrr_rot
491SXTAB            .... 0110 1010 .... .... ..00 0111 ....      @rrr_rot
492SXTAH            .... 0110 1011 .... .... ..00 0111 ....      @rrr_rot
493UXTAB16          .... 0110 1100 .... .... ..00 0111 ....      @rrr_rot
494UXTAB            .... 0110 1110 .... .... ..00 0111 ....      @rrr_rot
495UXTAH            .... 0110 1111 .... .... ..00 0111 ....      @rrr_rot
496
497SEL              .... 0110 1000 .... .... 1111 1011 ....      @rndm
498REV              .... 0110 1011 1111 .... 1111 0011 ....      @rdm
499REV16            .... 0110 1011 1111 .... 1111 1011 ....      @rdm
500REVSH            .... 0110 1111 1111 .... 1111 1011 ....      @rdm
501RBIT             .... 0110 1111 1111 .... 1111 0011 ....      @rdm
502
503# Signed multiply, signed and unsigned divide
504
505@rdmn            ---- .... .... rd:4 .... rm:4 .... rn:4      &rrr
506
507SMLAD            .... 0111 0000 .... .... .... 0001 ....      @rdamn
508SMLADX           .... 0111 0000 .... .... .... 0011 ....      @rdamn
509SMLSD            .... 0111 0000 .... .... .... 0101 ....      @rdamn
510SMLSDX           .... 0111 0000 .... .... .... 0111 ....      @rdamn
511
512SDIV             .... 0111 0001 .... 1111 .... 0001 ....      @rdmn
513UDIV             .... 0111 0011 .... 1111 .... 0001 ....      @rdmn
514
515SMLALD           .... 0111 0100 .... .... .... 0001 ....      @rdamn
516SMLALDX          .... 0111 0100 .... .... .... 0011 ....      @rdamn
517SMLSLD           .... 0111 0100 .... .... .... 0101 ....      @rdamn
518SMLSLDX          .... 0111 0100 .... .... .... 0111 ....      @rdamn
519
520SMMLA            .... 0111 0101 .... .... .... 0001 ....      @rdamn
521SMMLAR           .... 0111 0101 .... .... .... 0011 ....      @rdamn
522SMMLS            .... 0111 0101 .... .... .... 1101 ....      @rdamn
523SMMLSR           .... 0111 0101 .... .... .... 1111 ....      @rdamn
524
525# Block data transfer
526
527STM              ---- 100 b:1 i:1 u:1 w:1 0 rn:4 list:16   &ldst_block
528LDM_a32          ---- 100 b:1 i:1 u:1 w:1 1 rn:4 list:16   &ldst_block
529
530# Branch, branch with link
531
532%imm26           0:s24  !function=times_4
533@branch          ---- .... ........................           &i imm=%imm26
534
535B                .... 1010 ........................           @branch
536BL               .... 1011 ........................           @branch
537
538# Coprocessor instructions
539
540# We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
541# other coprocessor instructions always UNDEF.
542# The trans_ functions for these will ignore cp values 8..13 for v7 or
543# earlier, and 0..13 for v8 and later, because those areas of the
544# encoding space may be used for other things, such as VFP or Neon.
545
546@mcr             ---- .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4 &mcr
547@mcrr            ---- .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4       &mcrr
548
549MCRR             .... 1100 0100 .... .... .... .... .... @mcrr
550MRRC             .... 1100 0101 .... .... .... .... .... @mcrr
551
552MCR              .... 1110 ... 0 .... .... .... ... 1 .... @mcr
553MRC              .... 1110 ... 1 .... .... .... ... 1 .... @mcr
554
555# Supervisor call
556
557SVC              ---- 1111 imm:24                             &i
558