target/arm: Convert load/store (multiple structures) to decodetree
[qemu/ar7.git] / target / arm / tcg / a64.decode
blob69bdfa2e73b9061af35ff2dba561c206678a9945
1 # AArch64 A64 allowed instruction decoding
3 #  Copyright (c) 2023 Linaro, Ltd
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.
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.
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/>.
19 # This file is processed by scripts/decodetree.py
22 &r               rn
23 &ri              rd imm
24 &rri_sf          rd rn imm sf
25 &i               imm
28 ### Data Processing - Immediate
30 # PC-rel addressing
32 %imm_pcrel      5:s19 29:2
33 @pcrel          . .. ..... ................... rd:5     &ri imm=%imm_pcrel
35 ADR             0 .. 10000 ................... .....    @pcrel
36 ADRP            1 .. 10000 ................... .....    @pcrel
38 # Add/subtract (immediate)
40 %imm12_sh12     10:12 !function=shl_12
41 @addsub_imm     sf:1 .. ...... . imm:12 rn:5 rd:5
42 @addsub_imm12   sf:1 .. ...... . ............ rn:5 rd:5 imm=%imm12_sh12
44 ADD_i           . 00 100010 0 ............ ..... .....  @addsub_imm
45 ADD_i           . 00 100010 1 ............ ..... .....  @addsub_imm12
46 ADDS_i          . 01 100010 0 ............ ..... .....  @addsub_imm
47 ADDS_i          . 01 100010 1 ............ ..... .....  @addsub_imm12
49 SUB_i           . 10 100010 0 ............ ..... .....  @addsub_imm
50 SUB_i           . 10 100010 1 ............ ..... .....  @addsub_imm12
51 SUBS_i          . 11 100010 0 ............ ..... .....  @addsub_imm
52 SUBS_i          . 11 100010 1 ............ ..... .....  @addsub_imm12
54 # Add/subtract (immediate with tags)
56 &rri_tag        rd rn uimm6 uimm4
57 @addsub_imm_tag . .. ...... . uimm6:6 .. uimm4:4 rn:5 rd:5 &rri_tag
59 ADDG_i          1 00 100011 0 ...... 00 .... ..... ..... @addsub_imm_tag
60 SUBG_i          1 10 100011 0 ...... 00 .... ..... ..... @addsub_imm_tag
62 # Logical (immediate)
64 &rri_log        rd rn sf dbm
65 @logic_imm_64   1 .. ...... dbm:13 rn:5 rd:5            &rri_log sf=1
66 @logic_imm_32   0 .. ...... 0 dbm:12 rn:5 rd:5          &rri_log sf=0
68 AND_i           . 00 100100 . ...... ...... ..... ..... @logic_imm_64
69 AND_i           . 00 100100 . ...... ...... ..... ..... @logic_imm_32
70 ORR_i           . 01 100100 . ...... ...... ..... ..... @logic_imm_64
71 ORR_i           . 01 100100 . ...... ...... ..... ..... @logic_imm_32
72 EOR_i           . 10 100100 . ...... ...... ..... ..... @logic_imm_64
73 EOR_i           . 10 100100 . ...... ...... ..... ..... @logic_imm_32
74 ANDS_i          . 11 100100 . ...... ...... ..... ..... @logic_imm_64
75 ANDS_i          . 11 100100 . ...... ...... ..... ..... @logic_imm_32
77 # Move wide (immediate)
79 &movw           rd sf imm hw
80 @movw_64        1 .. ...... hw:2   imm:16 rd:5          &movw sf=1
81 @movw_32        0 .. ...... 0 hw:1 imm:16 rd:5          &movw sf=0
83 MOVN            . 00 100101 .. ................ .....   @movw_64
84 MOVN            . 00 100101 .. ................ .....   @movw_32
85 MOVZ            . 10 100101 .. ................ .....   @movw_64
86 MOVZ            . 10 100101 .. ................ .....   @movw_32
87 MOVK            . 11 100101 .. ................ .....   @movw_64
88 MOVK            . 11 100101 .. ................ .....   @movw_32
90 # Bitfield
92 &bitfield       rd rn sf immr imms
93 @bitfield_64    1 .. ...... 1 immr:6 imms:6 rn:5 rd:5      &bitfield sf=1
94 @bitfield_32    0 .. ...... 0 0 immr:5 0 imms:5 rn:5 rd:5  &bitfield sf=0
96 SBFM            . 00 100110 . ...... ...... ..... ..... @bitfield_64
97 SBFM            . 00 100110 . ...... ...... ..... ..... @bitfield_32
98 BFM             . 01 100110 . ...... ...... ..... ..... @bitfield_64
99 BFM             . 01 100110 . ...... ...... ..... ..... @bitfield_32
100 UBFM            . 10 100110 . ...... ...... ..... ..... @bitfield_64
101 UBFM            . 10 100110 . ...... ...... ..... ..... @bitfield_32
103 # Extract
105 &extract        rd rn rm imm sf
107 EXTR            1 00 100111 1 0 rm:5 imm:6 rn:5 rd:5     &extract sf=1
108 EXTR            0 00 100111 0 0 rm:5 0 imm:5 rn:5 rd:5   &extract sf=0
110 # Branches
112 %imm26   0:s26 !function=times_4
113 @branch         . ..... .......................... &i imm=%imm26
115 B               0 00101 .......................... @branch
116 BL              1 00101 .......................... @branch
118 %imm19   5:s19 !function=times_4
119 &cbz     rt imm sf nz
121 CBZ             sf:1 011010 nz:1 ................... rt:5 &cbz imm=%imm19
123 %imm14     5:s14 !function=times_4
124 %imm31_19  31:1 19:5
125 &tbz       rt imm nz bitpos
127 TBZ             . 011011 nz:1 ..... .............. rt:5 &tbz  imm=%imm14 bitpos=%imm31_19
129 B_cond          0101010 0 ................... 0 cond:4 imm=%imm19
131 BR              1101011 0000 11111 000000 rn:5 00000 &r
132 BLR             1101011 0001 11111 000000 rn:5 00000 &r
133 RET             1101011 0010 11111 000000 rn:5 00000 &r
135 &braz       rn m
136 BRAZ            1101011 0000 11111 00001 m:1 rn:5 11111 &braz   # BRAAZ, BRABZ
137 BLRAZ           1101011 0001 11111 00001 m:1 rn:5 11111 &braz   # BLRAAZ, BLRABZ
139 &reta       m
140 RETA            1101011 0010 11111 00001 m:1 11111 11111 &reta  # RETAA, RETAB
142 &bra        rn rm m
143 BRA             1101011 1000 11111 00001 m:1 rn:5 rm:5 &bra # BRAA, BRAB
144 BLRA            1101011 1001 11111 00001 m:1 rn:5 rm:5 &bra # BLRAA, BLRAB
146 ERET            1101011 0100 11111 000000 11111 00000
147 ERETA           1101011 0100 11111 00001 m:1 11111 11111 &reta  # ERETAA, ERETAB
149 # We don't need to decode DRPS because it always UNDEFs except when
150 # the processor is in halting debug state (which we don't implement).
151 # The pattern is listed here as documentation.
152 # DRPS            1101011 0101 11111 000000 11111 00000
154 # Hint instruction group
156   [
157     YIELD       1101 0101 0000 0011 0010 0000 001 11111
158     WFE         1101 0101 0000 0011 0010 0000 010 11111
159     WFI         1101 0101 0000 0011 0010 0000 011 11111
160     # We implement WFE to never block, so our SEV/SEVL are NOPs
161     # SEV       1101 0101 0000 0011 0010 0000 100 11111
162     # SEVL      1101 0101 0000 0011 0010 0000 101 11111
163     # Our DGL is a NOP because we don't merge memory accesses anyway.
164     # DGL       1101 0101 0000 0011 0010 0000 110 11111
165     XPACLRI     1101 0101 0000 0011 0010 0000 111 11111
166     PACIA1716   1101 0101 0000 0011 0010 0001 000 11111
167     PACIB1716   1101 0101 0000 0011 0010 0001 010 11111
168     AUTIA1716   1101 0101 0000 0011 0010 0001 100 11111
169     AUTIB1716   1101 0101 0000 0011 0010 0001 110 11111
170     ESB         1101 0101 0000 0011 0010 0010 000 11111
171     PACIAZ      1101 0101 0000 0011 0010 0011 000 11111
172     PACIASP     1101 0101 0000 0011 0010 0011 001 11111
173     PACIBZ      1101 0101 0000 0011 0010 0011 010 11111
174     PACIBSP     1101 0101 0000 0011 0010 0011 011 11111
175     AUTIAZ      1101 0101 0000 0011 0010 0011 100 11111
176     AUTIASP     1101 0101 0000 0011 0010 0011 101 11111
177     AUTIBZ      1101 0101 0000 0011 0010 0011 110 11111
178     AUTIBSP     1101 0101 0000 0011 0010 0011 111 11111
179   ]
180   # The canonical NOP has CRm == op2 == 0, but all of the space
181   # that isn't specifically allocated to an instruction must NOP
182   NOP           1101 0101 0000 0011 0010 ---- --- 11111
185 # Barriers
187 CLREX           1101 0101 0000 0011 0011 ---- 010 11111
188 DSB_DMB         1101 0101 0000 0011 0011 domain:2 types:2 10- 11111
189 ISB             1101 0101 0000 0011 0011 ---- 110 11111
190 SB              1101 0101 0000 0011 0011 0000 111 11111
192 # PSTATE
194 CFINV           1101 0101 0000 0 000 0100 0000 000 11111
195 XAFLAG          1101 0101 0000 0 000 0100 0000 001 11111
196 AXFLAG          1101 0101 0000 0 000 0100 0000 010 11111
198 # These are architecturally all "MSR (immediate)"; we decode the destination
199 # register too because there is no commonality in our implementation.
200 @msr_i          .... .... .... . ... .... imm:4 ... .....
201 MSR_i_UAO       1101 0101 0000 0 000 0100 .... 011 11111 @msr_i
202 MSR_i_PAN       1101 0101 0000 0 000 0100 .... 100 11111 @msr_i
203 MSR_i_SPSEL     1101 0101 0000 0 000 0100 .... 101 11111 @msr_i
204 MSR_i_SBSS      1101 0101 0000 0 011 0100 .... 001 11111 @msr_i
205 MSR_i_DIT       1101 0101 0000 0 011 0100 .... 010 11111 @msr_i
206 MSR_i_TCO       1101 0101 0000 0 011 0100 .... 100 11111 @msr_i
207 MSR_i_DAIFSET   1101 0101 0000 0 011 0100 .... 110 11111 @msr_i
208 MSR_i_DAIFCLEAR 1101 0101 0000 0 011 0100 .... 111 11111 @msr_i
209 MSR_i_SVCR      1101 0101 0000 0 011 0100 0 mask:2 imm:1 011 11111
211 # MRS, MSR (register), SYS, SYSL. These are all essentially the
212 # same instruction as far as QEMU is concerned.
213 # NB: op0 is bits [20:19], but op0=0b00 is other insns, so we have
214 # to hand-decode it.
215 SYS             1101 0101 00 l:1 01 op1:3 crn:4 crm:4 op2:3 rt:5 op0=1
216 SYS             1101 0101 00 l:1 10 op1:3 crn:4 crm:4 op2:3 rt:5 op0=2
217 SYS             1101 0101 00 l:1 11 op1:3 crn:4 crm:4 op2:3 rt:5 op0=3
219 # Exception generation
221 @i16            .... .... ... imm:16           ... .. &i
222 SVC             1101 0100 000 ................ 000 01 @i16
223 HVC             1101 0100 000 ................ 000 10 @i16
224 SMC             1101 0100 000 ................ 000 11 @i16
225 BRK             1101 0100 001 ................ 000 00 @i16
226 HLT             1101 0100 010 ................ 000 00 @i16
227 # These insns always UNDEF unless in halting debug state, which
228 # we don't implement. So we don't need to decode them. The patterns
229 # are listed here as documentation.
230 # DCPS1         1101 0100 101 ................ 000 01 @i16
231 # DCPS2         1101 0100 101 ................ 000 10 @i16
232 # DCPS3         1101 0100 101 ................ 000 11 @i16
234 # Loads and stores
236 &stxr           rn rt rt2 rs sz lasr
237 &stlr           rn rt sz lasr
238 @stxr           sz:2 ...... ... rs:5 lasr:1 rt2:5 rn:5 rt:5 &stxr
239 @stlr           sz:2 ...... ... ..... lasr:1 ..... rn:5 rt:5 &stlr
240 %imm1_30_p2 30:1 !function=plus_2
241 @stxp           .. ...... ... rs:5 lasr:1 rt2:5 rn:5 rt:5 &stxr sz=%imm1_30_p2
242 STXR            .. 001000 000 ..... . ..... ..... ..... @stxr  # inc STLXR
243 LDXR            .. 001000 010 ..... . ..... ..... ..... @stxr  # inc LDAXR
244 STLR            .. 001000 100 11111 . 11111 ..... ..... @stlr  # inc STLLR
245 LDAR            .. 001000 110 11111 . 11111 ..... ..... @stlr  # inc LDLAR
247 STXP            1 . 001000 001 ..... . ..... ..... ..... @stxp # inc STLXP
248 LDXP            1 . 001000 011 ..... . ..... ..... ..... @stxp # inc LDAXP
250 # CASP, CASPA, CASPAL, CASPL (we don't decode the bits that determine
251 # acquire/release semantics because QEMU's cmpxchg always has those)
252 CASP            0 . 001000 0 - 1 rs:5 - 11111 rn:5 rt:5 sz=%imm1_30_p2
253 # CAS, CASA, CASAL, CASL
254 CAS             sz:2 001000 1 - 1 rs:5 - 11111 rn:5 rt:5
256 &ldlit          rt imm sz sign
257 @ldlit          .. ... . .. ................... rt:5 &ldlit imm=%imm19
259 LD_lit          00 011 0 00 ................... ..... @ldlit sz=2 sign=0
260 LD_lit          01 011 0 00 ................... ..... @ldlit sz=3 sign=0
261 LD_lit          10 011 0 00 ................... ..... @ldlit sz=2 sign=1
262 LD_lit_v        00 011 1 00 ................... ..... @ldlit sz=2 sign=0
263 LD_lit_v        01 011 1 00 ................... ..... @ldlit sz=3 sign=0
264 LD_lit_v        10 011 1 00 ................... ..... @ldlit sz=4 sign=0
266 # PRFM
267 NOP             11 011 0 00 ------------------- -----
269 &ldstpair       rt2 rt rn imm sz sign w p
270 @ldstpair       .. ... . ... . imm:s7 rt2:5 rn:5 rt:5 &ldstpair
272 # STNP, LDNP: Signed offset, non-temporal hint. We don't emulate caches
273 # so we ignore hints about data access patterns, and handle these like
274 # plain signed offset.
275 STP             00 101 0 000 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
276 LDP             00 101 0 000 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
277 STP             10 101 0 000 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
278 LDP             10 101 0 000 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
279 STP_v           00 101 1 000 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
280 LDP_v           00 101 1 000 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
281 STP_v           01 101 1 000 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
282 LDP_v           01 101 1 000 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
283 STP_v           10 101 1 000 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
284 LDP_v           10 101 1 000 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
286 # STP and LDP: post-indexed
287 STP             00 101 0 001 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
288 LDP             00 101 0 001 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
289 LDP             01 101 0 001 1 ....... ..... ..... ..... @ldstpair sz=2 sign=1 p=1 w=1
290 STP             10 101 0 001 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
291 LDP             10 101 0 001 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
292 STP_v           00 101 1 001 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
293 LDP_v           00 101 1 001 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
294 STP_v           01 101 1 001 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
295 LDP_v           01 101 1 001 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
296 STP_v           10 101 1 001 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=1 w=1
297 LDP_v           10 101 1 001 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=1 w=1
299 # STP and LDP: offset
300 STP             00 101 0 010 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
301 LDP             00 101 0 010 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
302 LDP             01 101 0 010 1 ....... ..... ..... ..... @ldstpair sz=2 sign=1 p=0 w=0
303 STP             10 101 0 010 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
304 LDP             10 101 0 010 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
305 STP_v           00 101 1 010 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
306 LDP_v           00 101 1 010 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
307 STP_v           01 101 1 010 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
308 LDP_v           01 101 1 010 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
309 STP_v           10 101 1 010 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
310 LDP_v           10 101 1 010 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
312 # STP and LDP: pre-indexed
313 STP             00 101 0 011 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
314 LDP             00 101 0 011 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
315 LDP             01 101 0 011 1 ....... ..... ..... ..... @ldstpair sz=2 sign=1 p=0 w=1
316 STP             10 101 0 011 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
317 LDP             10 101 0 011 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
318 STP_v           00 101 1 011 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
319 LDP_v           00 101 1 011 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
320 STP_v           01 101 1 011 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
321 LDP_v           01 101 1 011 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
322 STP_v           10 101 1 011 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=1
323 LDP_v           10 101 1 011 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=1
325 # STGP: store tag and pair
326 STGP            01 101 0 001 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
327 STGP            01 101 0 010 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
328 STGP            01 101 0 011 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
330 # Load/store register (unscaled immediate)
331 &ldst_imm       rt rn imm sz sign w p unpriv ext
332 @ldst_imm       .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=0 p=0 w=0
333 @ldst_imm_pre   .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=0 p=0 w=1
334 @ldst_imm_post  .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=0 p=1 w=1
335 @ldst_imm_user  .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=1 p=0 w=0
337 STR_i           sz:2 111 0 00 00 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0
338 LDR_i           00 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=1 sz=0
339 LDR_i           01 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=1 sz=1
340 LDR_i           10 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=1 sz=2
341 LDR_i           11 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0 sz=3
342 LDR_i           00 111 0 00 10 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=0 sz=0
343 LDR_i           01 111 0 00 10 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=0 sz=1
344 LDR_i           10 111 0 00 10 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=0 sz=2
345 LDR_i           00 111 0 00 11 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=1 sz=0
346 LDR_i           01 111 0 00 11 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=1 sz=1
348 STR_i           sz:2 111 0 00 00 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0
349 LDR_i           00 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=1 sz=0
350 LDR_i           01 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=1 sz=1
351 LDR_i           10 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=1 sz=2
352 LDR_i           11 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0 sz=3
353 LDR_i           00 111 0 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=0 sz=0
354 LDR_i           01 111 0 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=0 sz=1
355 LDR_i           10 111 0 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=0 sz=2
356 LDR_i           00 111 0 00 11 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=1 sz=0
357 LDR_i           01 111 0 00 11 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=1 sz=1
359 STR_i           sz:2 111 0 00 00 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=0
360 LDR_i           00 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=1 sz=0
361 LDR_i           01 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=1 sz=1
362 LDR_i           10 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=1 sz=2
363 LDR_i           11 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=0 sz=3
364 LDR_i           00 111 0 00 10 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=0 sz=0
365 LDR_i           01 111 0 00 10 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=0 sz=1
366 LDR_i           10 111 0 00 10 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=0 sz=2
367 LDR_i           00 111 0 00 11 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=1 sz=0
368 LDR_i           01 111 0 00 11 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=1 sz=1
370 STR_i           sz:2 111 0 00 00 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0
371 LDR_i           00 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=1 sz=0
372 LDR_i           01 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=1 sz=1
373 LDR_i           10 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=1 sz=2
374 LDR_i           11 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0 sz=3
375 LDR_i           00 111 0 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=0 sz=0
376 LDR_i           01 111 0 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=0 sz=1
377 LDR_i           10 111 0 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=0 sz=2
378 LDR_i           00 111 0 00 11 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=1 sz=0
379 LDR_i           01 111 0 00 11 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=1 sz=1
381 # PRFM : prefetch memory: a no-op for QEMU
382 NOP             11 111 0 00 10 0 --------- 00 ----- -----
384 STR_v_i         sz:2 111 1 00 00 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0
385 STR_v_i         00 111 1 00 10 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0 sz=4
386 LDR_v_i         sz:2 111 1 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0
387 LDR_v_i         00 111 1 00 11 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0 sz=4
389 STR_v_i         sz:2 111 1 00 00 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0
390 STR_v_i         00 111 1 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0 sz=4
391 LDR_v_i         sz:2 111 1 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0
392 LDR_v_i         00 111 1 00 11 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0 sz=4
394 STR_v_i         sz:2 111 1 00 00 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0
395 STR_v_i         00 111 1 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0 sz=4
396 LDR_v_i         sz:2 111 1 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0
397 LDR_v_i         00 111 1 00 11 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0 sz=4
399 # Load/store with an unsigned 12 bit immediate, which is scaled by the
400 # element size. The function gets the sz:imm and returns the scaled immediate.
401 %uimm_scaled   10:12 sz:3 !function=uimm_scaled
403 @ldst_uimm      .. ... . .. .. ............ rn:5 rt:5 &ldst_imm unpriv=0 p=0 w=0 imm=%uimm_scaled
405 STR_i           sz:2 111 0 01 00 ............ ..... ..... @ldst_uimm sign=0 ext=0
406 LDR_i           00 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=1 sz=0
407 LDR_i           01 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=1 sz=1
408 LDR_i           10 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=1 sz=2
409 LDR_i           11 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=0 sz=3
410 LDR_i           00 111 0 01 10 ............ ..... ..... @ldst_uimm sign=1 ext=0 sz=0
411 LDR_i           01 111 0 01 10 ............ ..... ..... @ldst_uimm sign=1 ext=0 sz=1
412 LDR_i           10 111 0 01 10 ............ ..... ..... @ldst_uimm sign=1 ext=0 sz=2
413 LDR_i           00 111 0 01 11 ............ ..... ..... @ldst_uimm sign=1 ext=1 sz=0
414 LDR_i           01 111 0 01 11 ............ ..... ..... @ldst_uimm sign=1 ext=1 sz=1
416 # PRFM
417 NOP             11 111 0 01 10 ------------ ----- -----
419 STR_v_i         sz:2 111 1 01 00 ............ ..... ..... @ldst_uimm sign=0 ext=0
420 STR_v_i         00 111 1 01 10 ............ ..... ..... @ldst_uimm sign=0 ext=0 sz=4
421 LDR_v_i         sz:2 111 1 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=0
422 LDR_v_i         00 111 1 01 11 ............ ..... ..... @ldst_uimm sign=0 ext=0 sz=4
424 # Load/store with register offset
425 &ldst rm rn rt sign ext sz opt s
426 @ldst           .. ... . .. .. . rm:5 opt:3 s:1 .. rn:5 rt:5 &ldst
427 STR             sz:2 111 0 00 00 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0
428 LDR             00 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=1 sz=0
429 LDR             01 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=1 sz=1
430 LDR             10 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=1 sz=2
431 LDR             11 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0 sz=3
432 LDR             00 111 0 00 10 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=0 sz=0
433 LDR             01 111 0 00 10 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=0 sz=1
434 LDR             10 111 0 00 10 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=0 sz=2
435 LDR             00 111 0 00 11 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=1 sz=0
436 LDR             01 111 0 00 11 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=1 sz=1
438 # PRFM
439 NOP             11 111 0 00 10 1 ----- -1- - 10 ----- -----
441 STR_v           sz:2 111 1 00 00 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0
442 STR_v           00 111 1 00 10 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0 sz=4
443 LDR_v           sz:2 111 1 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0
444 LDR_v           00 111 1 00 11 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0 sz=4
446 # Atomic memory operations
447 &atomic         rs rn rt a r sz
448 @atomic         sz:2 ... . .. a:1 r:1 . rs:5 . ... .. rn:5 rt:5 &atomic
449 LDADD           .. 111 0 00 . . 1 ..... 0000 00 ..... ..... @atomic
450 LDCLR           .. 111 0 00 . . 1 ..... 0001 00 ..... ..... @atomic
451 LDEOR           .. 111 0 00 . . 1 ..... 0010 00 ..... ..... @atomic
452 LDSET           .. 111 0 00 . . 1 ..... 0011 00 ..... ..... @atomic
453 LDSMAX          .. 111 0 00 . . 1 ..... 0100 00 ..... ..... @atomic
454 LDSMIN          .. 111 0 00 . . 1 ..... 0101 00 ..... ..... @atomic
455 LDUMAX          .. 111 0 00 . . 1 ..... 0110 00 ..... ..... @atomic
456 LDUMIN          .. 111 0 00 . . 1 ..... 0111 00 ..... ..... @atomic
457 SWP             .. 111 0 00 . . 1 ..... 1000 00 ..... ..... @atomic
459 LDAPR           sz:2 111 0 00 1 0 1 11111 1100 00 rn:5 rt:5
461 # Load/store register (pointer authentication)
463 # LDRA immediate is 10 bits signed and scaled, but the bits aren't all contiguous
464 %ldra_imm       22:s1 12:9 !function=times_2
466 LDRA            11 111 0 00 m:1 . 1 ......... w:1 1 rn:5 rt:5 imm=%ldra_imm
468 &ldapr_stlr_i   rn rt imm sz sign ext
469 @ldapr_stlr_i   .. ...... .. . imm:9 .. rn:5 rt:5 &ldapr_stlr_i
470 STLR_i          sz:2 011001 00 0 ......... 00 ..... ..... @ldapr_stlr_i sign=0 ext=0
471 LDAPR_i         sz:2 011001 01 0 ......... 00 ..... ..... @ldapr_stlr_i sign=0 ext=0
472 LDAPR_i         00 011001 10 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=0 sz=0
473 LDAPR_i         01 011001 10 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=0 sz=1
474 LDAPR_i         10 011001 10 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=0 sz=2
475 LDAPR_i         00 011001 11 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=1 sz=0
476 LDAPR_i         01 011001 11 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=1 sz=1
478 # Load/store multiple structures
479 # The 4-bit opcode in [15:12] encodes repeat count and structure elements
480 &ldst_mult      rm rn rt sz q p rpt selem
481 @ldst_mult      . q:1 ...... p:1 . . rm:5 .... sz:2 rn:5 rt:5 &ldst_mult
482 ST_mult         0 . 001100 . 0 0 ..... 0000 .. ..... ..... @ldst_mult rpt=1 selem=4
483 ST_mult         0 . 001100 . 0 0 ..... 0010 .. ..... ..... @ldst_mult rpt=4 selem=1
484 ST_mult         0 . 001100 . 0 0 ..... 0100 .. ..... ..... @ldst_mult rpt=1 selem=3
485 ST_mult         0 . 001100 . 0 0 ..... 0110 .. ..... ..... @ldst_mult rpt=3 selem=1
486 ST_mult         0 . 001100 . 0 0 ..... 0111 .. ..... ..... @ldst_mult rpt=1 selem=1
487 ST_mult         0 . 001100 . 0 0 ..... 1000 .. ..... ..... @ldst_mult rpt=1 selem=2
488 ST_mult         0 . 001100 . 0 0 ..... 1010 .. ..... ..... @ldst_mult rpt=2 selem=1
490 LD_mult         0 . 001100 . 1 0 ..... 0000 .. ..... ..... @ldst_mult rpt=1 selem=4
491 LD_mult         0 . 001100 . 1 0 ..... 0010 .. ..... ..... @ldst_mult rpt=4 selem=1
492 LD_mult         0 . 001100 . 1 0 ..... 0100 .. ..... ..... @ldst_mult rpt=1 selem=3
493 LD_mult         0 . 001100 . 1 0 ..... 0110 .. ..... ..... @ldst_mult rpt=3 selem=1
494 LD_mult         0 . 001100 . 1 0 ..... 0111 .. ..... ..... @ldst_mult rpt=1 selem=1
495 LD_mult         0 . 001100 . 1 0 ..... 1000 .. ..... ..... @ldst_mult rpt=1 selem=2
496 LD_mult         0 . 001100 . 1 0 ..... 1010 .. ..... ..... @ldst_mult rpt=2 selem=1