aboutsummaryrefslogtreecommitdiff
path: root/target/arm/a32.decode
blob: f2ca48094955a8f98d0c8845ee68f7d78d1d4b36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
# A32 conditional instructions
#
#  Copyright (c) 2019 Linaro, Ltd
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, see <http://www.gnu.org/licenses/>.

#
# This file is processed by scripts/decodetree.py
#
# All of the insn that have a COND field in insn[31:28] are here.
# All insns that have 0xf in insn[31:28] are in a32-uncond.decode.
#

&empty
&s_rrr_shi       s rd rn rm shim shty
&s_rrr_shr       s rn rd rm rs shty
&s_rri_rot       s rn rd imm rot
&s_rrrr          s rd rn rm ra
&rrrr            rd rn rm ra
&rrr_rot         rd rn rm rot
&rrr             rd rn rm
&rr              rd rm
&ri              rd imm
&r               rm
&i               imm
&msr_reg         rn r mask
&mrs_reg         rd r
&msr_bank        rn r sysm
&mrs_bank        rd r sysm
&ldst_rr         p w u rn rt rm shimm shtype
&ldst_ri         p w u rn rt imm
&ldst_block      rn i b u w list
&strex           rn rd rt rt2 imm
&ldrex           rn rt rt2 imm
&bfx             rd rn lsb widthm1
&bfi             rd rn lsb msb
&sat             rd rn satimm imm sh
&pkh             rd rn rm imm tb
&mcr             cp opc1 crn crm opc2 rt
&mcrr            cp opc1 crm rt rt2

# Data-processing (register)

@s_rrr_shi       ---- ... .... s:1 rn:4 rd:4 shim:5 shty:2 . rm:4 \
                 &s_rrr_shi
@s_rxr_shi       ---- ... .... s:1 .... rd:4 shim:5 shty:2 . rm:4 \
                 &s_rrr_shi rn=0
@S_xrr_shi       ---- ... .... .   rn:4 .... shim:5 shty:2 . rm:4 \
                 &s_rrr_shi s=1 rd=0

AND_rrri         .... 000 0000 . .... .... ..... .. 0 ....    @s_rrr_shi
EOR_rrri         .... 000 0001 . .... .... ..... .. 0 ....    @s_rrr_shi
SUB_rrri         .... 000 0010 . .... .... ..... .. 0 ....    @s_rrr_shi
RSB_rrri         .... 000 0011 . .... .... ..... .. 0 ....    @s_rrr_shi
ADD_rrri         .... 000 0100 . .... .... ..... .. 0 ....    @s_rrr_shi
ADC_rrri         .... 000 0101 . .... .... ..... .. 0 ....    @s_rrr_shi
SBC_rrri         .... 000 0110 . .... .... ..... .. 0 ....    @s_rrr_shi
RSC_rrri         .... 000 0111 . .... .... ..... .. 0 ....    @s_rrr_shi
TST_xrri         .... 000 1000 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
TEQ_xrri         .... 000 1001 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
CMP_xrri         .... 000 1010 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
CMN_xrri         .... 000 1011 1 .... 0000 ..... .. 0 ....    @S_xrr_shi
ORR_rrri         .... 000 1100 . .... .... ..... .. 0 ....    @s_rrr_shi
MOV_rxri         .... 000 1101 . 0000 .... ..... .. 0 ....    @s_rxr_shi
BIC_rrri         .... 000 1110 . .... .... ..... .. 0 ....    @s_rrr_shi
MVN_rxri         .... 000 1111 . 0000 .... ..... .. 0 ....    @s_rxr_shi

%imm16           16:4 0:12
@mov16           ---- .... .... .... rd:4 ............        &ri imm=%imm16

MOVW             .... 0011 0000 .... .... ............        @mov16
MOVT             .... 0011 0100 .... .... ............        @mov16

# Data-processing (register-shifted register)

@s_rrr_shr       ---- ... .... s:1 rn:4 rd:4 rs:4 . shty:2 . rm:4 \
                 &s_rrr_shr
@s_rxr_shr       ---- ... .... s:1 .... rd:4 rs:4 . shty:2 . rm:4 \
                 &s_rrr_shr rn=0
@S_xrr_shr       ---- ... .... .   rn:4 .... rs:4 . shty:2 . rm:4 \
                 &s_rrr_shr rd=0 s=1

AND_rrrr         .... 000 0000 . .... .... .... 0 .. 1 ....   @s_rrr_shr
EOR_rrrr         .... 000 0001 . .... .... .... 0 .. 1 ....   @s_rrr_shr
SUB_rrrr         .... 000 0010 . .... .... .... 0 .. 1 ....   @s_rrr_shr
RSB_rrrr         .... 000 0011 . .... .... .... 0 .. 1 ....   @s_rrr_shr
ADD_rrrr         .... 000 0100 . .... .... .... 0 .. 1 ....   @s_rrr_shr
ADC_rrrr         .... 000 0101 . .... .... .... 0 .. 1 ....   @s_rrr_shr
SBC_rrrr         .... 000 0110 . .... .... .... 0 .. 1 ....   @s_rrr_shr
RSC_rrrr         .... 000 0111 . .... .... .... 0 .. 1 ....   @s_rrr_shr
TST_xrrr         .... 000 1000 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
TEQ_xrrr         .... 000 1001 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
CMP_xrrr         .... 000 1010 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
CMN_xrrr         .... 000 1011 1 .... 0000 .... 0 .. 1 ....   @S_xrr_shr
ORR_rrrr         .... 000 1100 . .... .... .... 0 .. 1 ....   @s_rrr_shr
MOV_rxrr         .... 000 1101 . 0000 .... .... 0 .. 1 ....   @s_rxr_shr
BIC_rrrr         .... 000 1110 . .... .... .... 0 .. 1 ....   @s_rrr_shr
MVN_rxrr         .... 000 1111 . 0000 .... .... 0 .. 1 ....   @s_rxr_shr

# Data-processing (immediate)

%a32extrot       8:4 !function=times_2

@s_rri_rot       ---- ... .... s:1 rn:4 rd:4 .... imm:8 \
                 &s_rri_rot rot=%a32extrot
@s_rxi_rot       ---- ... .... s:1 .... rd:4 .... imm:8 \
                 &s_rri_rot rot=%a32extrot rn=0
@S_xri_rot       ---- ... .... .   rn:4 .... .... imm:8 \
                 &s_rri_rot rot=%a32extrot rd=0 s=1

AND_rri          .... 001 0000 . .... .... ............       @s_rri_rot
EOR_rri          .... 001 0001 . .... .... ............       @s_rri_rot
SUB_rri          .... 001 0010 . .... .... ............       @s_rri_rot
RSB_rri          .... 001 0011 . .... .... ............       @s_rri_rot
ADD_rri          .... 001 0100 . .... .... ............       @s_rri_rot
ADC_rri          .... 001 0101 . .... .... ............       @s_rri_rot
SBC_rri          .... 001 0110 . .... .... ............       @s_rri_rot
RSC_rri          .... 001 0111 . .... .... ............       @s_rri_rot
TST_xri          .... 001 1000 1 .... 0000 ............       @S_xri_rot
TEQ_xri          .... 001 1001 1 .... 0000 ............       @S_xri_rot
CMP_xri          .... 001 1010 1 .... 0000 ............       @S_xri_rot
CMN_xri          .... 001 1011 1 .... 0000 ............       @S_xri_rot
ORR_rri          .... 001 1100 . .... .... ............       @s_rri_rot
MOV_rxi          .... 001 1101 . 0000 .... ............       @s_rxi_rot
BIC_rri          .... 001 1110 . .... .... ............       @s_rri_rot
MVN_rxi          .... 001 1111 . 0000 .... ............       @s_rxi_rot

# Multiply and multiply accumulate

@s_rdamn         ---- .... ... s:1 rd:4 ra:4 rm:4 .... rn:4   &s_rrrr
@s_rd0mn         ---- .... ... s:1 rd:4 .... rm:4 .... rn:4   &s_rrrr ra=0
@rdamn           ---- .... ... .   rd:4 ra:4 rm:4 .... rn:4   &rrrr
@rd0mn           ---- .... ... .   rd:4 .... rm:4 .... rn:4   &rrrr ra=0

MUL              .... 0000 000 . .... 0000 .... 1001 ....     @s_rd0mn
MLA              .... 0000 001 . .... .... .... 1001 ....     @s_rdamn
UMAAL            .... 0000 010 0 .... .... .... 1001 ....     @rdamn
MLS              .... 0000 011 0 .... .... .... 1001 ....     @rdamn
UMULL            .... 0000 100 . .... .... .... 1001 ....     @s_rdamn
UMLAL            .... 0000 101 . .... .... .... 1001 ....     @s_rdamn
SMULL            .... 0000 110 . .... .... .... 1001 ....     @s_rdamn
SMLAL            .... 0000 111 . .... .... .... 1001 ....     @s_rdamn

# Saturating addition and subtraction

@rndm            ---- .... .... rn:4 rd:4 .... .... rm:4      &rrr

QADD             .... 0001 0000 .... .... 0000 0101 ....      @rndm
QSUB             .... 0001 0010 .... .... 0000 0101 ....      @rndm
QDADD            .... 0001 0100 .... .... 0000 0101 ....      @rndm
QDSUB            .... 0001 0110 .... .... 0000 0101 ....      @rndm

# Halfword multiply and multiply accumulate

SMLABB           .... 0001 0000 .... .... .... 1000 ....      @rdamn
SMLABT           .... 0001 0000 .... .... .... 1100 ....      @rdamn
SMLATB           .... 0001 0000 .... .... .... 1010 ....      @rdamn
SMLATT           .... 0001 0000 .... .... .... 1110 ....      @rdamn
SMLAWB           .... 0001 0010 .... .... .... 1000 ....      @rdamn
SMULWB           .... 0001 0010 .... 0000 .... 1010 ....      @rd0mn
SMLAWT           .... 0001 0010 .... .... .... 1100 ....      @rdamn
SMULWT           .... 0001 0010 .... 0000 .... 1110 ....      @rd0mn
SMLALBB          .... 0001 0100 .... .... .... 1000 ....      @rdamn
SMLALBT          .... 0001 0100 .... .... .... 1100 ....      @rdamn
SMLALTB          .... 0001 0100 .... .... .... 1010 ....      @rdamn
SMLALTT          .... 0001 0100 .... .... .... 1110 ....      @rdamn
SMULBB           .... 0001 0110 .... 0000 .... 1000 ....      @rd0mn
SMULBT           .... 0001 0110 .... 0000 .... 1100 ....      @rd0mn
SMULTB           .... 0001 0110 .... 0000 .... 1010 ....      @rd0mn
SMULTT           .... 0001 0110 .... 0000 .... 1110 ....      @rd0mn

# MSR (immediate) and hints

&msr_i           r mask rot imm
@msr_i           ---- .... .... mask:4 .... rot:4 imm:8       &msr_i

{
  {
    [
      YIELD      ---- 0011 0010 0000 1111 ---- 0000 0001
      WFE        ---- 0011 0010 0000 1111 ---- 0000 0010
      WFI        ---- 0011 0010 0000 1111 ---- 0000 0011

      # TODO: Implement SEV, SEVL; may help SMP performance.
      # SEV      ---- 0011 0010 0000 1111 ---- 0000 0100
      # SEVL     ---- 0011 0010 0000 1111 ---- 0000 0101

      ESB        ---- 0011 0010 0000 1111 ---- 0001 0000
    ]

    # The canonical nop ends in 00000000, but the whole of the
    # rest of the space executes as nop if otherwise unsupported.
    NOP          ---- 0011 0010 0000 1111 ---- ---- ----
  }
  # Note mask = 0 is covered by NOP
  MSR_imm        .... 0011 0010 .... 1111 .... .... ....      @msr_i r=0
}
MSR_imm          .... 0011 0110 .... 1111 .... .... ....      @msr_i r=1

# Cyclic Redundancy Check

CRC32B           .... 0001 0000 .... .... 0000 0100 ....      @rndm
CRC32H           .... 0001 0010 .... .... 0000 0100 ....      @rndm
CRC32W           .... 0001 0100 .... .... 0000 0100 ....      @rndm
CRC32CB          .... 0001 0000 .... .... 0010 0100 ....      @rndm
CRC32CH          .... 0001 0010 .... .... 0010 0100 ....      @rndm
CRC32CW          .... 0001 0100 .... .... 0010 0100 ....      @rndm

# Miscellaneous instructions

%sysm            8:1 16:4
%imm16_8_0       8:12 0:4

@rm              ---- .... .... .... .... .... .... rm:4      &r
@rdm             ---- .... .... .... rd:4 .... .... rm:4      &rr
@i16             ---- .... .... .... .... .... .... ....      &i imm=%imm16_8_0

MRS_bank         ---- 0001 0 r:1 00 .... rd:4 001. 0000 0000  &mrs_bank %sysm
MSR_bank         ---- 0001 0 r:1 10 .... 1111 001. 0000 rn:4  &msr_bank %sysm

MRS_reg          ---- 0001 0 r:1 00 1111   rd:4 0000 0000 0000  &mrs_reg
MSR_reg          ---- 0001 0 r:1 10 mask:4 1111 0000 0000 rn:4  &msr_reg

BX               .... 0001 0010 1111 1111 1111 0001 ....      @rm
BXJ              .... 0001 0010 1111 1111 1111 0010 ....      @rm
BLX_r            .... 0001 0010 1111 1111 1111 0011 ....      @rm

CLZ              .... 0001 0110 1111 .... 1111 0001 ....      @rdm

ERET             ---- 0001 0110 0000 0000 0000 0110 1110

HLT              .... 0001 0000 .... .... .... 0111 ....      @i16
BKPT             .... 0001 0010 .... .... .... 0111 ....      @i16
HVC              .... 0001 0100 .... .... .... 0111 ....      @i16
SMC              ---- 0001 0110 0000 0000 0000 0111 imm:4     &i

# Load/Store Dual, Half, Signed Byte (register)

@ldst_rr_p1w     ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... rm:4 \
                 &ldst_rr p=1 shimm=0 shtype=0
@ldst_rr_pw0     ---- ...0 u:1 . 0   . rn:4 rt:4 .... .... rm:4 \
                 &ldst_rr p=0 w=0 shimm=0 shtype=0

STRH_rr          .... 000. .0.0 .... .... 0000 1011 ....      @ldst_rr_pw0
STRH_rr          .... 000. .0.0 .... .... 0000 1011 ....      @ldst_rr_p1w

LDRD_rr          .... 000. .0.0 .... .... 0000 1101 ....      @ldst_rr_pw0
LDRD_rr          .... 000. .0.0 .... .... 0000 1101 ....      @ldst_rr_p1w

STRD_rr          .... 000. .0.0 .... .... 0000 1111 ....      @ldst_rr_pw0
STRD_rr          .... 000. .0.0 .... .... 0000 1111 ....      @ldst_rr_p1w

LDRH_rr          .... 000. .0.1 .... .... 0000 1011 ....      @ldst_rr_pw0
LDRH_rr          .... 000. .0.1 .... .... 0000 1011 ....      @ldst_rr_p1w

LDRSB_rr         .... 000. .0.1 .... .... 0000 1101 ....      @ldst_rr_pw0
LDRSB_rr         .... 000. .0.1 .... .... 0000 1101 ....      @ldst_rr_p1w

LDRSH_rr         .... 000. .0.1 .... .... 0000 1111 ....      @ldst_rr_pw0
LDRSH_rr         .... 000. .0.1 .... .... 0000 1111 ....      @ldst_rr_p1w

# Note the unpriv load/stores use the previously invalid P=0, W=1 encoding,
# and act as normal post-indexed (P=0, W=0).
@ldst_rr_p0w1    ---- ...0 u:1 . 1   . rn:4 rt:4 .... .... rm:4 \
                 &ldst_rr p=0 w=0 shimm=0 shtype=0

STRHT_rr         .... 000. .0.0 .... .... 0000 1011 ....      @ldst_rr_p0w1
LDRHT_rr         .... 000. .0.1 .... .... 0000 1011 ....      @ldst_rr_p0w1
LDRSBT_rr        .... 000. .0.1 .... .... 0000 1101 ....      @ldst_rr_p0w1
LDRSHT_rr        .... 000. .0.1 .... .... 0000 1111 ....      @ldst_rr_p0w1

# Load/Store word and unsigned byte (register)

@ldst_rs_p1w     ---- ...1 u:1 . w:1 . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \
                 &ldst_rr p=1
@ldst_rs_pw0     ---- ...0 u:1 . 0   . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \
                 &ldst_rr p=0 w=0

STR_rr           .... 011. .0.0 .... .... .... ...0 ....      @ldst_rs_pw0
STR_rr           .... 011. .0.0 .... .... .... ...0 ....      @ldst_rs_p1w
STRB_rr          .... 011. .1.0 .... .... .... ...0 ....      @ldst_rs_pw0
STRB_rr          .... 011. .1.0 .... .... .... ...0 ....      @ldst_rs_p1w

LDR_rr           .... 011. .0.1 .... .... .... ...0 ....      @ldst_rs_pw0
LDR_rr           .... 011. .0.1 .... .... .... ...0 ....      @ldst_rs_p1w
LDRB_rr          .... 011. .1.1 .... .... .... ...0 ....      @ldst_rs_pw0
LDRB_rr          .... 011. .1.1 .... .... .... ...0 ....      @ldst_rs_p1w

@ldst_rs_p0w1    ---- ...0 u:1 . 1   . rn:4 rt:4 shimm:5 shtype:2 . rm:4 \
                 &ldst_rr p=0 w=0

STRT_rr          .... 011. .0.0 .... .... .... ...0 ....      @ldst_rs_p0w1
STRBT_rr         .... 011. .1.0 .... .... .... ...0 ....      @ldst_rs_p0w1
LDRT_rr          .... 011. .0.1 .... .... .... ...0 ....      @ldst_rs_p0w1
LDRBT_rr         .... 011. .1.1 .... .... .... ...0 ....      @ldst_rs_p0w1

# Load/Store Dual, Half, Signed Byte (immediate)

%imm8s_8_0       8:4 0:4
@ldst_ri8_p1w    ---- ...1 u:1 . w:1 . rn:4 rt:4 .... .... .... \
                 &ldst_ri imm=%imm8s_8_0 p=1
@ldst_ri8_pw0    ---- ...0 u:1 . 0   . rn:4 rt:4 .... .... .... \
                 &ldst_ri imm=%imm8s_8_0 p=0 w=0

STRH_ri          .... 000. .1.0 .... .... .... 1011 ....      @ldst_ri8_pw0
STRH_ri          .... 000. .1.0 .... .... .... 1011 ....      @ldst_ri8_p1w

LDRD_ri_a32      .... 000. .1.0 .... .... .... 1101 ....      @ldst_ri8_pw0
LDRD_ri_a32      .... 000. .1.0 .... .... .... 1101 ....      @ldst_ri8_p1w

STRD_ri_a32      .... 000. .1.0 .... .... .... 1111 ....      @ldst_ri8_pw0
STRD_ri_a32      .... 000. .1.0 .... .... .... 1111 ....      @ldst_ri8_p1w

LDRH_ri          .... 000. .1.1 .... .... .... 1011 ....      @ldst_ri8_pw0
LDRH_ri          .... 000. .1.1 .... .... .... 1011 ....      @ldst_ri8_p1w

LDRSB_ri         .... 000. .1.1 .... .... .... 1101 ....      @ldst_ri8_pw0
LDRSB_ri         .... 000. .1.1 .... .... .... 1101 ....      @ldst_ri8_p1w

LDRSH_ri         .... 000. .1.1 .... .... .... 1111 ....      @ldst_ri8_pw0
LDRSH_ri         .... 000. .1.1 .... .... .... 1111 ....      @ldst_ri8_p1w

# Note the unpriv load/stores use the previously invalid P=0, W=1 encoding,
# and act as normal post-indexed (P=0, W=0).
@ldst_ri8_p0w1   ---- ...0 u:1 . 1   . rn:4 rt:4 .... .... .... \
                 &ldst_ri imm=%imm8s_8_0 p=0 w=0

STRHT_ri         .... 000. .1.0 .... .... .... 1011 ....      @ldst_ri8_p0w1
LDRHT_ri         .... 000. .1.1 .... .... .... 1011 ....      @ldst_ri8_p0w1
LDRSBT_ri        .... 000. .1.1 .... .... .... 1101 ....      @ldst_ri8_p0w1
LDRSHT_ri        .... 000. .1.1 .... .... .... 1111 ....      @ldst_ri8_p0w1

# Load/Store word and unsigned byte (immediate)

@ldst_ri12_p1w   ---- ...1 u:1 . w:1 . rn:4 rt:4 imm:12       &ldst_ri p=1
@ldst_ri12_pw0   ---- ...0 u:1 . 0   . rn:4 rt:4 imm:12       &ldst_ri p=0 w=0

STR_ri           .... 010. .0.0 .... .... ............        @ldst_ri12_p1w
STR_ri           .... 010. .0.0 .... .... ............        @ldst_ri12_pw0
STRB_ri          .... 010. .1.0 .... .... ............        @ldst_ri12_p1w
STRB_ri          .... 010. .1.0 .... .... ............        @ldst_ri12_pw0

LDR_ri           .... 010. .0.1 .... .... ............        @ldst_ri12_p1w
LDR_ri           .... 010. .0.1 .... .... ............        @ldst_ri12_pw0
LDRB_ri          .... 010. .1.1 .... .... ............        @ldst_ri12_p1w
LDRB_ri          .... 010. .1.1 .... .... ............        @ldst_ri12_pw0

@ldst_ri12_p0w1  ---- ...0 u:1 . 1 . rn:4 rt:4 imm:12         &ldst_ri p=0 w=0

STRT_ri          .... 010. .0.0 .... .... ............        @ldst_ri12_p0w1
STRBT_ri         .... 010. .1.0 .... .... ............        @ldst_ri12_p0w1
LDRT_ri          .... 010. .0.1 .... .... ............        @ldst_ri12_p0w1
LDRBT_ri         .... 010. .1.1 .... .... ............        @ldst_ri12_p0w1

# Synchronization primitives

@swp             ---- .... .... rn:4 rt:4 .... .... rt2:4

SWP              .... 0001 0000 .... .... 0000 1001 ....      @swp
SWPB             .... 0001 0100 .... .... 0000 1001 ....      @swp

# Load/Store Exclusive and Load-Acquire/Store-Release
#
# Note rt2 for STREXD/LDREXD is set by the helper after checking rt is even.

@strex           ---- .... .... rn:4 rd:4 .... .... rt:4 \
                 &strex imm=0 rt2=15
@ldrex           ---- .... .... rn:4 rt:4 .... .... .... \
                 &ldrex imm=0 rt2=15
@stl             ---- .... .... rn:4 .... .... .... rt:4 \
                 &ldrex imm=0 rt2=15

STREX            .... 0001 1000 .... .... 1111 1001 ....      @strex
STREXD_a32       .... 0001 1010 .... .... 1111 1001 ....      @strex
STREXB           .... 0001 1100 .... .... 1111 1001 ....      @strex
STREXH           .... 0001 1110 .... .... 1111 1001 ....      @strex

STLEX            .... 0001 1000 .... .... 1110 1001 ....      @strex
STLEXD_a32       .... 0001 1010 .... .... 1110 1001 ....      @strex
STLEXB           .... 0001 1100 .... .... 1110 1001 ....      @strex
STLEXH           .... 0001 1110 .... .... 1110 1001 ....      @strex

STL              .... 0001 1000 .... 1111 1100 1001 ....      @stl
STLB             .... 0001 1100 .... 1111 1100 1001 ....      @stl
STLH             .... 0001 1110 .... 1111 1100 1001 ....      @stl

LDREX            .... 0001 1001 .... .... 1111 1001 1111      @ldrex
LDREXD_a32       .... 0001 1011 .... .... 1111 1001 1111      @ldrex
LDREXB           .... 0001 1101 .... .... 1111 1001 1111      @ldrex
LDREXH           .... 0001 1111 .... .... 1111 1001 1111      @ldrex

LDAEX            .... 0001 1001 .... .... 1110 1001 1111      @ldrex
LDAEXD_a32       .... 0001 1011 .... .... 1110 1001 1111      @ldrex
LDAEXB           .... 0001 1101 .... .... 1110 1001 1111      @ldrex
LDAEXH           .... 0001 1111 .... .... 1110 1001 1111      @ldrex

LDA              .... 0001 1001 .... .... 1100 1001 1111      @ldrex
LDAB             .... 0001 1101 .... .... 1100 1001 1111      @ldrex
LDAH             .... 0001 1111 .... .... 1100 1001 1111      @ldrex

# Media instructions

# usad8 is usada8 w/ ra=15
USADA8           ---- 0111 1000 rd:4 ra:4 rm:4 0001 rn:4

# ubfx and sbfx
@bfx             ---- .... ... widthm1:5 rd:4 lsb:5 ... rn:4  &bfx

SBFX             .... 0111 101 ..... .... ..... 101 ....      @bfx
UBFX             .... 0111 111 ..... .... ..... 101 ....      @bfx

# bfc is bfi w/ rn=15
BFCI             ---- 0111 110 msb:5 rd:4 lsb:5 001 rn:4      &bfi

# While we could get UDEF by not including this, add the pattern for
# documentation and to conflict with any other typos in this file.
UDF              1110 0111 1111 ---- ---- ---- 1111 ----

# Parallel addition and subtraction

SADD16           .... 0110 0001 .... .... 1111 0001 ....      @rndm
SASX             .... 0110 0001 .... .... 1111 0011 ....      @rndm
SSAX             .... 0110 0001 .... .... 1111 0101 ....      @rndm
SSUB16           .... 0110 0001 .... .... 1111 0111 ....      @rndm
SADD8            .... 0110 0001 .... .... 1111 1001 ....      @rndm
SSUB8            .... 0110 0001 .... .... 1111 1111 ....      @rndm

QADD16           .... 0110 0010 .... .... 1111 0001 ....      @rndm
QASX             .... 0110 0010 .... .... 1111 0011 ....      @rndm
QSAX             .... 0110 0010 .... .... 1111 0101 ....      @rndm
QSUB16           .... 0110 0010 .... .... 1111 0111 ....      @rndm
QADD8            .... 0110 0010 .... .... 1111 1001 ....      @rndm
QSUB8            .... 0110 0010 .... .... 1111 1111 ....      @rndm

SHADD16          .... 0110 0011 .... .... 1111 0001 ....      @rndm
SHASX            .... 0110 0011 .... .... 1111 0011 ....      @rndm
SHSAX            .... 0110 0011 .... .... 1111 0101 ....      @rndm
SHSUB16          .... 0110 0011 .... .... 1111 0111 ....      @rndm
SHADD8           .... 0110 0011 .... .... 1111 1001 ....      @rndm
SHSUB8           .... 0110 0011 .... .... 1111 1111 ....      @rndm

UADD16           .... 0110 0101 .... .... 1111 0001 ....      @rndm
UASX             .... 0110 0101 .... .... 1111 0011 ....      @rndm
USAX             .... 0110 0101 .... .... 1111 0101 ....      @rndm
USUB16           .... 0110 0101 .... .... 1111 0111 ....      @rndm
UADD8            .... 0110 0101 .... .... 1111 1001 ....      @rndm
USUB8            .... 0110 0101 .... .... 1111 1111 ....      @rndm

UQADD16          .... 0110 0110 .... .... 1111 0001 ....      @rndm
UQASX            .... 0110 0110 .... .... 1111 0011 ....      @rndm
UQSAX            .... 0110 0110 .... .... 1111 0101 ....      @rndm
UQSUB16          .... 0110 0110 .... .... 1111 0111 ....      @rndm
UQADD8           .... 0110 0110 .... .... 1111 1001 ....      @rndm
UQSUB8           .... 0110 0110 .... .... 1111 1111 ....      @rndm

UHADD16          .... 0110 0111 .... .... 1111 0001 ....      @rndm
UHASX            .... 0110 0111 .... .... 1111 0011 ....      @rndm
UHSAX            .... 0110 0111 .... .... 1111 0101 ....      @rndm
UHSUB16          .... 0110 0111 .... .... 1111 0111 ....      @rndm
UHADD8           .... 0110 0111 .... .... 1111 1001 ....      @rndm
UHSUB8           .... 0110 0111 .... .... 1111 1111 ....      @rndm

# Packing, unpacking, saturation, and reversal

PKH              ---- 0110 1000 rn:4 rd:4 imm:5 tb:1 01 rm:4  &pkh

@sat             ---- .... ... satimm:5  rd:4 imm:5 sh:1 .. rn:4  &sat
@sat16           ---- .... .... satimm:4 rd:4 .... .... rn:4 \
                 &sat imm=0 sh=0

SSAT             .... 0110 101. .... .... .... ..01 ....      @sat
USAT             .... 0110 111. .... .... .... ..01 ....      @sat

SSAT16           .... 0110 1010 .... .... 1111 0011 ....      @sat16
USAT16           .... 0110 1110 .... .... 1111 0011 ....      @sat16

@rrr_rot         ---- .... .... rn:4 rd:4 rot:2 ...... rm:4   &rrr_rot

SXTAB16          .... 0110 1000 .... .... ..00 0111 ....      @rrr_rot
SXTAB            .... 0110 1010 .... .... ..00 0111 ....      @rrr_rot
SXTAH            .... 0110 1011 .... .... ..00 0111 ....      @rrr_rot
UXTAB16          .... 0110 1100 .... .... ..00 0111 ....      @rrr_rot
UXTAB            .... 0110 1110 .... .... ..00 0111 ....      @rrr_rot
UXTAH            .... 0110 1111 .... .... ..00 0111 ....      @rrr_rot

SEL              .... 0110 1000 .... .... 1111 1011 ....      @rndm
REV              .... 0110 1011 1111 .... 1111 0011 ....      @rdm
REV16            .... 0110 1011 1111 .... 1111 1011 ....      @rdm
REVSH            .... 0110 1111 1111 .... 1111 1011 ....      @rdm
RBIT             .... 0110 1111 1111 .... 1111 0011 ....      @rdm

# Signed multiply, signed and unsigned divide

@rdmn            ---- .... .... rd:4 .... rm:4 .... rn:4      &rrr

SMLAD            .... 0111 0000 .... .... .... 0001 ....      @rdamn
SMLADX           .... 0111 0000 .... .... .... 0011 ....      @rdamn
SMLSD            .... 0111 0000 .... .... .... 0101 ....      @rdamn
SMLSDX           .... 0111 0000 .... .... .... 0111 ....      @rdamn

SDIV             .... 0111 0001 .... 1111 .... 0001 ....      @rdmn
UDIV             .... 0111 0011 .... 1111 .... 0001 ....      @rdmn

SMLALD           .... 0111 0100 .... .... .... 0001 ....      @rdamn
SMLALDX          .... 0111 0100 .... .... .... 0011 ....      @rdamn
SMLSLD           .... 0111 0100 .... .... .... 0101 ....      @rdamn
SMLSLDX          .... 0111 0100 .... .... .... 0111 ....      @rdamn

SMMLA            .... 0111 0101 .... .... .... 0001 ....      @rdamn
SMMLAR           .... 0111 0101 .... .... .... 0011 ....      @rdamn
SMMLS            .... 0111 0101 .... .... .... 1101 ....      @rdamn
SMMLSR           .... 0111 0101 .... .... .... 1111 ....      @rdamn

# Block data transfer

STM              ---- 100 b:1 i:1 u:1 w:1 0 rn:4 list:16   &ldst_block
LDM_a32          ---- 100 b:1 i:1 u:1 w:1 1 rn:4 list:16   &ldst_block

# Branch, branch with link

%imm26           0:s24  !function=times_4
@branch          ---- .... ........................           &i imm=%imm26

B                .... 1010 ........................           @branch
BL               .... 1011 ........................           @branch

# Coprocessor instructions

# We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
# other coprocessor instructions always UNDEF.
# The trans_ functions for these will ignore cp values 8..13 for v7 or
# earlier, and 0..13 for v8 and later, because those areas of the
# encoding space may be used for other things, such as VFP or Neon.

@mcr             ---- .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4 &mcr
@mcrr            ---- .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4       &mcrr

MCRR             .... 1100 0100 .... .... .... .... .... @mcrr
MRRC             .... 1100 0101 .... .... .... .... .... @mcrr

MCR              .... 1110 ... 0 .... .... .... ... 1 .... @mcr
MRC              .... 1110 ... 1 .... .... .... ... 1 .... @mcr

# Supervisor call

SVC              ---- 1111 imm:24                             &i