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 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
49# Data-processing (register)
50
51%imm5_12_6       12:3 6:2
52
53@s_rrr_shi       ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \
54                 &s_rrr_shi shim=%imm5_12_6
55@s_rxr_shi       ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \
56                 &s_rrr_shi shim=%imm5_12_6 rn=0
57@S_xrr_shi       ....... .... .   rn:4 .... .... .. shty:2 rm:4 \
58                 &s_rrr_shi shim=%imm5_12_6 s=1 rd=0
59
60{
61  TST_xrri       1110101 0000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
62  AND_rrri       1110101 0000 . .... 0 ... .... .... ....     @s_rrr_shi
63}
64BIC_rrri         1110101 0001 . .... 0 ... .... .... ....     @s_rrr_shi
65{
66  MOV_rxri       1110101 0010 . 1111 0 ... .... .... ....     @s_rxr_shi
67  ORR_rrri       1110101 0010 . .... 0 ... .... .... ....     @s_rrr_shi
68}
69{
70  MVN_rxri       1110101 0011 . 1111 0 ... .... .... ....     @s_rxr_shi
71  ORN_rrri       1110101 0011 . .... 0 ... .... .... ....     @s_rrr_shi
72}
73{
74  TEQ_xrri       1110101 0100 1 .... 0 ... 1111 .... ....     @S_xrr_shi
75  EOR_rrri       1110101 0100 . .... 0 ... .... .... ....     @s_rrr_shi
76}
77PKH              1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
78                 &pkh imm=%imm5_12_6
79{
80  CMN_xrri       1110101 1000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
81  ADD_rrri       1110101 1000 . .... 0 ... .... .... ....     @s_rrr_shi
82}
83ADC_rrri         1110101 1010 . .... 0 ... .... .... ....     @s_rrr_shi
84SBC_rrri         1110101 1011 . .... 0 ... .... .... ....     @s_rrr_shi
85{
86  CMP_xrri       1110101 1101 1 .... 0 ... 1111 .... ....     @S_xrr_shi
87  SUB_rrri       1110101 1101 . .... 0 ... .... .... ....     @s_rrr_shi
88}
89RSB_rrri         1110101 1110 . .... 0 ... .... .... ....     @s_rrr_shi
90
91# Data-processing (register-shifted register)
92
93MOV_rxrr         1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
94                 &s_rrr_shr rn=0
95
96# Data-processing (immediate)
97
98%t32extrot       26:1 12:3 0:8  !function=t32_expandimm_rot
99%t32extimm       26:1 12:3 0:8  !function=t32_expandimm_imm
100
101@s_rri_rot       ....... .... s:1 rn:4 . ... rd:4 ........ \
102                 &s_rri_rot imm=%t32extimm rot=%t32extrot
103@s_rxi_rot       ....... .... s:1 .... . ... rd:4 ........ \
104                 &s_rri_rot imm=%t32extimm rot=%t32extrot rn=0
105@S_xri_rot       ....... .... .   rn:4 . ... .... ........ \
106                 &s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0
107
108{
109  TST_xri        1111 0.0 0000 1 .... 0 ... 1111 ........     @S_xri_rot
110  AND_rri        1111 0.0 0000 . .... 0 ... .... ........     @s_rri_rot
111}
112BIC_rri          1111 0.0 0001 . .... 0 ... .... ........     @s_rri_rot
113{
114  MOV_rxi        1111 0.0 0010 . 1111 0 ... .... ........     @s_rxi_rot
115  ORR_rri        1111 0.0 0010 . .... 0 ... .... ........     @s_rri_rot
116}
117{
118  MVN_rxi        1111 0.0 0011 . 1111 0 ... .... ........     @s_rxi_rot
119  ORN_rri        1111 0.0 0011 . .... 0 ... .... ........     @s_rri_rot
120}
121{
122  TEQ_xri        1111 0.0 0100 1 .... 0 ... 1111 ........     @S_xri_rot
123  EOR_rri        1111 0.0 0100 . .... 0 ... .... ........     @s_rri_rot
124}
125{
126  CMN_xri        1111 0.0 1000 1 .... 0 ... 1111 ........     @S_xri_rot
127  ADD_rri        1111 0.0 1000 . .... 0 ... .... ........     @s_rri_rot
128}
129ADC_rri          1111 0.0 1010 . .... 0 ... .... ........     @s_rri_rot
130SBC_rri          1111 0.0 1011 . .... 0 ... .... ........     @s_rri_rot
131{
132  CMP_xri        1111 0.0 1101 1 .... 0 ... 1111 ........     @S_xri_rot
133  SUB_rri        1111 0.0 1101 . .... 0 ... .... ........     @s_rri_rot
134}
135RSB_rri          1111 0.0 1110 . .... 0 ... .... ........     @s_rri_rot
136
137# Data processing (plain binary immediate)
138
139%imm12_26_12_0   26:1 12:3 0:8
140%neg12_26_12_0   26:1 12:3 0:8 !function=negate
141@s0_rri_12       .... ... .... . rn:4 . ... rd:4 ........ \
142                 &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0
143
144{
145  ADR            1111 0.1 0000 0 1111 0 ... rd:4 ........ \
146                 &ri imm=%imm12_26_12_0
147  ADD_rri        1111 0.1 0000 0 .... 0 ... .... ........     @s0_rri_12
148}
149{
150  ADR            1111 0.1 0101 0 1111 0 ... rd:4 ........ \
151                 &ri imm=%neg12_26_12_0
152  SUB_rri        1111 0.1 0101 0 .... 0 ... .... ........     @s0_rri_12
153}
154
155# Move Wide
156
157%imm16_26_16_12_0 16:4 26:1 12:3 0:8
158@mov16           .... .... .... .... .... rd:4 .... .... \
159                 &ri imm=%imm16_26_16_12_0
160
161MOVW             1111 0.10 0100 .... 0 ... .... ........      @mov16
162MOVT             1111 0.10 1100 .... 0 ... .... ........      @mov16
163
164# Saturate, bitfield
165
166@sat             .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \
167                 &sat imm=%imm5_12_6
168@sat16           .... .... .. .    . rn:4 . ... rd:4 .. . satimm:5 \
169                 &sat sh=0 imm=0
170
171{
172  SSAT16         1111 0011 001 0 .... 0 000 .... 00 0 .....   @sat16
173  SSAT           1111 0011 00. 0 .... 0 ... .... .. 0 .....   @sat
174}
175{
176  USAT16         1111 0011 101 0 .... 0 000 .... 00 0 .....   @sat16
177  USAT           1111 0011 10. 0 .... 0 ... .... .. 0 .....   @sat
178}
179
180@bfx             .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \
181                 &bfx lsb=%imm5_12_6
182@bfi             .... .... ... . rn:4 . ... rd:4 .. . msb:5 \
183                 &bfi lsb=%imm5_12_6
184
185SBFX             1111 0011 010 0 .... 0 ... .... ..0.....     @bfx
186UBFX             1111 0011 110 0 .... 0 ... .... ..0.....     @bfx
187
188# bfc is bfi w/ rn=15
189BFCI             1111 0011 011 0 .... 0 ... .... ..0.....     @bfi
190
191# Multiply and multiply accumulate
192
193@s0_rnadm        .... .... .... rn:4 ra:4 rd:4 .... rm:4      &s_rrrr s=0
194@s0_rn0dm        .... .... .... rn:4 .... rd:4 .... rm:4      &s_rrrr ra=0 s=0
195@rnadm           .... .... .... rn:4 ra:4 rd:4 .... rm:4      &rrrr
196@rn0dm           .... .... .... rn:4 .... rd:4 .... rm:4      &rrrr ra=0
197@rndm            .... .... .... rn:4 .... rd:4 .... rm:4      &rrr
198@rdm             .... .... .... .... .... rd:4 .... rm:4      &rr
199
200{
201  MUL            1111 1011 0000 .... 1111 .... 0000 ....      @s0_rn0dm
202  MLA            1111 1011 0000 .... .... .... 0000 ....      @s0_rnadm
203}
204MLS              1111 1011 0000 .... .... .... 0001 ....      @rnadm
205SMULL            1111 1011 1000 .... .... .... 0000 ....      @s0_rnadm
206UMULL            1111 1011 1010 .... .... .... 0000 ....      @s0_rnadm
207SMLAL            1111 1011 1100 .... .... .... 0000 ....      @s0_rnadm
208UMLAL            1111 1011 1110 .... .... .... 0000 ....      @s0_rnadm
209UMAAL            1111 1011 1110 .... .... .... 0110 ....      @rnadm
210{
211  SMULWB         1111 1011 0011 .... 1111 .... 0000 ....      @rn0dm
212  SMLAWB         1111 1011 0011 .... .... .... 0000 ....      @rnadm
213}
214{
215  SMULWT         1111 1011 0011 .... 1111 .... 0001 ....      @rn0dm
216  SMLAWT         1111 1011 0011 .... .... .... 0001 ....      @rnadm
217}
218{
219  SMULBB         1111 1011 0001 .... 1111 .... 0000 ....      @rn0dm
220  SMLABB         1111 1011 0001 .... .... .... 0000 ....      @rnadm
221}
222{
223  SMULBT         1111 1011 0001 .... 1111 .... 0001 ....      @rn0dm
224  SMLABT         1111 1011 0001 .... .... .... 0001 ....      @rnadm
225}
226{
227  SMULTB         1111 1011 0001 .... 1111 .... 0010 ....      @rn0dm
228  SMLATB         1111 1011 0001 .... .... .... 0010 ....      @rnadm
229}
230{
231  SMULTT         1111 1011 0001 .... 1111 .... 0011 ....      @rn0dm
232  SMLATT         1111 1011 0001 .... .... .... 0011 ....      @rnadm
233}
234SMLALBB          1111 1011 1100 .... .... .... 1000 ....      @rnadm
235SMLALBT          1111 1011 1100 .... .... .... 1001 ....      @rnadm
236SMLALTB          1111 1011 1100 .... .... .... 1010 ....      @rnadm
237SMLALTT          1111 1011 1100 .... .... .... 1011 ....      @rnadm
238
239# usad8 is usada8 w/ ra=15
240USADA8           1111 1011 0111 .... .... .... 0000 ....      @rnadm
241
242SMLAD            1111 1011 0010 .... .... .... 0000 ....      @rnadm
243SMLADX           1111 1011 0010 .... .... .... 0001 ....      @rnadm
244SMLSD            1111 1011 0100 .... .... .... 0000 ....      @rnadm
245SMLSDX           1111 1011 0100 .... .... .... 0001 ....      @rnadm
246
247SMLALD           1111 1011 1100 .... .... .... 1100 ....      @rnadm
248SMLALDX          1111 1011 1100 .... .... .... 1101 ....      @rnadm
249SMLSLD           1111 1011 1101 .... .... .... 1100 ....      @rnadm
250SMLSLDX          1111 1011 1101 .... .... .... 1101 ....      @rnadm
251
252SMMLA            1111 1011 0101 .... .... .... 0000 ....      @rnadm
253SMMLAR           1111 1011 0101 .... .... .... 0001 ....      @rnadm
254SMMLS            1111 1011 0110 .... .... .... 0000 ....      @rnadm
255SMMLSR           1111 1011 0110 .... .... .... 0001 ....      @rnadm
256
257SDIV             1111 1011 1001 .... 1111 .... 1111 ....      @rndm
258UDIV             1111 1011 1011 .... 1111 .... 1111 ....      @rndm
259
260# Data-processing (two source registers)
261
262QADD             1111 1010 1000 .... 1111 .... 1000 ....      @rndm
263QSUB             1111 1010 1000 .... 1111 .... 1010 ....      @rndm
264QDADD            1111 1010 1000 .... 1111 .... 1001 ....      @rndm
265QDSUB            1111 1010 1000 .... 1111 .... 1011 ....      @rndm
266
267CRC32B           1111 1010 1100 .... 1111 .... 1000 ....      @rndm
268CRC32H           1111 1010 1100 .... 1111 .... 1001 ....      @rndm
269CRC32W           1111 1010 1100 .... 1111 .... 1010 ....      @rndm
270CRC32CB          1111 1010 1101 .... 1111 .... 1000 ....      @rndm
271CRC32CH          1111 1010 1101 .... 1111 .... 1001 ....      @rndm
272CRC32CW          1111 1010 1101 .... 1111 .... 1010 ....      @rndm
273
274SEL              1111 1010 1010 .... 1111 .... 1000 ....      @rndm
275
276# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
277REV              1111 1010 1001 ---- 1111 .... 1000 ....      @rdm
278REV16            1111 1010 1001 ---- 1111 .... 1001 ....      @rdm
279RBIT             1111 1010 1001 ---- 1111 .... 1010 ....      @rdm
280REVSH            1111 1010 1001 ---- 1111 .... 1011 ....      @rdm
281CLZ              1111 1010 1011 ---- 1111 .... 1000 ....      @rdm
282
283# Branches and miscellaneous control
284
285%msr_sysm        4:1 8:4
286%mrs_sysm        4:1 16:4
287%imm16_16_0      16:4 0:12
288%imm21           26:s1 11:1 13:1 16:6 0:11 !function=times_2
289&ci              cond imm
290
291{
292  # Group insn[25:23] = 111, which is cond=111x for the branch below,
293  # or unconditional, which would be illegal for the branch.
294  {
295    # Hints
296    {
297      YIELD      1111 0011 1010 1111 1000 0000 0000 0001
298      WFE        1111 0011 1010 1111 1000 0000 0000 0010
299      WFI        1111 0011 1010 1111 1000 0000 0000 0011
300
301      # TODO: Implement SEV, SEVL; may help SMP performance.
302      # SEV      1111 0011 1010 1111 1000 0000 0000 0100
303      # SEVL     1111 0011 1010 1111 1000 0000 0000 0101
304
305      # The canonical nop ends in 0000 0000, but the whole rest
306      # of the space is "reserved hint, behaves as nop".
307      NOP        1111 0011 1010 1111 1000 0000 ---- ----
308    }
309
310    # If imod == '00' && M == '0' then SEE "Hint instructions", above.
311    CPS          1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \
312                 &cps
313
314    # Miscellaneous control
315    {
316      CLREX      1111 0011 1011 1111 1000 1111 0010 1111
317      DSB        1111 0011 1011 1111 1000 1111 0100 ----
318      DMB        1111 0011 1011 1111 1000 1111 0101 ----
319      ISB        1111 0011 1011 1111 1000 1111 0110 ----
320      SB         1111 0011 1011 1111 1000 1111 0111 0000
321    }
322
323    # Note that the v7m insn overlaps both the normal and banked insn.
324    {
325      MRS_bank   1111 0011 111 r:1 .... 1000 rd:4   001. 0000  \
326                 &mrs_bank sysm=%mrs_sysm
327      MRS_reg    1111 0011 111 r:1 1111 1000 rd:4   0000 0000  &mrs_reg
328      MRS_v7m    1111 0011 111 0   1111 1000 rd:4   sysm:8
329    }
330    {
331      MSR_bank   1111 0011 100 r:1 rn:4 1000 ....   001. 0000  \
332                 &msr_bank sysm=%msr_sysm
333      MSR_reg    1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000  &msr_reg
334      MSR_v7m    1111 0011 100 0   rn:4 1000 mask:2 00 sysm:8
335    }
336    BXJ          1111 0011 1100 rm:4 1000 1111 0000 0000      &r
337    {
338      # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
339      # every other encoding of SUBS.  With v7VE, IMM=0 is redefined as ERET.
340      # The distinction between the two only matters for Hyp mode.
341      ERET       1111 0011 1101 1110 1000 1111 0000 0000
342      SUB_rri    1111 0011 1101 1110 1000 1111 imm:8 \
343                 &s_rri_rot rot=0 s=1 rd=15 rn=14
344    }
345    SMC          1111 0111 1111 imm:4 1000 0000 0000 0000     &i
346    HVC          1111 0111 1110 ....  1000 .... .... ....     \
347                 &i imm=%imm16_16_0
348    UDF          1111 0111 1111 ----  1010 ---- ---- ----
349  }
350  B_cond_thumb   1111 0. cond:4 ...... 10.0 ............      &ci imm=%imm21
351}
352
353# Load/store (register, immediate, literal)
354
355@ldst_rr         .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \
356                 &ldst_rr p=1 w=0 u=1 shtype=0
357@ldst_ri_idx     .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \
358                 &ldst_ri w=1
359@ldst_ri_neg     .... .... .... rn:4 rt:4 .... imm:8 \
360                 &ldst_ri p=1 w=0 u=0
361@ldst_ri_unp     .... .... .... rn:4 rt:4 .... imm:8 \
362                 &ldst_ri p=1 w=0 u=1
363@ldst_ri_pos     .... .... .... rn:4 rt:4 imm:12 \
364                 &ldst_ri p=1 w=0 u=1
365@ldst_ri_lit     .... .... u:1 ... .... rt:4 imm:12 \
366                 &ldst_ri p=1 w=0 rn=15
367
368STRB_rr          1111 1000 0000 .... .... 000000 .. ....      @ldst_rr
369STRB_ri          1111 1000 0000 .... .... 1..1 ........       @ldst_ri_idx
370STRB_ri          1111 1000 0000 .... .... 1100 ........       @ldst_ri_neg
371STRBT_ri         1111 1000 0000 .... .... 1110 ........       @ldst_ri_unp
372STRB_ri          1111 1000 1000 .... .... ............        @ldst_ri_pos
373
374STRH_rr          1111 1000 0010 .... .... 000000 .. ....      @ldst_rr
375STRH_ri          1111 1000 0010 .... .... 1..1 ........       @ldst_ri_idx
376STRH_ri          1111 1000 0010 .... .... 1100 ........       @ldst_ri_neg
377STRHT_ri         1111 1000 0010 .... .... 1110 ........       @ldst_ri_unp
378STRH_ri          1111 1000 1010 .... .... ............        @ldst_ri_pos
379
380STR_rr           1111 1000 0100 .... .... 000000 .. ....      @ldst_rr
381STR_ri           1111 1000 0100 .... .... 1..1 ........       @ldst_ri_idx
382STR_ri           1111 1000 0100 .... .... 1100 ........       @ldst_ri_neg
383STRT_ri          1111 1000 0100 .... .... 1110 ........       @ldst_ri_unp
384STR_ri           1111 1000 1100 .... .... ............        @ldst_ri_pos
385
386# Note that Load, unsigned (literal) overlaps all other load encodings.
387{
388  {
389    NOP          1111 1000 -001 1111 1111 ------------        # PLD
390    LDRB_ri      1111 1000 .001 1111 .... ............        @ldst_ri_lit
391  }
392  {
393    NOP          1111 1000 1001 ---- 1111 ------------        # PLD
394    LDRB_ri      1111 1000 1001 .... .... ............        @ldst_ri_pos
395  }
396  LDRB_ri        1111 1000 0001 .... .... 1..1 ........       @ldst_ri_idx
397  {
398    NOP          1111 1000 0001 ---- 1111 1100 --------       # PLD
399    LDRB_ri      1111 1000 0001 .... .... 1100 ........       @ldst_ri_neg
400  }
401  LDRBT_ri       1111 1000 0001 .... .... 1110 ........       @ldst_ri_unp
402  {
403    NOP          1111 1000 0001 ---- 1111 000000 -- ----      # PLD
404    LDRB_rr      1111 1000 0001 .... .... 000000 .. ....      @ldst_rr
405  }
406}
407{
408  {
409    NOP          1111 1000 -011 1111 1111 ------------        # PLD
410    LDRH_ri      1111 1000 .011 1111 .... ............        @ldst_ri_lit
411  }
412  {
413    NOP          1111 1000 1011 ---- 1111 ------------        # PLDW
414    LDRH_ri      1111 1000 1011 .... .... ............        @ldst_ri_pos
415  }
416  LDRH_ri        1111 1000 0011 .... .... 1..1 ........       @ldst_ri_idx
417  {
418    NOP          1111 1000 0011 ---- 1111 1100 --------       # PLDW
419    LDRH_ri      1111 1000 0011 .... .... 1100 ........       @ldst_ri_neg
420  }
421  LDRHT_ri       1111 1000 0011 .... .... 1110 ........       @ldst_ri_unp
422  {
423    NOP          1111 1000 0011 ---- 1111 000000 -- ----      # PLDW
424    LDRH_rr      1111 1000 0011 .... .... 000000 .. ....      @ldst_rr
425  }
426}
427{
428  LDR_ri         1111 1000 .101 1111 .... ............        @ldst_ri_lit
429  LDR_ri         1111 1000 1101 .... .... ............        @ldst_ri_pos
430  LDR_ri         1111 1000 0101 .... .... 1..1 ........       @ldst_ri_idx
431  LDR_ri         1111 1000 0101 .... .... 1100 ........       @ldst_ri_neg
432  LDRT_ri        1111 1000 0101 .... .... 1110 ........       @ldst_ri_unp
433  LDR_rr         1111 1000 0101 .... .... 000000 .. ....      @ldst_rr
434}
435# NOPs here are PLI.
436{
437  {
438    NOP          1111 1001 -001 1111 1111 ------------
439    LDRSB_ri     1111 1001 .001 1111 .... ............        @ldst_ri_lit
440  }
441  {
442    NOP          1111 1001 1001 ---- 1111 ------------
443    LDRSB_ri     1111 1001 1001 .... .... ............        @ldst_ri_pos
444  }
445  LDRSB_ri       1111 1001 0001 .... .... 1..1 ........       @ldst_ri_idx
446  {
447    NOP          1111 1001 0001 ---- 1111 1100 --------
448    LDRSB_ri     1111 1001 0001 .... .... 1100 ........       @ldst_ri_neg
449  }
450  LDRSBT_ri      1111 1001 0001 .... .... 1110 ........       @ldst_ri_unp
451  {
452    NOP          1111 1001 0001 ---- 1111 000000 -- ----
453    LDRSB_rr     1111 1001 0001 .... .... 000000 .. ....      @ldst_rr
454  }
455}
456# NOPs here are unallocated memory hints, treated as NOP.
457{
458  {
459    NOP          1111 1001 -011 1111 1111 ------------
460    LDRSH_ri     1111 1001 .011 1111 .... ............        @ldst_ri_lit
461  }
462  {
463    NOP          1111 1001 1011 ---- 1111 ------------
464    LDRSH_ri     1111 1001 1011 .... .... ............        @ldst_ri_pos
465  }
466  LDRSH_ri       1111 1001 0011 .... .... 1..1 ........       @ldst_ri_idx
467  {
468    NOP          1111 1001 0011 ---- 1111 1100 --------
469    LDRSH_ri     1111 1001 0011 .... .... 1100 ........       @ldst_ri_neg
470  }
471  LDRSHT_ri      1111 1001 0011 .... .... 1110 ........       @ldst_ri_unp
472  {
473    NOP          1111 1001 0011 ---- 1111 000000 -- ----
474    LDRSH_rr     1111 1001 0011 .... .... 000000 .. ....      @ldst_rr
475  }
476}
477
478%imm8x4          0:8 !function=times_4
479&ldst_ri2        p w u rn rt rt2 imm
480@ldstd_ri8       .... .... u:1 ... rn:4 rt:4 rt2:4 ........   \
481                 &ldst_ri2 imm=%imm8x4
482
483STRD_ri_t32      1110 1000 .110 .... .... .... ........    @ldstd_ri8 w=1 p=0
484LDRD_ri_t32      1110 1000 .111 .... .... .... ........    @ldstd_ri8 w=1 p=0
485
486STRD_ri_t32      1110 1001 .100 .... .... .... ........    @ldstd_ri8 w=0 p=1
487LDRD_ri_t32      1110 1001 .101 .... .... .... ........    @ldstd_ri8 w=0 p=1
488
489STRD_ri_t32      1110 1001 .110 .... .... .... ........    @ldstd_ri8 w=1 p=1
490{
491  SG             1110 1001 0111 1111 1110 1001 01111111
492  LDRD_ri_t32    1110 1001 .111 .... .... .... ........    @ldstd_ri8 w=1 p=1
493}
494
495# Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
496
497@strex_i         .... .... .... rn:4 rt:4 rd:4 .... .... \
498                 &strex rt2=15 imm=%imm8x4
499@strex_0         .... .... .... rn:4 rt:4 .... .... rd:4 \
500                 &strex rt2=15 imm=0
501@strex_d         .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
502                 &strex imm=0
503
504@ldrex_i         .... .... .... rn:4 rt:4 .... .... .... \
505                 &ldrex rt2=15 imm=%imm8x4
506@ldrex_0         .... .... .... rn:4 rt:4 .... .... .... \
507                 &ldrex rt2=15 imm=0
508@ldrex_d         .... .... .... rn:4 rt:4 rt2:4 .... .... \
509                 &ldrex imm=0
510
511{
512  TT             1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
513  STREX          1110 1000 0100 .... .... .... .... ....      @strex_i
514}
515STREXB           1110 1000 1100 .... .... 1111 0100 ....      @strex_0
516STREXH           1110 1000 1100 .... .... 1111 0101 ....      @strex_0
517STREXD_t32       1110 1000 1100 .... .... .... 0111 ....      @strex_d
518
519STLEX            1110 1000 1100 .... .... 1111 1110 ....      @strex_0
520STLEXB           1110 1000 1100 .... .... 1111 1100 ....      @strex_0
521STLEXH           1110 1000 1100 .... .... 1111 1101 ....      @strex_0
522STLEXD_t32       1110 1000 1100 .... .... .... 1111 ....      @strex_d
523
524STL              1110 1000 1100 .... .... 1111 1010 1111      @ldrex_0
525STLB             1110 1000 1100 .... .... 1111 1000 1111      @ldrex_0
526STLH             1110 1000 1100 .... .... 1111 1001 1111      @ldrex_0
527
528LDREX            1110 1000 0101 .... .... 1111 .... ....      @ldrex_i
529LDREXB           1110 1000 1101 .... .... 1111 0100 1111      @ldrex_0
530LDREXH           1110 1000 1101 .... .... 1111 0101 1111      @ldrex_0
531LDREXD_t32       1110 1000 1101 .... .... .... 0111 1111      @ldrex_d
532
533LDAEX            1110 1000 1101 .... .... 1111 1110 1111      @ldrex_0
534LDAEXB           1110 1000 1101 .... .... 1111 1100 1111      @ldrex_0
535LDAEXH           1110 1000 1101 .... .... 1111 1101 1111      @ldrex_0
536LDAEXD_t32       1110 1000 1101 .... .... .... 1111 1111      @ldrex_d
537
538LDA              1110 1000 1101 .... .... 1111 1010 1111      @ldrex_0
539LDAB             1110 1000 1101 .... .... 1111 1000 1111      @ldrex_0
540LDAH             1110 1000 1101 .... .... 1111 1001 1111      @ldrex_0
541
542&tbranch         rn rm
543@tbranch         .... .... .... rn:4 .... .... .... rm:4      &tbranch
544
545TBB              1110 1000 1101 .... 1111 0000 0000 ....      @tbranch
546TBH              1110 1000 1101 .... 1111 0000 0001 ....      @tbranch
547
548# Parallel addition and subtraction
549
550SADD8            1111 1010 1000 .... 1111 .... 0000 ....      @rndm
551QADD8            1111 1010 1000 .... 1111 .... 0001 ....      @rndm
552SHADD8           1111 1010 1000 .... 1111 .... 0010 ....      @rndm
553UADD8            1111 1010 1000 .... 1111 .... 0100 ....      @rndm
554UQADD8           1111 1010 1000 .... 1111 .... 0101 ....      @rndm
555UHADD8           1111 1010 1000 .... 1111 .... 0110 ....      @rndm
556
557SADD16           1111 1010 1001 .... 1111 .... 0000 ....      @rndm
558QADD16           1111 1010 1001 .... 1111 .... 0001 ....      @rndm
559SHADD16          1111 1010 1001 .... 1111 .... 0010 ....      @rndm
560UADD16           1111 1010 1001 .... 1111 .... 0100 ....      @rndm
561UQADD16          1111 1010 1001 .... 1111 .... 0101 ....      @rndm
562UHADD16          1111 1010 1001 .... 1111 .... 0110 ....      @rndm
563
564SASX             1111 1010 1010 .... 1111 .... 0000 ....      @rndm
565QASX             1111 1010 1010 .... 1111 .... 0001 ....      @rndm
566SHASX            1111 1010 1010 .... 1111 .... 0010 ....      @rndm
567UASX             1111 1010 1010 .... 1111 .... 0100 ....      @rndm
568UQASX            1111 1010 1010 .... 1111 .... 0101 ....      @rndm
569UHASX            1111 1010 1010 .... 1111 .... 0110 ....      @rndm
570
571SSUB8            1111 1010 1100 .... 1111 .... 0000 ....      @rndm
572QSUB8            1111 1010 1100 .... 1111 .... 0001 ....      @rndm
573SHSUB8           1111 1010 1100 .... 1111 .... 0010 ....      @rndm
574USUB8            1111 1010 1100 .... 1111 .... 0100 ....      @rndm
575UQSUB8           1111 1010 1100 .... 1111 .... 0101 ....      @rndm
576UHSUB8           1111 1010 1100 .... 1111 .... 0110 ....      @rndm
577
578SSUB16           1111 1010 1101 .... 1111 .... 0000 ....      @rndm
579QSUB16           1111 1010 1101 .... 1111 .... 0001 ....      @rndm
580SHSUB16          1111 1010 1101 .... 1111 .... 0010 ....      @rndm
581USUB16           1111 1010 1101 .... 1111 .... 0100 ....      @rndm
582UQSUB16          1111 1010 1101 .... 1111 .... 0101 ....      @rndm
583UHSUB16          1111 1010 1101 .... 1111 .... 0110 ....      @rndm
584
585SSAX             1111 1010 1110 .... 1111 .... 0000 ....      @rndm
586QSAX             1111 1010 1110 .... 1111 .... 0001 ....      @rndm
587SHSAX            1111 1010 1110 .... 1111 .... 0010 ....      @rndm
588USAX             1111 1010 1110 .... 1111 .... 0100 ....      @rndm
589UQSAX            1111 1010 1110 .... 1111 .... 0101 ....      @rndm
590UHSAX            1111 1010 1110 .... 1111 .... 0110 ....      @rndm
591
592# Register extends
593
594@rrr_rot         .... .... .... rn:4 .... rd:4 .. rot:2 rm:4  &rrr_rot
595
596SXTAH            1111 1010 0000 .... 1111 .... 10.. ....      @rrr_rot
597UXTAH            1111 1010 0001 .... 1111 .... 10.. ....      @rrr_rot
598SXTAB16          1111 1010 0010 .... 1111 .... 10.. ....      @rrr_rot
599UXTAB16          1111 1010 0011 .... 1111 .... 10.. ....      @rrr_rot
600SXTAB            1111 1010 0100 .... 1111 .... 10.. ....      @rrr_rot
601UXTAB            1111 1010 0101 .... 1111 .... 10.. ....      @rrr_rot
602
603# Load/store multiple
604
605@ldstm           .... .... .. w:1 . rn:4 list:16              &ldst_block u=0
606
607STM_t32          1110 1000 10.0 .... ................         @ldstm i=1 b=0
608STM_t32          1110 1001 00.0 .... ................         @ldstm i=0 b=1
609LDM_t32          1110 1000 10.1 .... ................         @ldstm i=1 b=0
610LDM_t32          1110 1001 00.1 .... ................         @ldstm i=0 b=1
611
612&rfe             !extern rn w pu
613@rfe             .... .... .. w:1 . rn:4 ................     &rfe
614
615RFE              1110 1000 00.1 .... 1100000000000000         @rfe pu=2
616RFE              1110 1001 10.1 .... 1100000000000000         @rfe pu=1
617
618&srs             !extern mode w pu
619@srs             .... .... .. w:1 . .... ........... mode:5   &srs
620
621SRS              1110 1000 00.0 1101 1100 0000 000. ....      @srs pu=2
622SRS              1110 1001 10.0 1101 1100 0000 000. ....      @srs pu=1
623
624# Branches
625
626%imm24           26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
627@branch24        ................................             &i imm=%imm24
628
629B                1111 0. .......... 10.1 ............         @branch24
630BL               1111 0. .......... 11.1 ............         @branch24
631BLX_i            1111 0. .......... 11.0 ............         @branch24
632