xref: /openbmc/qemu/target/arm/tcg/t32.decode (revision 7d87775f)
1# Thumb2 instructions
2#
3#  Copyright (c) 2019 Linaro, Ltd
4#
5# This library is free software; you can redistribute it and/or
6# modify it under the terms of the GNU Lesser General Public
7# License as published by the Free Software Foundation; either
8# version 2.1 of the License, or (at your option) any later version.
9#
10# This library is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13# Lesser General Public License for more details.
14#
15# You should have received a copy of the GNU Lesser General Public
16# License along with this library; if not, see <http://www.gnu.org/licenses/>.
17
18#
19# This file is processed by scripts/decodetree.py
20#
21
22&empty           !extern
23&s_rrr_shi       !extern s rd rn rm shim shty
24&s_rrr_shr       !extern s rn rd rm rs shty
25&s_rri_rot       !extern s rn rd imm rot
26&s_rrrr          !extern s rd rn rm ra
27&rrrr            !extern rd rn rm ra
28&rrr_rot         !extern rd rn rm rot
29&rrr             !extern rd rn rm
30&rr              !extern rd rm
31&ri              !extern rd imm
32&r               !extern rm
33&i               !extern imm
34&msr_reg         !extern rn r mask
35&mrs_reg         !extern rd r
36&msr_bank        !extern rn r sysm
37&mrs_bank        !extern rd r sysm
38&ldst_rr         !extern p w u rn rt rm shimm shtype
39&ldst_ri         !extern p w u rn rt imm
40&ldst_block      !extern rn i b u w list
41&strex           !extern rn rd rt rt2 imm
42&ldrex           !extern rn rt rt2 imm
43&bfx             !extern rd rn lsb widthm1
44&bfi             !extern rd rn lsb msb
45&sat             !extern rd rn satimm imm sh
46&pkh             !extern rd rn rm imm tb
47&cps             !extern mode imod M A I F
48&mcr             !extern cp opc1 crn crm opc2 rt
49&mcrr            !extern cp opc1 crm rt rt2
50
51&mve_shl_ri      rdalo rdahi shim
52&mve_shl_rr      rdalo rdahi rm
53&mve_sh_ri       rda shim
54&mve_sh_rr       rda rm
55
56# rdahi: bits [3:1] from insn, bit 0 is 1
57# rdalo: bits [3:1] from insn, bit 0 is 0
58%rdahi_9 9:3 !function=times_2_plus_1
59%rdalo_17 17:3 !function=times_2
60
61# Data-processing (register)
62
63%imm5_12_6       12:3 6:2
64
65@s_rrr_shi       ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \
66                 &s_rrr_shi shim=%imm5_12_6
67@s_rxr_shi       ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \
68                 &s_rrr_shi shim=%imm5_12_6 rn=0
69@S_xrr_shi       ....... .... .   rn:4 .... .... .. shty:2 rm:4 \
70                 &s_rrr_shi shim=%imm5_12_6 s=1 rd=0
71
72@mve_shl_ri      ....... .... . ... . . ... ... . .. .. .... \
73                 &mve_shl_ri shim=%imm5_12_6 rdalo=%rdalo_17 rdahi=%rdahi_9
74@mve_shl_rr      ....... .... . ... . rm:4  ... . .. .. .... \
75                 &mve_shl_rr rdalo=%rdalo_17 rdahi=%rdahi_9
76@mve_sh_ri       ....... .... . rda:4 . ... ... . .. .. .... \
77                 &mve_sh_ri shim=%imm5_12_6
78@mve_sh_rr       ....... .... . rda:4 rm:4 .... .... .... &mve_sh_rr
79
80{
81  TST_xrri       1110101 0000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
82  AND_rrri       1110101 0000 . .... 0 ... .... .... ....     @s_rrr_shi
83}
84BIC_rrri         1110101 0001 . .... 0 ... .... .... ....     @s_rrr_shi
85{
86  # The v8.1M MVE shift insns overlap in encoding with MOVS/ORRS
87  # and are distinguished by having Rm==13 or 15. Those are UNPREDICTABLE
88  # cases for MOVS/ORRS. We decode the MVE cases first, ensuring that
89  # they explicitly call unallocated_encoding() for cases that must UNDEF
90  # (eg "using a new shift insn on a v8.1M CPU without MVE"), and letting
91  # the rest fall through (where ORR_rrri and MOV_rxri will end up
92  # handling them as r13 and r15 accesses with the same semantics as A32).
93  [
94    {
95      UQSHL_ri   1110101 0010 1 ....  0 ...  1111 .. 00 1111  @mve_sh_ri
96      LSLL_ri    1110101 0010 1 ... 0 0 ... ... 1 .. 00 1111  @mve_shl_ri
97      UQSHLL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 00 1111  @mve_shl_ri
98    }
99
100    {
101      URSHR_ri   1110101 0010 1 ....  0 ...  1111 .. 01 1111  @mve_sh_ri
102      LSRL_ri    1110101 0010 1 ... 0 0 ... ... 1 .. 01 1111  @mve_shl_ri
103      URSHRL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 01 1111  @mve_shl_ri
104    }
105
106    {
107      SRSHR_ri   1110101 0010 1 ....  0 ...  1111 .. 10 1111  @mve_sh_ri
108      ASRL_ri    1110101 0010 1 ... 0 0 ... ... 1 .. 10 1111  @mve_shl_ri
109      SRSHRL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 10 1111  @mve_shl_ri
110    }
111
112    {
113      SQSHL_ri   1110101 0010 1 ....  0 ...  1111 .. 11 1111  @mve_sh_ri
114      SQSHLL_ri  1110101 0010 1 ... 1 0 ... ... 1 .. 11 1111  @mve_shl_ri
115    }
116
117    {
118      UQRSHL_rr    1110101 0010 1 ....  ....  1111 0000 1101  @mve_sh_rr
119      LSLL_rr      1110101 0010 1 ... 0 .... ... 1 0000 1101  @mve_shl_rr
120      UQRSHLL64_rr 1110101 0010 1 ... 1 .... ... 1 0000 1101  @mve_shl_rr
121    }
122
123    {
124      SQRSHR_rr    1110101 0010 1 ....  ....  1111 0010 1101  @mve_sh_rr
125      ASRL_rr      1110101 0010 1 ... 0 .... ... 1 0010 1101  @mve_shl_rr
126      SQRSHRL64_rr 1110101 0010 1 ... 1 .... ... 1 0010 1101  @mve_shl_rr
127    }
128
129    UQRSHLL48_rr 1110101 0010 1 ... 1 ....  ... 1  1000 1101  @mve_shl_rr
130    SQRSHRL48_rr 1110101 0010 1 ... 1 ....  ... 1  1010 1101  @mve_shl_rr
131  ]
132
133  MOV_rxri       1110101 0010 . 1111 0 ... .... .... ....     @s_rxr_shi
134  ORR_rrri       1110101 0010 . .... 0 ... .... .... ....     @s_rrr_shi
135
136  # v8.1M CSEL and friends
137  CSEL           1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4
138}
139{
140  MVN_rxri       1110101 0011 . 1111 0 ... .... .... ....     @s_rxr_shi
141  ORN_rrri       1110101 0011 . .... 0 ... .... .... ....     @s_rrr_shi
142}
143{
144  TEQ_xrri       1110101 0100 1 .... 0 ... 1111 .... ....     @S_xrr_shi
145  EOR_rrri       1110101 0100 . .... 0 ... .... .... ....     @s_rrr_shi
146}
147PKH              1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
148                 &pkh imm=%imm5_12_6
149{
150  CMN_xrri       1110101 1000 1 .... 0 ... 1111 .... ....     @S_xrr_shi
151  ADD_rrri       1110101 1000 . .... 0 ... .... .... ....     @s_rrr_shi
152}
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
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
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
206
207# Data processing (plain binary immediate)
208
209%imm12_26_12_0   26:1 12:3 0:8
210%neg12_26_12_0   26:1 12:3 0:8 !function=negate
211@s0_rri_12       .... ... .... . rn:4 . ... rd:4 ........ \
212                 &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0
213
214{
215  ADR            1111 0.1 0000 0 1111 0 ... rd:4 ........ \
216                 &ri imm=%imm12_26_12_0
217  ADD_rri        1111 0.1 0000 0 .... 0 ... .... ........     @s0_rri_12
218}
219{
220  ADR            1111 0.1 0101 0 1111 0 ... rd:4 ........ \
221                 &ri imm=%neg12_26_12_0
222  SUB_rri        1111 0.1 0101 0 .... 0 ... .... ........     @s0_rri_12
223}
224
225# Move Wide
226
227%imm16_26_16_12_0 16:4 26:1 12:3 0:8
228@mov16           .... .... .... .... .... rd:4 .... .... \
229                 &ri imm=%imm16_26_16_12_0
230
231MOVW             1111 0.10 0100 .... 0 ... .... ........      @mov16
232MOVT             1111 0.10 1100 .... 0 ... .... ........      @mov16
233
234# Saturate, bitfield
235
236@sat             .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \
237                 &sat imm=%imm5_12_6
238@sat16           .... .... .. .    . rn:4 . ... rd:4 .. . satimm:5 \
239                 &sat sh=0 imm=0
240
241{
242  SSAT16         1111 0011 001 0 .... 0 000 .... 00 0 .....   @sat16
243  SSAT           1111 0011 00. 0 .... 0 ... .... .. 0 .....   @sat
244}
245{
246  USAT16         1111 0011 101 0 .... 0 000 .... 00 0 .....   @sat16
247  USAT           1111 0011 10. 0 .... 0 ... .... .. 0 .....   @sat
248}
249
250@bfx             .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \
251                 &bfx lsb=%imm5_12_6
252@bfi             .... .... ... . rn:4 . ... rd:4 .. . msb:5 \
253                 &bfi lsb=%imm5_12_6
254
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
261# Multiply and multiply accumulate
262
263@s0_rnadm        .... .... .... rn:4 ra:4 rd:4 .... rm:4      &s_rrrr s=0
264@s0_rn0dm        .... .... .... rn:4 .... rd:4 .... rm:4      &s_rrrr ra=0 s=0
265@rnadm           .... .... .... rn:4 ra:4 rd:4 .... rm:4      &rrrr
266@rn0dm           .... .... .... rn:4 .... rd:4 .... rm:4      &rrrr ra=0
267@rndm            .... .... .... rn:4 .... rd:4 .... rm:4      &rrr
268@rdm             .... .... .... .... .... rd:4 .... rm:4      &rr
269
270{
271  MUL            1111 1011 0000 .... 1111 .... 0000 ....      @s0_rn0dm
272  MLA            1111 1011 0000 .... .... .... 0000 ....      @s0_rnadm
273}
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
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
308
309# usad8 is usada8 w/ ra=15
310USADA8           1111 1011 0111 .... .... .... 0000 ....      @rnadm
311
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
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
336
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
344SEL              1111 1010 1010 .... 1111 .... 1000 ....      @rndm
345
346# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
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
351CLZ              1111 1010 1011 ---- 1111 .... 1000 ....      @rdm
352
353# Branches and miscellaneous control
354
355%msr_sysm        4:1 8:4
356%mrs_sysm        4:1 16:4
357%imm16_16_0      16:4 0:12
358%imm21           26:s1 11:1 13:1 16:6 0:11 !function=times_2
359&ci              cond imm
360
361{
362  # Group insn[25:23] = 111, which is cond=111x for the branch below,
363  # or unconditional, which would be illegal for the branch.
364  [
365    # Hints, and CPS
366    {
367      [
368        YIELD    1111 0011 1010 1111 1000 0000 0000 0001
369        WFE      1111 0011 1010 1111 1000 0000 0000 0010
370        WFI      1111 0011 1010 1111 1000 0000 0000 0011
371
372        # 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
375
376        ESB      1111 0011 1010 1111 1000 0000 0001 0000
377      ]
378
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 ---- ----
382
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 \
385                 &cps
386    }
387
388    # Miscellaneous control
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
394
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  \
398                 &mrs_bank sysm=%mrs_sysm
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  \
404                 &msr_bank sysm=%msr_sysm
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 \
415                 &s_rri_rot rot=0 s=1 rd=15 rn=14
416    }
417    SMC          1111 0111 1111 imm:4 1000 0000 0000 0000     &i
418    HVC          1111 0111 1110 ....  1000 .... .... ....     \
419                 &i imm=%imm16_16_0
420    UDF          1111 0111 1111 ----  1010 ---- ---- ----
421  ]
422  B_cond_thumb   1111 0. cond:4 ...... 10.0 ............      &ci imm=%imm21
423}
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    PLD          1111 1000 -001 1111 1111 ------------        # (literal)
462    LDRB_ri      1111 1000 .001 1111 .... ............        @ldst_ri_lit
463  }
464  {
465    PLD          1111 1000 1001 ---- 1111 ------------        # (immediate T1)
466    LDRB_ri      1111 1000 1001 .... .... ............        @ldst_ri_pos
467  }
468  LDRB_ri        1111 1000 0001 .... .... 1..1 ........       @ldst_ri_idx
469  {
470    PLD          1111 1000 0001 ---- 1111 1100 --------       # (immediate T2)
471    LDRB_ri      1111 1000 0001 .... .... 1100 ........       @ldst_ri_neg
472  }
473  LDRBT_ri       1111 1000 0001 .... .... 1110 ........       @ldst_ri_unp
474  {
475    PLD          1111 1000 0001 ---- 1111 000000 -- ----      # (register)
476    LDRB_rr      1111 1000 0001 .... .... 000000 .. ....      @ldst_rr
477  }
478}
479{
480  {
481    PLD          1111 1000 -011 1111 1111 ------------        # (literal)
482    LDRH_ri      1111 1000 .011 1111 .... ............        @ldst_ri_lit
483  }
484  {
485    PLDW         1111 1000 1011 ---- 1111 ------------        # (immediate T1)
486    LDRH_ri      1111 1000 1011 .... .... ............        @ldst_ri_pos
487  }
488  LDRH_ri        1111 1000 0011 .... .... 1..1 ........       @ldst_ri_idx
489  {
490    PLDW         1111 1000 0011 ---- 1111 1100 --------       # (immediate T2)
491    LDRH_ri      1111 1000 0011 .... .... 1100 ........       @ldst_ri_neg
492  }
493  LDRHT_ri       1111 1000 0011 .... .... 1110 ........       @ldst_ri_unp
494  {
495    PLDW         1111 1000 0011 ---- 1111 000000 -- ----      # (register)
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{
508  {
509    PLI          1111 1001 -001 1111 1111 ------------        # (literal T3)
510    LDRSB_ri     1111 1001 .001 1111 .... ............        @ldst_ri_lit
511  }
512  {
513    PLI          1111 1001 1001 ---- 1111 ------------        # (immediate T1)
514    LDRSB_ri     1111 1001 1001 .... .... ............        @ldst_ri_pos
515  }
516  LDRSB_ri       1111 1001 0001 .... .... 1..1 ........       @ldst_ri_idx
517  {
518    PLI          1111 1001 0001 ---- 1111 1100 --------       # (immediate T2)
519    LDRSB_ri     1111 1001 0001 .... .... 1100 ........       @ldst_ri_neg
520  }
521  LDRSBT_ri      1111 1001 0001 .... .... 1110 ........       @ldst_ri_unp
522  {
523    PLI          1111 1001 0001 ---- 1111 000000 -- ----      # (register)
524    LDRSB_rr     1111 1001 0001 .... .... 000000 .. ....      @ldst_rr
525  }
526}
527# NOPs here are unallocated memory hints, treated as NOP.
528{
529  {
530    NOP          1111 1001 -011 1111 1111 ------------
531    LDRSH_ri     1111 1001 .011 1111 .... ............        @ldst_ri_lit
532  }
533  {
534    NOP          1111 1001 1011 ---- 1111 ------------
535    LDRSH_ri     1111 1001 1011 .... .... ............        @ldst_ri_pos
536  }
537  LDRSH_ri       1111 1001 0011 .... .... 1..1 ........       @ldst_ri_idx
538  {
539    NOP          1111 1001 0011 ---- 1111 1100 --------
540    LDRSH_ri     1111 1001 0011 .... .... 1100 ........       @ldst_ri_neg
541  }
542  LDRSHT_ri      1111 1001 0011 .... .... 1110 ........       @ldst_ri_unp
543  {
544    NOP          1111 1001 0011 ---- 1111 000000 -- ----
545    LDRSH_rr     1111 1001 0011 .... .... 000000 .. ....      @ldst_rr
546  }
547}
548
549%imm8x4          0:8 !function=times_4
550&ldst_ri2        p w u rn rt rt2 imm
551@ldstd_ri8       .... .... u:1 ... rn:4 rt:4 rt2:4 ........   \
552                 &ldst_ri2 imm=%imm8x4
553
554STRD_ri_t32      1110 1000 .110 .... .... .... ........    @ldstd_ri8 w=1 p=0
555LDRD_ri_t32      1110 1000 .111 .... .... .... ........    @ldstd_ri8 w=1 p=0
556
557STRD_ri_t32      1110 1001 .100 .... .... .... ........    @ldstd_ri8 w=0 p=1
558LDRD_ri_t32      1110 1001 .101 .... .... .... ........    @ldstd_ri8 w=0 p=1
559
560STRD_ri_t32      1110 1001 .110 .... .... .... ........    @ldstd_ri8 w=1 p=1
561{
562  SG             1110 1001 0111 1111 1110 1001 01111111
563  LDRD_ri_t32    1110 1001 .111 .... .... .... ........    @ldstd_ri8 w=1 p=1
564}
565
566# Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch
567
568@strex_i         .... .... .... rn:4 rt:4 rd:4 .... .... \
569                 &strex rt2=15 imm=%imm8x4
570@strex_0         .... .... .... rn:4 rt:4 .... .... rd:4 \
571                 &strex rt2=15 imm=0
572@strex_d         .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
573                 &strex imm=0
574
575@ldrex_i         .... .... .... rn:4 rt:4 .... .... .... \
576                 &ldrex rt2=15 imm=%imm8x4
577@ldrex_0         .... .... .... rn:4 rt:4 .... .... .... \
578                 &ldrex rt2=15 imm=0
579@ldrex_d         .... .... .... rn:4 rt:4 rt2:4 .... .... \
580                 &ldrex imm=0
581
582{
583  TT             1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
584  STREX          1110 1000 0100 .... .... .... .... ....      @strex_i
585}
586STREXB           1110 1000 1100 .... .... 1111 0100 ....      @strex_0
587STREXH           1110 1000 1100 .... .... 1111 0101 ....      @strex_0
588STREXD_t32       1110 1000 1100 .... .... .... 0111 ....      @strex_d
589
590STLEX            1110 1000 1100 .... .... 1111 1110 ....      @strex_0
591STLEXB           1110 1000 1100 .... .... 1111 1100 ....      @strex_0
592STLEXH           1110 1000 1100 .... .... 1111 1101 ....      @strex_0
593STLEXD_t32       1110 1000 1100 .... .... .... 1111 ....      @strex_d
594
595STL              1110 1000 1100 .... .... 1111 1010 1111      @ldrex_0
596STLB             1110 1000 1100 .... .... 1111 1000 1111      @ldrex_0
597STLH             1110 1000 1100 .... .... 1111 1001 1111      @ldrex_0
598
599LDREX            1110 1000 0101 .... .... 1111 .... ....      @ldrex_i
600LDREXB           1110 1000 1101 .... .... 1111 0100 1111      @ldrex_0
601LDREXH           1110 1000 1101 .... .... 1111 0101 1111      @ldrex_0
602LDREXD_t32       1110 1000 1101 .... .... .... 0111 1111      @ldrex_d
603
604LDAEX            1110 1000 1101 .... .... 1111 1110 1111      @ldrex_0
605LDAEXB           1110 1000 1101 .... .... 1111 1100 1111      @ldrex_0
606LDAEXH           1110 1000 1101 .... .... 1111 1101 1111      @ldrex_0
607LDAEXD_t32       1110 1000 1101 .... .... .... 1111 1111      @ldrex_d
608
609LDA              1110 1000 1101 .... .... 1111 1010 1111      @ldrex_0
610LDAB             1110 1000 1101 .... .... 1111 1000 1111      @ldrex_0
611LDAH             1110 1000 1101 .... .... 1111 1001 1111      @ldrex_0
612
613&tbranch         rn rm
614@tbranch         .... .... .... rn:4 .... .... .... rm:4      &tbranch
615
616TBB              1110 1000 1101 .... 1111 0000 0000 ....      @tbranch
617TBH              1110 1000 1101 .... 1111 0000 0001 ....      @tbranch
618
619# Parallel addition and subtraction
620
621SADD8            1111 1010 1000 .... 1111 .... 0000 ....      @rndm
622QADD8            1111 1010 1000 .... 1111 .... 0001 ....      @rndm
623SHADD8           1111 1010 1000 .... 1111 .... 0010 ....      @rndm
624UADD8            1111 1010 1000 .... 1111 .... 0100 ....      @rndm
625UQADD8           1111 1010 1000 .... 1111 .... 0101 ....      @rndm
626UHADD8           1111 1010 1000 .... 1111 .... 0110 ....      @rndm
627
628SADD16           1111 1010 1001 .... 1111 .... 0000 ....      @rndm
629QADD16           1111 1010 1001 .... 1111 .... 0001 ....      @rndm
630SHADD16          1111 1010 1001 .... 1111 .... 0010 ....      @rndm
631UADD16           1111 1010 1001 .... 1111 .... 0100 ....      @rndm
632UQADD16          1111 1010 1001 .... 1111 .... 0101 ....      @rndm
633UHADD16          1111 1010 1001 .... 1111 .... 0110 ....      @rndm
634
635SASX             1111 1010 1010 .... 1111 .... 0000 ....      @rndm
636QASX             1111 1010 1010 .... 1111 .... 0001 ....      @rndm
637SHASX            1111 1010 1010 .... 1111 .... 0010 ....      @rndm
638UASX             1111 1010 1010 .... 1111 .... 0100 ....      @rndm
639UQASX            1111 1010 1010 .... 1111 .... 0101 ....      @rndm
640UHASX            1111 1010 1010 .... 1111 .... 0110 ....      @rndm
641
642SSUB8            1111 1010 1100 .... 1111 .... 0000 ....      @rndm
643QSUB8            1111 1010 1100 .... 1111 .... 0001 ....      @rndm
644SHSUB8           1111 1010 1100 .... 1111 .... 0010 ....      @rndm
645USUB8            1111 1010 1100 .... 1111 .... 0100 ....      @rndm
646UQSUB8           1111 1010 1100 .... 1111 .... 0101 ....      @rndm
647UHSUB8           1111 1010 1100 .... 1111 .... 0110 ....      @rndm
648
649SSUB16           1111 1010 1101 .... 1111 .... 0000 ....      @rndm
650QSUB16           1111 1010 1101 .... 1111 .... 0001 ....      @rndm
651SHSUB16          1111 1010 1101 .... 1111 .... 0010 ....      @rndm
652USUB16           1111 1010 1101 .... 1111 .... 0100 ....      @rndm
653UQSUB16          1111 1010 1101 .... 1111 .... 0101 ....      @rndm
654UHSUB16          1111 1010 1101 .... 1111 .... 0110 ....      @rndm
655
656SSAX             1111 1010 1110 .... 1111 .... 0000 ....      @rndm
657QSAX             1111 1010 1110 .... 1111 .... 0001 ....      @rndm
658SHSAX            1111 1010 1110 .... 1111 .... 0010 ....      @rndm
659USAX             1111 1010 1110 .... 1111 .... 0100 ....      @rndm
660UQSAX            1111 1010 1110 .... 1111 .... 0101 ....      @rndm
661UHSAX            1111 1010 1110 .... 1111 .... 0110 ....      @rndm
662
663# Register extends
664
665@rrr_rot         .... .... .... rn:4 .... rd:4 .. rot:2 rm:4  &rrr_rot
666
667SXTAH            1111 1010 0000 .... 1111 .... 10.. ....      @rrr_rot
668UXTAH            1111 1010 0001 .... 1111 .... 10.. ....      @rrr_rot
669SXTAB16          1111 1010 0010 .... 1111 .... 10.. ....      @rrr_rot
670UXTAB16          1111 1010 0011 .... 1111 .... 10.. ....      @rrr_rot
671SXTAB            1111 1010 0100 .... 1111 .... 10.. ....      @rrr_rot
672UXTAB            1111 1010 0101 .... 1111 .... 10.. ....      @rrr_rot
673
674# Load/store multiple
675
676@ldstm           .... .... .. w:1 . rn:4 list:16              &ldst_block u=0
677
678STM_t32          1110 1000 10.0 .... ................         @ldstm i=1 b=0
679STM_t32          1110 1001 00.0 .... ................         @ldstm i=0 b=1
680{
681  # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding
682  CLRM           1110 1000 1001 1111 list:16
683  LDM_t32        1110 1000 10.1 .... ................         @ldstm i=1 b=0
684}
685LDM_t32          1110 1001 00.1 .... ................         @ldstm i=0 b=1
686
687&rfe             !extern rn w pu
688@rfe             .... .... .. w:1 . rn:4 ................     &rfe
689
690RFE              1110 1000 00.1 .... 1100000000000000         @rfe pu=2
691RFE              1110 1001 10.1 .... 1100000000000000         @rfe pu=1
692
693&srs             !extern mode w pu
694@srs             .... .... .. w:1 . .... ........... mode:5   &srs
695
696SRS              1110 1000 00.0 1101 1100 0000 000. ....      @srs pu=2
697SRS              1110 1001 10.0 1101 1100 0000 000. ....      @srs pu=1
698
699# Coprocessor instructions
700
701# We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
702# other coprocessor instructions always UNDEF.
703# The trans_ functions for these will ignore cp values 8..13 for v7 or
704# earlier, and 0..13 for v8 and later, because those areas of the
705# encoding space may be used for other things, such as VFP or Neon.
706
707@mcr             .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4
708@mcrr            .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4
709
710MCRR             1110 1100 0100 .... .... .... .... .... @mcrr
711MRRC             1110 1100 0101 .... .... .... .... .... @mcrr
712
713MCR              1110 1110 ... 0 .... .... .... ... 1 .... @mcr
714MRC              1110 1110 ... 1 .... .... .... ... 1 .... @mcr
715
716# Branches
717
718%imm24           26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
719@branch24        ................................             &i imm=%imm24
720
721B                1111 0. .......... 10.1 ............         @branch24
722BL               1111 0. .......... 11.1 ............         @branch24
723{
724  # BLX_i is non-M-profile only
725  BLX_i          1111 0. .......... 11.0 ............         @branch24
726  # M-profile only: loop and branch insns
727  [
728    # All these BF insns have boff != 0b0000; we NOP them all
729    BF           1111 0 boff:4  ------- 1100 - ---------- 1    # BFL
730    BF           1111 0 boff:4 0 ------ 1110 - ---------- 1    # BFCSEL
731    BF           1111 0 boff:4 10 ----- 1110 - ---------- 1    # BF
732    BF           1111 0 boff:4 11 ----- 1110 0 0000000000 1    # BFX, BFLX
733  ]
734  [
735    # LE and WLS immediate
736    %lob_imm 1:10 11:1 !function=times_2
737
738    DLS          1111 0 0000 100     rn:4 1110 0000 0000 0001 size=4
739    WLS          1111 0 0000 100     rn:4 1100 . .......... 1 imm=%lob_imm size=4
740    {
741      LE         1111 0 0000 0 f:1 tp:1 1111 1100 . .......... 1 imm=%lob_imm
742      # This is WLSTP
743      WLS        1111 0 0000 0 size:2 rn:4 1100 . .......... 1 imm=%lob_imm
744    }
745    {
746      LCTP       1111 0 0000 000     1111 1110 0000 0000 0001
747      # This is DLSTP
748      DLS        1111 0 0000 0 size:2 rn:4 1110 0000 0000 0001
749    }
750    VCTP         1111 0 0000 0 size:2 rn:4 1110 1000 0000 0001
751  ]
752}
753