|
@@ -150,3 +150,406 @@ ERETA 1101011 0100 11111 00001 m:1 11111 11111 &reta # ERETAA, ERETAB
|
|
# the processor is in halting debug state (which we don't implement).
|
|
# the processor is in halting debug state (which we don't implement).
|
|
# The pattern is listed here as documentation.
|
|
# The pattern is listed here as documentation.
|
|
# DRPS 1101011 0101 11111 000000 11111 00000
|
|
# DRPS 1101011 0101 11111 000000 11111 00000
|
|
|
|
+
|
|
|
|
+# Hint instruction group
|
|
|
|
+{
|
|
|
|
+ [
|
|
|
|
+ YIELD 1101 0101 0000 0011 0010 0000 001 11111
|
|
|
|
+ WFE 1101 0101 0000 0011 0010 0000 010 11111
|
|
|
|
+ WFI 1101 0101 0000 0011 0010 0000 011 11111
|
|
|
|
+ # We implement WFE to never block, so our SEV/SEVL are NOPs
|
|
|
|
+ # SEV 1101 0101 0000 0011 0010 0000 100 11111
|
|
|
|
+ # SEVL 1101 0101 0000 0011 0010 0000 101 11111
|
|
|
|
+ # Our DGL is a NOP because we don't merge memory accesses anyway.
|
|
|
|
+ # DGL 1101 0101 0000 0011 0010 0000 110 11111
|
|
|
|
+ XPACLRI 1101 0101 0000 0011 0010 0000 111 11111
|
|
|
|
+ PACIA1716 1101 0101 0000 0011 0010 0001 000 11111
|
|
|
|
+ PACIB1716 1101 0101 0000 0011 0010 0001 010 11111
|
|
|
|
+ AUTIA1716 1101 0101 0000 0011 0010 0001 100 11111
|
|
|
|
+ AUTIB1716 1101 0101 0000 0011 0010 0001 110 11111
|
|
|
|
+ ESB 1101 0101 0000 0011 0010 0010 000 11111
|
|
|
|
+ PACIAZ 1101 0101 0000 0011 0010 0011 000 11111
|
|
|
|
+ PACIASP 1101 0101 0000 0011 0010 0011 001 11111
|
|
|
|
+ PACIBZ 1101 0101 0000 0011 0010 0011 010 11111
|
|
|
|
+ PACIBSP 1101 0101 0000 0011 0010 0011 011 11111
|
|
|
|
+ AUTIAZ 1101 0101 0000 0011 0010 0011 100 11111
|
|
|
|
+ AUTIASP 1101 0101 0000 0011 0010 0011 101 11111
|
|
|
|
+ AUTIBZ 1101 0101 0000 0011 0010 0011 110 11111
|
|
|
|
+ AUTIBSP 1101 0101 0000 0011 0010 0011 111 11111
|
|
|
|
+ ]
|
|
|
|
+ # The canonical NOP has CRm == op2 == 0, but all of the space
|
|
|
|
+ # that isn't specifically allocated to an instruction must NOP
|
|
|
|
+ NOP 1101 0101 0000 0011 0010 ---- --- 11111
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+# Barriers
|
|
|
|
+
|
|
|
|
+CLREX 1101 0101 0000 0011 0011 ---- 010 11111
|
|
|
|
+DSB_DMB 1101 0101 0000 0011 0011 domain:2 types:2 10- 11111
|
|
|
|
+ISB 1101 0101 0000 0011 0011 ---- 110 11111
|
|
|
|
+SB 1101 0101 0000 0011 0011 0000 111 11111
|
|
|
|
+
|
|
|
|
+# PSTATE
|
|
|
|
+
|
|
|
|
+CFINV 1101 0101 0000 0 000 0100 0000 000 11111
|
|
|
|
+XAFLAG 1101 0101 0000 0 000 0100 0000 001 11111
|
|
|
|
+AXFLAG 1101 0101 0000 0 000 0100 0000 010 11111
|
|
|
|
+
|
|
|
|
+# These are architecturally all "MSR (immediate)"; we decode the destination
|
|
|
|
+# register too because there is no commonality in our implementation.
|
|
|
|
+@msr_i .... .... .... . ... .... imm:4 ... .....
|
|
|
|
+MSR_i_UAO 1101 0101 0000 0 000 0100 .... 011 11111 @msr_i
|
|
|
|
+MSR_i_PAN 1101 0101 0000 0 000 0100 .... 100 11111 @msr_i
|
|
|
|
+MSR_i_SPSEL 1101 0101 0000 0 000 0100 .... 101 11111 @msr_i
|
|
|
|
+MSR_i_SBSS 1101 0101 0000 0 011 0100 .... 001 11111 @msr_i
|
|
|
|
+MSR_i_DIT 1101 0101 0000 0 011 0100 .... 010 11111 @msr_i
|
|
|
|
+MSR_i_TCO 1101 0101 0000 0 011 0100 .... 100 11111 @msr_i
|
|
|
|
+MSR_i_DAIFSET 1101 0101 0000 0 011 0100 .... 110 11111 @msr_i
|
|
|
|
+MSR_i_DAIFCLEAR 1101 0101 0000 0 011 0100 .... 111 11111 @msr_i
|
|
|
|
+MSR_i_SVCR 1101 0101 0000 0 011 0100 0 mask:2 imm:1 011 11111
|
|
|
|
+
|
|
|
|
+# MRS, MSR (register), SYS, SYSL. These are all essentially the
|
|
|
|
+# same instruction as far as QEMU is concerned.
|
|
|
|
+# NB: op0 is bits [20:19], but op0=0b00 is other insns, so we have
|
|
|
|
+# to hand-decode it.
|
|
|
|
+SYS 1101 0101 00 l:1 01 op1:3 crn:4 crm:4 op2:3 rt:5 op0=1
|
|
|
|
+SYS 1101 0101 00 l:1 10 op1:3 crn:4 crm:4 op2:3 rt:5 op0=2
|
|
|
|
+SYS 1101 0101 00 l:1 11 op1:3 crn:4 crm:4 op2:3 rt:5 op0=3
|
|
|
|
+
|
|
|
|
+# Exception generation
|
|
|
|
+
|
|
|
|
+@i16 .... .... ... imm:16 ... .. &i
|
|
|
|
+SVC 1101 0100 000 ................ 000 01 @i16
|
|
|
|
+HVC 1101 0100 000 ................ 000 10 @i16
|
|
|
|
+SMC 1101 0100 000 ................ 000 11 @i16
|
|
|
|
+BRK 1101 0100 001 ................ 000 00 @i16
|
|
|
|
+HLT 1101 0100 010 ................ 000 00 @i16
|
|
|
|
+# These insns always UNDEF unless in halting debug state, which
|
|
|
|
+# we don't implement. So we don't need to decode them. The patterns
|
|
|
|
+# are listed here as documentation.
|
|
|
|
+# DCPS1 1101 0100 101 ................ 000 01 @i16
|
|
|
|
+# DCPS2 1101 0100 101 ................ 000 10 @i16
|
|
|
|
+# DCPS3 1101 0100 101 ................ 000 11 @i16
|
|
|
|
+
|
|
|
|
+# Loads and stores
|
|
|
|
+
|
|
|
|
+&stxr rn rt rt2 rs sz lasr
|
|
|
|
+&stlr rn rt sz lasr
|
|
|
|
+@stxr sz:2 ...... ... rs:5 lasr:1 rt2:5 rn:5 rt:5 &stxr
|
|
|
|
+@stlr sz:2 ...... ... ..... lasr:1 ..... rn:5 rt:5 &stlr
|
|
|
|
+%imm1_30_p2 30:1 !function=plus_2
|
|
|
|
+@stxp .. ...... ... rs:5 lasr:1 rt2:5 rn:5 rt:5 &stxr sz=%imm1_30_p2
|
|
|
|
+STXR .. 001000 000 ..... . ..... ..... ..... @stxr # inc STLXR
|
|
|
|
+LDXR .. 001000 010 ..... . ..... ..... ..... @stxr # inc LDAXR
|
|
|
|
+STLR .. 001000 100 11111 . 11111 ..... ..... @stlr # inc STLLR
|
|
|
|
+LDAR .. 001000 110 11111 . 11111 ..... ..... @stlr # inc LDLAR
|
|
|
|
+
|
|
|
|
+STXP 1 . 001000 001 ..... . ..... ..... ..... @stxp # inc STLXP
|
|
|
|
+LDXP 1 . 001000 011 ..... . ..... ..... ..... @stxp # inc LDAXP
|
|
|
|
+
|
|
|
|
+# CASP, CASPA, CASPAL, CASPL (we don't decode the bits that determine
|
|
|
|
+# acquire/release semantics because QEMU's cmpxchg always has those)
|
|
|
|
+CASP 0 . 001000 0 - 1 rs:5 - 11111 rn:5 rt:5 sz=%imm1_30_p2
|
|
|
|
+# CAS, CASA, CASAL, CASL
|
|
|
|
+CAS sz:2 001000 1 - 1 rs:5 - 11111 rn:5 rt:5
|
|
|
|
+
|
|
|
|
+&ldlit rt imm sz sign
|
|
|
|
+@ldlit .. ... . .. ................... rt:5 &ldlit imm=%imm19
|
|
|
|
+
|
|
|
|
+LD_lit 00 011 0 00 ................... ..... @ldlit sz=2 sign=0
|
|
|
|
+LD_lit 01 011 0 00 ................... ..... @ldlit sz=3 sign=0
|
|
|
|
+LD_lit 10 011 0 00 ................... ..... @ldlit sz=2 sign=1
|
|
|
|
+LD_lit_v 00 011 1 00 ................... ..... @ldlit sz=2 sign=0
|
|
|
|
+LD_lit_v 01 011 1 00 ................... ..... @ldlit sz=3 sign=0
|
|
|
|
+LD_lit_v 10 011 1 00 ................... ..... @ldlit sz=4 sign=0
|
|
|
|
+
|
|
|
|
+# PRFM
|
|
|
|
+NOP 11 011 0 00 ------------------- -----
|
|
|
|
+
|
|
|
|
+&ldstpair rt2 rt rn imm sz sign w p
|
|
|
|
+@ldstpair .. ... . ... . imm:s7 rt2:5 rn:5 rt:5 &ldstpair
|
|
|
|
+
|
|
|
|
+# STNP, LDNP: Signed offset, non-temporal hint. We don't emulate caches
|
|
|
|
+# so we ignore hints about data access patterns, and handle these like
|
|
|
|
+# plain signed offset.
|
|
|
|
+STP 00 101 0 000 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+LDP 00 101 0 000 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+STP 10 101 0 000 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+LDP 10 101 0 000 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+STP_v 00 101 1 000 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+LDP_v 00 101 1 000 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+STP_v 01 101 1 000 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+LDP_v 01 101 1 000 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+STP_v 10 101 1 000 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
|
|
|
|
+LDP_v 10 101 1 000 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
|
|
|
|
+
|
|
|
|
+# STP and LDP: post-indexed
|
|
|
|
+STP 00 101 0 001 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
|
|
|
|
+LDP 00 101 0 001 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
|
|
|
|
+LDP 01 101 0 001 1 ....... ..... ..... ..... @ldstpair sz=2 sign=1 p=1 w=1
|
|
|
|
+STP 10 101 0 001 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
|
|
|
|
+LDP 10 101 0 001 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
|
|
|
|
+STP_v 00 101 1 001 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
|
|
|
|
+LDP_v 00 101 1 001 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=1 w=1
|
|
|
|
+STP_v 01 101 1 001 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
|
|
|
|
+LDP_v 01 101 1 001 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
|
|
|
|
+STP_v 10 101 1 001 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=1 w=1
|
|
|
|
+LDP_v 10 101 1 001 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=1 w=1
|
|
|
|
+
|
|
|
|
+# STP and LDP: offset
|
|
|
|
+STP 00 101 0 010 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+LDP 00 101 0 010 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+LDP 01 101 0 010 1 ....... ..... ..... ..... @ldstpair sz=2 sign=1 p=0 w=0
|
|
|
|
+STP 10 101 0 010 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+LDP 10 101 0 010 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+STP_v 00 101 1 010 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+LDP_v 00 101 1 010 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=0
|
|
|
|
+STP_v 01 101 1 010 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+LDP_v 01 101 1 010 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+STP_v 10 101 1 010 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
|
|
|
|
+LDP_v 10 101 1 010 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=0
|
|
|
|
+
|
|
|
|
+# STP and LDP: pre-indexed
|
|
|
|
+STP 00 101 0 011 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
|
|
|
|
+LDP 00 101 0 011 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
|
|
|
|
+LDP 01 101 0 011 1 ....... ..... ..... ..... @ldstpair sz=2 sign=1 p=0 w=1
|
|
|
|
+STP 10 101 0 011 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
|
|
|
|
+LDP 10 101 0 011 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
|
|
|
|
+STP_v 00 101 1 011 0 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
|
|
|
|
+LDP_v 00 101 1 011 1 ....... ..... ..... ..... @ldstpair sz=2 sign=0 p=0 w=1
|
|
|
|
+STP_v 01 101 1 011 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
|
|
|
|
+LDP_v 01 101 1 011 1 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
|
|
|
|
+STP_v 10 101 1 011 0 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=1
|
|
|
|
+LDP_v 10 101 1 011 1 ....... ..... ..... ..... @ldstpair sz=4 sign=0 p=0 w=1
|
|
|
|
+
|
|
|
|
+# STGP: store tag and pair
|
|
|
|
+STGP 01 101 0 001 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=1 w=1
|
|
|
|
+STGP 01 101 0 010 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=0
|
|
|
|
+STGP 01 101 0 011 0 ....... ..... ..... ..... @ldstpair sz=3 sign=0 p=0 w=1
|
|
|
|
+
|
|
|
|
+# Load/store register (unscaled immediate)
|
|
|
|
+&ldst_imm rt rn imm sz sign w p unpriv ext
|
|
|
|
+@ldst_imm .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=0 p=0 w=0
|
|
|
|
+@ldst_imm_pre .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=0 p=0 w=1
|
|
|
|
+@ldst_imm_post .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=0 p=1 w=1
|
|
|
|
+@ldst_imm_user .. ... . .. .. . imm:s9 .. rn:5 rt:5 &ldst_imm unpriv=1 p=0 w=0
|
|
|
|
+
|
|
|
|
+STR_i sz:2 111 0 00 00 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0
|
|
|
|
+LDR_i 00 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=1 sz=1
|
|
|
|
+LDR_i 10 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=1 sz=2
|
|
|
|
+LDR_i 11 111 0 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0 sz=3
|
|
|
|
+LDR_i 00 111 0 00 10 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=0 sz=0
|
|
|
|
+LDR_i 01 111 0 00 10 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=0 sz=1
|
|
|
|
+LDR_i 10 111 0 00 10 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=0 sz=2
|
|
|
|
+LDR_i 00 111 0 00 11 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 11 0 ......... 00 ..... ..... @ldst_imm sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+STR_i sz:2 111 0 00 00 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0
|
|
|
|
+LDR_i 00 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=1 sz=1
|
|
|
|
+LDR_i 10 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=1 sz=2
|
|
|
|
+LDR_i 11 111 0 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0 sz=3
|
|
|
|
+LDR_i 00 111 0 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=0 sz=0
|
|
|
|
+LDR_i 01 111 0 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=0 sz=1
|
|
|
|
+LDR_i 10 111 0 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=0 sz=2
|
|
|
|
+LDR_i 00 111 0 00 11 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 11 0 ......... 01 ..... ..... @ldst_imm_post sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+STR_i sz:2 111 0 00 00 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=0
|
|
|
|
+LDR_i 00 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=1 sz=1
|
|
|
|
+LDR_i 10 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=1 sz=2
|
|
|
|
+LDR_i 11 111 0 00 01 0 ......... 10 ..... ..... @ldst_imm_user sign=0 ext=0 sz=3
|
|
|
|
+LDR_i 00 111 0 00 10 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=0 sz=0
|
|
|
|
+LDR_i 01 111 0 00 10 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=0 sz=1
|
|
|
|
+LDR_i 10 111 0 00 10 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=0 sz=2
|
|
|
|
+LDR_i 00 111 0 00 11 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 11 0 ......... 10 ..... ..... @ldst_imm_user sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+STR_i sz:2 111 0 00 00 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0
|
|
|
|
+LDR_i 00 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=1 sz=1
|
|
|
|
+LDR_i 10 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=1 sz=2
|
|
|
|
+LDR_i 11 111 0 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0 sz=3
|
|
|
|
+LDR_i 00 111 0 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=0 sz=0
|
|
|
|
+LDR_i 01 111 0 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=0 sz=1
|
|
|
|
+LDR_i 10 111 0 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=0 sz=2
|
|
|
|
+LDR_i 00 111 0 00 11 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 00 11 0 ......... 11 ..... ..... @ldst_imm_pre sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+# PRFM : prefetch memory: a no-op for QEMU
|
|
|
|
+NOP 11 111 0 00 10 0 --------- 00 ----- -----
|
|
|
|
+
|
|
|
|
+STR_v_i sz:2 111 1 00 00 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0
|
|
|
|
+STR_v_i 00 111 1 00 10 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0 sz=4
|
|
|
|
+LDR_v_i sz:2 111 1 00 01 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0
|
|
|
|
+LDR_v_i 00 111 1 00 11 0 ......... 00 ..... ..... @ldst_imm sign=0 ext=0 sz=4
|
|
|
|
+
|
|
|
|
+STR_v_i sz:2 111 1 00 00 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0
|
|
|
|
+STR_v_i 00 111 1 00 10 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0 sz=4
|
|
|
|
+LDR_v_i sz:2 111 1 00 01 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0
|
|
|
|
+LDR_v_i 00 111 1 00 11 0 ......... 01 ..... ..... @ldst_imm_post sign=0 ext=0 sz=4
|
|
|
|
+
|
|
|
|
+STR_v_i sz:2 111 1 00 00 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0
|
|
|
|
+STR_v_i 00 111 1 00 10 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0 sz=4
|
|
|
|
+LDR_v_i sz:2 111 1 00 01 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0
|
|
|
|
+LDR_v_i 00 111 1 00 11 0 ......... 11 ..... ..... @ldst_imm_pre sign=0 ext=0 sz=4
|
|
|
|
+
|
|
|
|
+# Load/store with an unsigned 12 bit immediate, which is scaled by the
|
|
|
|
+# element size. The function gets the sz:imm and returns the scaled immediate.
|
|
|
|
+%uimm_scaled 10:12 sz:3 !function=uimm_scaled
|
|
|
|
+
|
|
|
|
+@ldst_uimm .. ... . .. .. ............ rn:5 rt:5 &ldst_imm unpriv=0 p=0 w=0 imm=%uimm_scaled
|
|
|
|
+
|
|
|
|
+STR_i sz:2 111 0 01 00 ............ ..... ..... @ldst_uimm sign=0 ext=0
|
|
|
|
+LDR_i 00 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=1 sz=1
|
|
|
|
+LDR_i 10 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=1 sz=2
|
|
|
|
+LDR_i 11 111 0 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=0 sz=3
|
|
|
|
+LDR_i 00 111 0 01 10 ............ ..... ..... @ldst_uimm sign=1 ext=0 sz=0
|
|
|
|
+LDR_i 01 111 0 01 10 ............ ..... ..... @ldst_uimm sign=1 ext=0 sz=1
|
|
|
|
+LDR_i 10 111 0 01 10 ............ ..... ..... @ldst_uimm sign=1 ext=0 sz=2
|
|
|
|
+LDR_i 00 111 0 01 11 ............ ..... ..... @ldst_uimm sign=1 ext=1 sz=0
|
|
|
|
+LDR_i 01 111 0 01 11 ............ ..... ..... @ldst_uimm sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+# PRFM
|
|
|
|
+NOP 11 111 0 01 10 ------------ ----- -----
|
|
|
|
+
|
|
|
|
+STR_v_i sz:2 111 1 01 00 ............ ..... ..... @ldst_uimm sign=0 ext=0
|
|
|
|
+STR_v_i 00 111 1 01 10 ............ ..... ..... @ldst_uimm sign=0 ext=0 sz=4
|
|
|
|
+LDR_v_i sz:2 111 1 01 01 ............ ..... ..... @ldst_uimm sign=0 ext=0
|
|
|
|
+LDR_v_i 00 111 1 01 11 ............ ..... ..... @ldst_uimm sign=0 ext=0 sz=4
|
|
|
|
+
|
|
|
|
+# Load/store with register offset
|
|
|
|
+&ldst rm rn rt sign ext sz opt s
|
|
|
|
+@ldst .. ... . .. .. . rm:5 opt:3 s:1 .. rn:5 rt:5 &ldst
|
|
|
|
+STR sz:2 111 0 00 00 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0
|
|
|
|
+LDR 00 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=1 sz=0
|
|
|
|
+LDR 01 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=1 sz=1
|
|
|
|
+LDR 10 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=1 sz=2
|
|
|
|
+LDR 11 111 0 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0 sz=3
|
|
|
|
+LDR 00 111 0 00 10 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=0 sz=0
|
|
|
|
+LDR 01 111 0 00 10 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=0 sz=1
|
|
|
|
+LDR 10 111 0 00 10 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=0 sz=2
|
|
|
|
+LDR 00 111 0 00 11 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=1 sz=0
|
|
|
|
+LDR 01 111 0 00 11 1 ..... ... . 10 ..... ..... @ldst sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+# PRFM
|
|
|
|
+NOP 11 111 0 00 10 1 ----- -1- - 10 ----- -----
|
|
|
|
+
|
|
|
|
+STR_v sz:2 111 1 00 00 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0
|
|
|
|
+STR_v 00 111 1 00 10 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0 sz=4
|
|
|
|
+LDR_v sz:2 111 1 00 01 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0
|
|
|
|
+LDR_v 00 111 1 00 11 1 ..... ... . 10 ..... ..... @ldst sign=0 ext=0 sz=4
|
|
|
|
+
|
|
|
|
+# Atomic memory operations
|
|
|
|
+&atomic rs rn rt a r sz
|
|
|
|
+@atomic sz:2 ... . .. a:1 r:1 . rs:5 . ... .. rn:5 rt:5 &atomic
|
|
|
|
+LDADD .. 111 0 00 . . 1 ..... 0000 00 ..... ..... @atomic
|
|
|
|
+LDCLR .. 111 0 00 . . 1 ..... 0001 00 ..... ..... @atomic
|
|
|
|
+LDEOR .. 111 0 00 . . 1 ..... 0010 00 ..... ..... @atomic
|
|
|
|
+LDSET .. 111 0 00 . . 1 ..... 0011 00 ..... ..... @atomic
|
|
|
|
+LDSMAX .. 111 0 00 . . 1 ..... 0100 00 ..... ..... @atomic
|
|
|
|
+LDSMIN .. 111 0 00 . . 1 ..... 0101 00 ..... ..... @atomic
|
|
|
|
+LDUMAX .. 111 0 00 . . 1 ..... 0110 00 ..... ..... @atomic
|
|
|
|
+LDUMIN .. 111 0 00 . . 1 ..... 0111 00 ..... ..... @atomic
|
|
|
|
+SWP .. 111 0 00 . . 1 ..... 1000 00 ..... ..... @atomic
|
|
|
|
+
|
|
|
|
+LDAPR sz:2 111 0 00 1 0 1 11111 1100 00 rn:5 rt:5
|
|
|
|
+
|
|
|
|
+# Load/store register (pointer authentication)
|
|
|
|
+
|
|
|
|
+# LDRA immediate is 10 bits signed and scaled, but the bits aren't all contiguous
|
|
|
|
+%ldra_imm 22:s1 12:9 !function=times_2
|
|
|
|
+
|
|
|
|
+LDRA 11 111 0 00 m:1 . 1 ......... w:1 1 rn:5 rt:5 imm=%ldra_imm
|
|
|
|
+
|
|
|
|
+&ldapr_stlr_i rn rt imm sz sign ext
|
|
|
|
+@ldapr_stlr_i .. ...... .. . imm:9 .. rn:5 rt:5 &ldapr_stlr_i
|
|
|
|
+STLR_i sz:2 011001 00 0 ......... 00 ..... ..... @ldapr_stlr_i sign=0 ext=0
|
|
|
|
+LDAPR_i sz:2 011001 01 0 ......... 00 ..... ..... @ldapr_stlr_i sign=0 ext=0
|
|
|
|
+LDAPR_i 00 011001 10 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=0 sz=0
|
|
|
|
+LDAPR_i 01 011001 10 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=0 sz=1
|
|
|
|
+LDAPR_i 10 011001 10 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=0 sz=2
|
|
|
|
+LDAPR_i 00 011001 11 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=1 sz=0
|
|
|
|
+LDAPR_i 01 011001 11 0 ......... 00 ..... ..... @ldapr_stlr_i sign=1 ext=1 sz=1
|
|
|
|
+
|
|
|
|
+# Load/store multiple structures
|
|
|
|
+# The 4-bit opcode in [15:12] encodes repeat count and structure elements
|
|
|
|
+&ldst_mult rm rn rt sz q p rpt selem
|
|
|
|
+@ldst_mult . q:1 ...... p:1 . . rm:5 .... sz:2 rn:5 rt:5 &ldst_mult
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 0000 .. ..... ..... @ldst_mult rpt=1 selem=4
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 0010 .. ..... ..... @ldst_mult rpt=4 selem=1
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 0100 .. ..... ..... @ldst_mult rpt=1 selem=3
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 0110 .. ..... ..... @ldst_mult rpt=3 selem=1
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 0111 .. ..... ..... @ldst_mult rpt=1 selem=1
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 1000 .. ..... ..... @ldst_mult rpt=1 selem=2
|
|
|
|
+ST_mult 0 . 001100 . 0 0 ..... 1010 .. ..... ..... @ldst_mult rpt=2 selem=1
|
|
|
|
+
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 0000 .. ..... ..... @ldst_mult rpt=1 selem=4
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 0010 .. ..... ..... @ldst_mult rpt=4 selem=1
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 0100 .. ..... ..... @ldst_mult rpt=1 selem=3
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 0110 .. ..... ..... @ldst_mult rpt=3 selem=1
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 0111 .. ..... ..... @ldst_mult rpt=1 selem=1
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 1000 .. ..... ..... @ldst_mult rpt=1 selem=2
|
|
|
|
+LD_mult 0 . 001100 . 1 0 ..... 1010 .. ..... ..... @ldst_mult rpt=2 selem=1
|
|
|
|
+
|
|
|
|
+# Load/store single structure
|
|
|
|
+&ldst_single rm rn rt p selem index scale
|
|
|
|
+
|
|
|
|
+%ldst_single_selem 13:1 21:1 !function=plus_1
|
|
|
|
+
|
|
|
|
+%ldst_single_index_b 30:1 10:3
|
|
|
|
+%ldst_single_index_h 30:1 11:2
|
|
|
|
+%ldst_single_index_s 30:1 12:1
|
|
|
|
+
|
|
|
|
+@ldst_single_b .. ...... p:1 .. rm:5 ...... rn:5 rt:5 \
|
|
|
|
+ &ldst_single scale=0 selem=%ldst_single_selem \
|
|
|
|
+ index=%ldst_single_index_b
|
|
|
|
+@ldst_single_h .. ...... p:1 .. rm:5 ...... rn:5 rt:5 \
|
|
|
|
+ &ldst_single scale=1 selem=%ldst_single_selem \
|
|
|
|
+ index=%ldst_single_index_h
|
|
|
|
+@ldst_single_s .. ...... p:1 .. rm:5 ...... rn:5 rt:5 \
|
|
|
|
+ &ldst_single scale=2 selem=%ldst_single_selem \
|
|
|
|
+ index=%ldst_single_index_s
|
|
|
|
+@ldst_single_d . index:1 ...... p:1 .. rm:5 ...... rn:5 rt:5 \
|
|
|
|
+ &ldst_single scale=3 selem=%ldst_single_selem
|
|
|
|
+
|
|
|
|
+ST_single 0 . 001101 . 0 . ..... 00 . ... ..... ..... @ldst_single_b
|
|
|
|
+ST_single 0 . 001101 . 0 . ..... 01 . ..0 ..... ..... @ldst_single_h
|
|
|
|
+ST_single 0 . 001101 . 0 . ..... 10 . .00 ..... ..... @ldst_single_s
|
|
|
|
+ST_single 0 . 001101 . 0 . ..... 10 . 001 ..... ..... @ldst_single_d
|
|
|
|
+
|
|
|
|
+LD_single 0 . 001101 . 1 . ..... 00 . ... ..... ..... @ldst_single_b
|
|
|
|
+LD_single 0 . 001101 . 1 . ..... 01 . ..0 ..... ..... @ldst_single_h
|
|
|
|
+LD_single 0 . 001101 . 1 . ..... 10 . .00 ..... ..... @ldst_single_s
|
|
|
|
+LD_single 0 . 001101 . 1 . ..... 10 . 001 ..... ..... @ldst_single_d
|
|
|
|
+
|
|
|
|
+# Replicating load case
|
|
|
|
+LD_single_repl 0 q:1 001101 p:1 1 . rm:5 11 . 0 scale:2 rn:5 rt:5 selem=%ldst_single_selem
|
|
|
|
+
|
|
|
|
+%tag_offset 12:s9 !function=scale_by_log2_tag_granule
|
|
|
|
+&ldst_tag rn rt imm p w
|
|
|
|
+@ldst_tag ........ .. . ......... .. rn:5 rt:5 &ldst_tag imm=%tag_offset
|
|
|
|
+@ldst_tag_mult ........ .. . 000000000 .. rn:5 rt:5 &ldst_tag imm=0
|
|
|
|
+
|
|
|
|
+STZGM 11011001 00 1 ......... 00 ..... ..... @ldst_tag_mult p=0 w=0
|
|
|
|
+STG 11011001 00 1 ......... 01 ..... ..... @ldst_tag p=1 w=1
|
|
|
|
+STG 11011001 00 1 ......... 10 ..... ..... @ldst_tag p=0 w=0
|
|
|
|
+STG 11011001 00 1 ......... 11 ..... ..... @ldst_tag p=0 w=1
|
|
|
|
+
|
|
|
|
+LDG 11011001 01 1 ......... 00 ..... ..... @ldst_tag p=0 w=0
|
|
|
|
+STZG 11011001 01 1 ......... 01 ..... ..... @ldst_tag p=1 w=1
|
|
|
|
+STZG 11011001 01 1 ......... 10 ..... ..... @ldst_tag p=0 w=0
|
|
|
|
+STZG 11011001 01 1 ......... 11 ..... ..... @ldst_tag p=0 w=1
|
|
|
|
+
|
|
|
|
+STGM 11011001 10 1 ......... 00 ..... ..... @ldst_tag_mult p=0 w=0
|
|
|
|
+ST2G 11011001 10 1 ......... 01 ..... ..... @ldst_tag p=1 w=1
|
|
|
|
+ST2G 11011001 10 1 ......... 10 ..... ..... @ldst_tag p=0 w=0
|
|
|
|
+ST2G 11011001 10 1 ......... 11 ..... ..... @ldst_tag p=0 w=1
|
|
|
|
+
|
|
|
|
+LDGM 11011001 11 1 ......... 00 ..... ..... @ldst_tag_mult p=0 w=0
|
|
|
|
+STZ2G 11011001 11 1 ......... 01 ..... ..... @ldst_tag p=1 w=1
|
|
|
|
+STZ2G 11011001 11 1 ......... 10 ..... ..... @ldst_tag p=0 w=0
|
|
|
|
+STZ2G 11011001 11 1 ......... 11 ..... ..... @ldst_tag p=0 w=1
|