summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aarch64/mono/demo/aarch64_no_vector/decode.sail (renamed from aarch64/mono/demo/aarch64_no_vector/aarch64_no_vector_decode.sail)212
-rw-r--r--aarch64/mono/demo/aarch64_no_vector/spec.sail (renamed from aarch64/mono/demo/aarch64_no_vector/aarch64_no_vector.sail)447
-rwxr-xr-xaarch64/mono/demo/mk4
-rw-r--r--src/monomorphise.ml10
4 files changed, 328 insertions, 345 deletions
diff --git a/aarch64/mono/demo/aarch64_no_vector/aarch64_no_vector_decode.sail b/aarch64/mono/demo/aarch64_no_vector/decode.sail
index a37b064a..e881207a 100644
--- a/aarch64/mono/demo/aarch64_no_vector/aarch64_no_vector_decode.sail
+++ b/aarch64/mono/demo/aarch64_no_vector/decode.sail
@@ -1,4 +1,4 @@
-function clause decode 0b10011011 @ _ : bits(1) @ 0b10 @ _ : bits(5) @ 0b0 @ _ : bits(15) as op_code = {
+function clause decode (0b10011011 @ _ : bits(1) @ 0b10 @ _ : bits(5) @ 0b0 @ _ : bits(15) as op_code) = {
sf : bits(1) = [op_code[31]];
op54 : bits(2) = op_code[30 .. 29];
U : bits(1) = [op_code[23]];
@@ -10,7 +10,7 @@ function clause decode 0b10011011 @ _ : bits(1) @ 0b10 @ _ : bits(5) @ 0b0 @ _ :
integer_arithmetic_mul_widening_64128hi_decode(sf, op54, U, Rm, o0, Ra, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b1010001 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1010001 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -21,7 +21,7 @@ function clause decode _ : bits(2) @ 0b1010001 @ _ : bits(23) as op_code = {
memory_pair_general_postidx_aarch64_memory_pair_general_postidx__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b1010011 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1010011 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -32,7 +32,7 @@ function clause decode _ : bits(2) @ 0b1010011 @ _ : bits(23) as op_code = {
memory_pair_general_preidx_aarch64_memory_pair_general_postidx__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b1010010 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1010010 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -43,7 +43,7 @@ function clause decode _ : bits(2) @ 0b1010010 @ _ : bits(23) as op_code = {
memory_pair_general_offset_aarch64_memory_pair_general_postidx__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b10 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b10 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -55,7 +55,7 @@ function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b1 @ _ : bits(9)
memory_single_simdfp_register_aarch64_memory_single_simdfp_register__decode(size, V, opc, Rm, option_name, S, Rn, Rt)
}
-function clause decode 0b00011111 @ _ : bits(24) as op_code = {
+function clause decode (0b00011111 @ _ : bits(24) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -68,7 +68,7 @@ function clause decode 0b00011111 @ _ : bits(24) as op_code = {
float_arithmetic_mul_addsub_decode(M, S, typ, o1, Rm, o0, Ra, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b0 @ _ : bits(3) @ 0b00 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b0 @ _ : bits(3) @ 0b00 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
A : bits(1) = [op_code[23]];
@@ -81,7 +81,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(5)
memory_atomicops_ld_decode(size, V, A, R, Rs, o3, opc, Rn, Rt)
}
-function clause decode 0b110110101100000101000 @ _ : bits(11) as op_code = {
+function clause decode (0b110110101100000101000 @ _ : bits(11) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -91,7 +91,7 @@ function clause decode 0b110110101100000101000 @ _ : bits(11) as op_code = {
integer_pac_strip_dp_1src_decode(sf, S, opcode2, D, Rn, Rd)
}
-function clause decode 0b11010101000000110010000011111111 as op_code = {
+function clause decode (0b11010101000000110010000011111111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -102,7 +102,7 @@ function clause decode 0b11010101000000110010000011111111 as op_code = {
integer_pac_strip_hint_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b010 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b010 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -112,7 +112,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b010 @ _ : bits(10)
integer_pac_pacda_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode 0b11010101000000110011 @ _ : bits(4) @ 0b01011111 as op_code = {
+function clause decode (0b11010101000000110011 @ _ : bits(4) @ 0b01011111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -123,7 +123,7 @@ function clause decode 0b11010101000000110011 @ _ : bits(4) @ 0b01011111 as op_c
system_monitors_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b00 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b00 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -133,7 +133,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_general_immediate_signed_offset_normal_aarch64_memory_single_general_immediate_signed_offset_normal__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b1010000 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1010000 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -144,7 +144,7 @@ function clause decode _ : bits(2) @ 0b1010000 @ _ : bits(23) as op_code = {
memory_pair_general_noalloc_aarch64_memory_pair_general_noalloc__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(6) @ 0b00010 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(6) @ 0b00010 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -155,7 +155,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(6) @ 0b00010 @
float_arithmetic_mul_product_decode(M, S, typ, Rm, op, Rn, Rd)
}
-function clause decode 0b10011010110 @ _ : bits(5) @ 0b001100 @ _ : bits(10) as op_code = {
+function clause decode (0b10011010110 @ _ : bits(5) @ 0b001100 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -166,7 +166,7 @@ function clause decode 0b10011010110 @ _ : bits(5) @ 0b001100 @ _ : bits(10) as
integer_pac_pacga_dp_2src_decode(sf, op, S, Rm, opcode2, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b0010001 @ _ : bits(1) @ 0b1 @ _ : bits(6) @ 0b11111 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b0010001 @ _ : bits(1) @ 0b1 @ _ : bits(6) @ 0b11111 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
o2 : bits(1) = [op_code[23]];
L : bits(1) = [op_code[22]];
@@ -179,7 +179,7 @@ function clause decode _ : bits(2) @ 0b0010001 @ _ : bits(1) @ 0b1 @ _ : bits(6)
memory_atomicops_cas_single_decode(size, o2, L, o1, Rs, o0, Rt2, Rn, Rt)
}
-function clause decode 0b1101010100000 @ _ : bits(3) @ 0b0100 @ _ : bits(7) @ 0b11111 as op_code = {
+function clause decode (0b1101010100000 @ _ : bits(3) @ 0b0100 @ _ : bits(7) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -190,7 +190,7 @@ function clause decode 0b1101010100000 @ _ : bits(3) @ 0b0100 @ _ : bits(7) @ 0b
system_register_cpsr_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode 0b01010100 @ _ : bits(19) @ 0b0 @ _ : bits(4) as op_code = {
+function clause decode (0b01010100 @ _ : bits(19) @ 0b0 @ _ : bits(4) as op_code) = {
o1 : bits(1) = [op_code[24]];
imm19 : bits(19) = op_code[23 .. 5];
o0 : bits(1) = [op_code[4]];
@@ -198,7 +198,7 @@ function clause decode 0b01010100 @ _ : bits(19) @ 0b0 @ _ : bits(4) as op_code
branch_conditional_cond_decode(o1, imm19, o0, cond)
}
-function clause decode 0b11010100000 @ _ : bits(16) @ 0b00010 as op_code = {
+function clause decode (0b11010100000 @ _ : bits(16) @ 0b00010 as op_code) = {
opc : bits(3) = op_code[23 .. 21];
imm16 : bits(16) = op_code[20 .. 5];
op2 : bits(3) = op_code[4 .. 2];
@@ -206,7 +206,7 @@ function clause decode 0b11010100000 @ _ : bits(16) @ 0b00010 as op_code = {
system_exceptions_runtime_hvc_decode(opc, imm16, op2, LL)
}
-function clause decode 0b1 @ _ : bits(1) @ 0b0010000 @ _ : bits(1) @ 0b1 @ _ : bits(21) as op_code = {
+function clause decode (0b1 @ _ : bits(1) @ 0b0010000 @ _ : bits(1) @ 0b1 @ _ : bits(21) as op_code) = {
sz : bits(1) = [op_code[30]];
o2 : bits(1) = [op_code[23]];
L : bits(1) = [op_code[22]];
@@ -219,7 +219,7 @@ function clause decode 0b1 @ _ : bits(1) @ 0b0010000 @ _ : bits(1) @ 0b1 @ _ : b
memory_exclusive_pair_decode(sz, o2, L, o1, Rs, o0, Rt2, Rn, Rt)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b111 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b111 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -229,7 +229,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b111 @ _ : bits(10)
integer_pac_autdb_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode _ : bits(1) @ 0b101101011000000000000 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(1) @ 0b101101011000000000000 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -238,7 +238,7 @@ function clause decode _ : bits(1) @ 0b101101011000000000000 @ _ : bits(10) as o
integer_arithmetic_rbit_decode(sf, S, opcode2, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111001 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(2) @ 0b111001 @ _ : bits(24) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -248,7 +248,7 @@ function clause decode _ : bits(2) @ 0b111001 @ _ : bits(24) as op_code = {
memory_single_general_immediate_unsigned_aarch64_memory_single_general_immediate_unsigned__decode(size, V, opc, imm12, Rn, Rt)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b100 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b100 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -258,7 +258,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b100 @ _ : bits(10)
integer_pac_autia_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code = {
+function clause decode (0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -269,7 +269,7 @@ function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code
integer_pac_autia_hint_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode 0b11010100000 @ _ : bits(16) @ 0b00001 as op_code = {
+function clause decode (0b11010100000 @ _ : bits(16) @ 0b00001 as op_code) = {
opc : bits(3) = op_code[23 .. 21];
imm16 : bits(16) = op_code[20 .. 5];
op2 : bits(3) = op_code[4 .. 2];
@@ -277,7 +277,7 @@ function clause decode 0b11010100000 @ _ : bits(16) @ 0b00001 as op_code = {
system_exceptions_runtime_svc_decode(opc, imm16, op2, LL)
}
-function clause decode 0b1101011 @ _ : bits(1) @ 0b0 @ _ : bits(2) @ 0b111110000 @ _ : bits(12) as op_code = {
+function clause decode (0b1101011 @ _ : bits(1) @ 0b0 @ _ : bits(2) @ 0b111110000 @ _ : bits(12) as op_code) = {
Z : bits(1) = [op_code[24]];
opc : bits(1) = [op_code[23]];
op : bits(2) = op_code[22 .. 21];
@@ -290,7 +290,7 @@ function clause decode 0b1101011 @ _ : bits(1) @ 0b0 @ _ : bits(2) @ 0b111110000
branch_unconditional_register_decode(Z, opc, op, op2, op3, A, M, Rn, Rm)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(8) @ 0b10000000 @ _ : bits(5) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(8) @ 0b10000000 @ _ : bits(5) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -300,7 +300,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(8) @ 0b10000000
float_move_fp_imm_decode(M, S, typ, imm8, imm5, Rd)
}
-function clause decode _ : bits(1) @ 0b011011 @ _ : bits(25) as op_code = {
+function clause decode (_ : bits(1) @ 0b011011 @ _ : bits(25) as op_code) = {
b5 : bits(1) = [op_code[31]];
op : bits(1) = [op_code[24]];
b40 : bits(5) = op_code[23 .. 19];
@@ -309,7 +309,7 @@ function clause decode _ : bits(1) @ 0b011011 @ _ : bits(25) as op_code = {
branch_conditional_test_decode(b5, op, b40, imm14, Rt)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b01 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b01 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -319,7 +319,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_general_immediate_signed_postidx_aarch64_memory_single_general_immediate_signed_postidx__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b11 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b11 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -329,7 +329,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_general_immediate_signed_preidx_aarch64_memory_single_general_immediate_signed_postidx__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111001 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(2) @ 0b111001 @ _ : bits(24) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -339,7 +339,7 @@ function clause decode _ : bits(2) @ 0b111001 @ _ : bits(24) as op_code = {
memory_single_general_immediate_unsigned_aarch64_memory_single_general_immediate_signed_postidx__decode(size, V, opc, imm12, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b011000 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(2) @ 0b011000 @ _ : bits(24) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
imm19 : bits(19) = op_code[23 .. 5];
@@ -347,7 +347,7 @@ function clause decode _ : bits(2) @ 0b011000 @ _ : bits(24) as op_code = {
memory_literal_general_decode(opc, V, imm19, Rt)
}
-function clause decode _ : bits(2) @ 0b1011001 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1011001 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -358,7 +358,7 @@ function clause decode _ : bits(2) @ 0b1011001 @ _ : bits(23) as op_code = {
memory_pair_simdfp_postidx_aarch64_memory_pair_simdfp_postidx__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b1011011 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1011011 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -369,7 +369,7 @@ function clause decode _ : bits(2) @ 0b1011011 @ _ : bits(23) as op_code = {
memory_pair_simdfp_preidx_aarch64_memory_pair_simdfp_postidx__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b1011010 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1011010 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -380,7 +380,7 @@ function clause decode _ : bits(2) @ 0b1011010 @ _ : bits(23) as op_code = {
memory_pair_simdfp_offset_aarch64_memory_pair_simdfp_postidx__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode _ : bits(1) @ 0b011010 @ _ : bits(25) as op_code = {
+function clause decode (_ : bits(1) @ 0b011010 @ _ : bits(25) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[24]];
imm19 : bits(19) = op_code[23 .. 5];
@@ -388,7 +388,7 @@ function clause decode _ : bits(1) @ 0b011010 @ _ : bits(25) as op_code = {
branch_conditional_compare_decode(sf, op, imm19, Rt)
}
-function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b00 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b00 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -398,7 +398,7 @@ function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_simdfp_immediate_signed_offset_normal_aarch64_memory_single_simdfp_immediate_signed_offset_normal__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b001 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b001 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -408,7 +408,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b001 @ _ : bits(10)
integer_pac_pacib_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code = {
+function clause decode (0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -419,7 +419,7 @@ function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code
integer_pac_pacib_hint_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b01 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b01 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -429,7 +429,7 @@ function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_simdfp_immediate_signed_postidx_aarch64_memory_single_simdfp_immediate_signed_postidx__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b11 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b11 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -439,7 +439,7 @@ function clause decode _ : bits(2) @ 0b111100 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_simdfp_immediate_signed_preidx_aarch64_memory_single_simdfp_immediate_signed_postidx__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111101 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(2) @ 0b111101 @ _ : bits(24) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -449,7 +449,7 @@ function clause decode _ : bits(2) @ 0b111101 @ _ : bits(24) as op_code = {
memory_single_simdfp_immediate_unsigned_aarch64_memory_single_simdfp_immediate_signed_postidx__decode(size, V, opc, imm12, Rn, Rt)
}
-function clause decode 0b0 @ _ : bits(1) @ 0b0011000 @ _ : bits(1) @ 0b000000 @ _ : bits(16) as op_code = {
+function clause decode (0b0 @ _ : bits(1) @ 0b0011000 @ _ : bits(1) @ 0b000000 @ _ : bits(16) as op_code) = {
Q : bits(1) = [op_code[30]];
L : bits(1) = [op_code[22]];
opcode : bits(4) = op_code[15 .. 12];
@@ -459,7 +459,7 @@ function clause decode 0b0 @ _ : bits(1) @ 0b0011000 @ _ : bits(1) @ 0b000000 @
memory_vector_multiple_nowb_aarch64_memory_vector_multiple_nowb__decode(Q, L, opcode, size, Rn, Rt)
}
-function clause decode 0b0 @ _ : bits(1) @ 0b0011001 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code = {
+function clause decode (0b0 @ _ : bits(1) @ 0b0011001 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code) = {
Q : bits(1) = [op_code[30]];
L : bits(1) = [op_code[22]];
Rm : bits(5) = op_code[20 .. 16];
@@ -470,7 +470,7 @@ function clause decode 0b0 @ _ : bits(1) @ 0b0011001 @ _ : bits(1) @ 0b0 @ _ : b
memory_vector_multiple_postinc_aarch64_memory_vector_multiple_nowb__decode(Q, L, Rm, opcode, size, Rn, Rt)
}
-function clause decode 0b11010110100111110000 @ _ : bits(12) as op_code = {
+function clause decode (0b11010110100111110000 @ _ : bits(12) as op_code) = {
opc : bits(4) = op_code[24 .. 21];
op2 : bits(5) = op_code[20 .. 16];
op3 : bits(4) = op_code[15 .. 12];
@@ -481,7 +481,7 @@ function clause decode 0b11010110100111110000 @ _ : bits(12) as op_code = {
branch_unconditional_eret_decode(opc, op2, op3, A, M, Rn, op4)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b01 @ _ : bits(2) @ 0b10 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b01 @ _ : bits(2) @ 0b10 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -492,7 +492,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b01 @ _ :
float_arithmetic_maxmin_decode(M, S, typ, Rm, op, Rn, Rd)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b10000 @ _ : bits(2) @ 0b10000 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b10000 @ _ : bits(2) @ 0b10000 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -502,7 +502,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b10000 @ _ : bits(2) @ 0b1000
float_arithmetic_unary_decode(M, S, typ, opc, Rn, Rd)
}
-function clause decode 0b11010100000 @ _ : bits(16) @ 0b00011 as op_code = {
+function clause decode (0b11010100000 @ _ : bits(16) @ 0b00011 as op_code) = {
opc : bits(3) = op_code[23 .. 21];
imm16 : bits(16) = op_code[20 .. 5];
op2 : bits(3) = op_code[4 .. 2];
@@ -510,7 +510,7 @@ function clause decode 0b11010100000 @ _ : bits(16) @ 0b00011 as op_code = {
system_exceptions_runtime_smc_decode(opc, imm16, op2, LL)
}
-function clause decode _ : bits(2) @ 0b0010001 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(2) @ 0b0010001 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code) = {
size : bits(2) = op_code[31 .. 30];
o2 : bits(1) = [op_code[23]];
L : bits(1) = [op_code[22]];
@@ -523,7 +523,7 @@ function clause decode _ : bits(2) @ 0b0010001 @ _ : bits(1) @ 0b0 @ _ : bits(21
memory_ordered_decode(size, o2, L, o1, Rs, o0, Rt2, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b10 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b10 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -535,7 +535,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(9)
memory_single_general_register_aarch64_memory_single_general_register__decode(size, V, opc, Rm, option_name, S, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b1011000 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(2) @ 0b1011000 @ _ : bits(23) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
L : bits(1) = [op_code[22]];
@@ -546,7 +546,7 @@ function clause decode _ : bits(2) @ 0b1011000 @ _ : bits(23) as op_code = {
memory_pair_simdfp_noalloc_aarch64_memory_pair_simdfp_noalloc__decode(opc, V, L, imm7, Rt2, Rn, Rt)
}
-function clause decode 0b11010100001 @ _ : bits(16) @ 0b00000 as op_code = {
+function clause decode (0b11010100001 @ _ : bits(16) @ 0b00000 as op_code) = {
opc : bits(3) = op_code[23 .. 21];
imm16 : bits(16) = op_code[20 .. 5];
op2 : bits(3) = op_code[4 .. 2];
@@ -554,7 +554,7 @@ function clause decode 0b11010100001 @ _ : bits(16) @ 0b00000 as op_code = {
system_exceptions_debug_breakpoint_decode(opc, imm16, op2, LL)
}
-function clause decode _ : bits(1) @ 0b0011011000 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(1) @ 0b0011011000 @ _ : bits(21) as op_code) = {
sf : bits(1) = [op_code[31]];
op54 : bits(2) = op_code[30 .. 29];
op31 : bits(3) = op_code[23 .. 21];
@@ -566,7 +566,7 @@ function clause decode _ : bits(1) @ 0b0011011000 @ _ : bits(21) as op_code = {
integer_arithmetic_mul_uniform_addsub_decode(sf, op54, op31, Rm, o0, Ra, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b011100 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(2) @ 0b011100 @ _ : bits(24) as op_code) = {
opc : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
imm19 : bits(19) = op_code[23 .. 5];
@@ -574,7 +574,7 @@ function clause decode _ : bits(2) @ 0b011100 @ _ : bits(24) as op_code = {
memory_literal_simdfp_decode(opc, V, imm19, Rt)
}
-function clause decode 0b1101010100 @ _ : bits(1) @ 0b01 @ _ : bits(19) as op_code = {
+function clause decode (0b1101010100 @ _ : bits(1) @ 0b01 @ _ : bits(19) as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -585,7 +585,7 @@ function clause decode 0b1101010100 @ _ : bits(1) @ 0b01 @ _ : bits(19) as op_co
system_sysops_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode _ : bits(3) @ 0b01011 @ _ : bits(2) @ 0b0 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(3) @ 0b01011 @ _ : bits(2) @ 0b0 @ _ : bits(21) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -597,7 +597,7 @@ function clause decode _ : bits(3) @ 0b01011 @ _ : bits(2) @ 0b0 @ _ : bits(21)
integer_arithmetic_addsub_shiftedreg_decode(sf, op, S, shift, Rm, imm6, Rn, Rd)
}
-function clause decode _ : bits(3) @ 0b100100 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(3) @ 0b100100 @ _ : bits(23) as op_code) = {
sf : bits(1) = [op_code[31]];
opc : bits(2) = op_code[30 .. 29];
N : bits(1) = [op_code[22]];
@@ -608,7 +608,7 @@ function clause decode _ : bits(3) @ 0b100100 @ _ : bits(23) as op_code = {
integer_logical_immediate_decode(sf, opc, N, immr, imms, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111010010 @ _ : bits(9) @ 0b00 @ _ : bits(5) @ 0b0 @ _ : bits(4) as op_code = {
+function clause decode (_ : bits(2) @ 0b111010010 @ _ : bits(9) @ 0b00 @ _ : bits(5) @ 0b0 @ _ : bits(4) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -621,7 +621,7 @@ function clause decode _ : bits(2) @ 0b111010010 @ _ : bits(9) @ 0b00 @ _ : bits
integer_conditional_compare_register_decode(sf, op, S, Rm, cond, o2, Rn, o3, nzcv)
}
-function clause decode _ : bits(3) @ 0b100110 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(3) @ 0b100110 @ _ : bits(23) as op_code) = {
sf : bits(1) = [op_code[31]];
opc : bits(2) = op_code[30 .. 29];
N : bits(1) = [op_code[22]];
@@ -632,7 +632,7 @@ function clause decode _ : bits(3) @ 0b100110 @ _ : bits(23) as op_code = {
integer_bitfield_decode(sf, opc, N, immr, imms, Rn, Rd)
}
-function clause decode 0b1101010100 @ _ : bits(1) @ 0b1 @ _ : bits(20) as op_code = {
+function clause decode (0b1101010100 @ _ : bits(1) @ 0b1 @ _ : bits(20) as op_code) = {
L : bits(1) = [op_code[21]];
o0 : bits(1) = [op_code[19]];
op1 : bits(3) = op_code[18 .. 16];
@@ -643,7 +643,7 @@ function clause decode 0b1101010100 @ _ : bits(1) @ 0b1 @ _ : bits(20) as op_cod
system_register_system_decode(L, o0, op1, CRn, CRm, op2, Rt)
}
-function clause decode _ : bits(2) @ 0b111010010 @ _ : bits(9) @ 0b10 @ _ : bits(5) @ 0b0 @ _ : bits(4) as op_code = {
+function clause decode (_ : bits(2) @ 0b111010010 @ _ : bits(9) @ 0b10 @ _ : bits(5) @ 0b0 @ _ : bits(4) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -656,7 +656,7 @@ function clause decode _ : bits(2) @ 0b111010010 @ _ : bits(9) @ 0b10 @ _ : bits
integer_conditional_compare_immediate_decode(sf, op, S, imm5, cond, o2, Rn, o3, nzcv)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b000110 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b000110 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -666,7 +666,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b000110 @
float_arithmetic_div_decode(M, S, typ, Rm, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b100000 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b100000 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
A : bits(1) = [op_code[23]];
@@ -679,7 +679,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(5)
memory_atomicops_swp_decode(size, V, A, R, Rs, o3, opc, Rn, Rt)
}
-function clause decode _ : bits(3) @ 0b10001 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(3) @ 0b10001 @ _ : bits(24) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -690,13 +690,13 @@ function clause decode _ : bits(3) @ 0b10001 @ _ : bits(24) as op_code = {
integer_arithmetic_addsub_immediate_decode(sf, op, S, shift, imm12, Rn, Rd)
}
-function clause decode _ : bits(1) @ 0b00101 @ _ : bits(26) as op_code = {
+function clause decode (_ : bits(1) @ 0b00101 @ _ : bits(26) as op_code) = {
op : bits(1) = [op_code[31]];
imm26 : bits(26) = op_code[25 .. 0];
branch_unconditional_immediate_decode(op, imm26)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b110 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b110 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -706,7 +706,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b110 @ _ : bits(10)
integer_pac_autda_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode _ : bits(1) @ 0b10110101100000000010 @ _ : bits(11) as op_code = {
+function clause decode (_ : bits(1) @ 0b10110101100000000010 @ _ : bits(11) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -716,7 +716,7 @@ function clause decode _ : bits(1) @ 0b10110101100000000010 @ _ : bits(11) as op
integer_arithmetic_cnt_decode(sf, S, opcode2, op, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111 @ _ : bits(1) @ 0b00 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b00 @ _ : bits(5) @ 0b11111 as op_code = {
+function clause decode (_ : bits(2) @ 0b111 @ _ : bits(1) @ 0b00 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b00 @ _ : bits(5) @ 0b11111 as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
A : bits(1) = [op_code[23]];
@@ -729,7 +729,7 @@ function clause decode _ : bits(2) @ 0b111 @ _ : bits(1) @ 0b00 @ _ : bits(2) @
memory_atomicops_st_decode(size, V, A, R, Rs, o3, opc, Rn, Rt)
}
-function clause decode 0b11010101000000110011 @ _ : bits(4) @ 0b1 @ _ : bits(2) @ 0b11111 as op_code = {
+function clause decode (0b11010101000000110011 @ _ : bits(4) @ 0b1 @ _ : bits(2) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -740,7 +740,7 @@ function clause decode 0b11010101000000110011 @ _ : bits(4) @ 0b1 @ _ : bits(2)
system_barriers_decode(L, op0, op1, CRn, CRm, opc, Rt)
}
-function clause decode 0b0 @ _ : bits(1) @ 0b0010000 @ _ : bits(1) @ 0b1 @ _ : bits(21) as op_code = {
+function clause decode (0b0 @ _ : bits(1) @ 0b0010000 @ _ : bits(1) @ 0b1 @ _ : bits(21) as op_code) = {
sz : bits(1) = [op_code[30]];
o2 : bits(1) = [op_code[23]];
L : bits(1) = [op_code[22]];
@@ -753,7 +753,7 @@ function clause decode 0b0 @ _ : bits(1) @ 0b0010000 @ _ : bits(1) @ 0b1 @ _ : b
memory_atomicops_cas_pair_decode(sz, o2, L, o1, Rs, o0, Rt2, Rn, Rt)
}
-function clause decode _ : bits(3) @ 0b100101 @ _ : bits(23) as op_code = {
+function clause decode (_ : bits(3) @ 0b100101 @ _ : bits(23) as op_code) = {
sf : bits(1) = [op_code[31]];
opc : bits(2) = op_code[30 .. 29];
hw : bits(2) = op_code[22 .. 21];
@@ -762,7 +762,7 @@ function clause decode _ : bits(3) @ 0b100101 @ _ : bits(23) as op_code = {
integer_insext_insert_movewide_decode(sf, opc, hw, imm16, Rd)
}
-function clause decode 0b11010110101111110000001111100000 as op_code = {
+function clause decode (0b11010110101111110000001111100000 as op_code) = {
opc : bits(4) = op_code[24 .. 21];
op2 : bits(5) = op_code[20 .. 16];
op3 : bits(6) = op_code[15 .. 10];
@@ -771,7 +771,7 @@ function clause decode 0b11010110101111110000001111100000 as op_code = {
branch_unconditional_dret_decode(opc, op2, op3, Rt, op4)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b11 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b11 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -782,7 +782,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b11 @ _ :
float_move_fp_select_decode(M, S, typ, Rm, cond, Rn, Rd)
}
-function clause decode 0b11010100101 @ _ : bits(16) @ 0b000 @ _ : bits(2) as op_code = {
+function clause decode (0b11010100101 @ _ : bits(16) @ 0b000 @ _ : bits(2) as op_code) = {
opc : bits(3) = op_code[23 .. 21];
imm16 : bits(16) = op_code[20 .. 5];
op2 : bits(3) = op_code[4 .. 2];
@@ -790,7 +790,7 @@ function clause decode 0b11010100101 @ _ : bits(16) @ 0b000 @ _ : bits(2) as op_
system_exceptions_debug_exception_decode(opc, imm16, op2, LL)
}
-function clause decode _ : bits(1) @ 0b1011010110000000000 @ _ : bits(12) as op_code = {
+function clause decode (_ : bits(1) @ 0b1011010110000000000 @ _ : bits(12) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -800,7 +800,7 @@ function clause decode _ : bits(1) @ 0b1011010110000000000 @ _ : bits(12) as op_
integer_arithmetic_rev_decode(sf, S, opcode2, opc, Rn, Rd)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b10001 @ _ : bits(2) @ 0b10000 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b10001 @ _ : bits(2) @ 0b10000 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -810,7 +810,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b10001 @ _ : bits(2) @ 0b1000
float_convert_fp_decode(M, S, typ, opc, Rn, Rd)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b000 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b000 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -820,7 +820,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b000 @ _ : bits(10)
integer_pac_pacia_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code = {
+function clause decode (0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -831,7 +831,7 @@ function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code
integer_pac_pacia_hint_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode _ : bits(1) @ 0b0011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b000000 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(1) @ 0b0011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b000000 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -842,7 +842,7 @@ function clause decode _ : bits(1) @ 0b0011110 @ _ : bits(2) @ 0b1 @ _ : bits(5)
float_convert_int_decode(sf, S, typ, rmode, opcode, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b011010100 @ _ : bits(9) @ 0b0 @ _ : bits(11) as op_code = {
+function clause decode (_ : bits(2) @ 0b011010100 @ _ : bits(9) @ 0b0 @ _ : bits(11) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -854,7 +854,7 @@ function clause decode _ : bits(2) @ 0b011010100 @ _ : bits(9) @ 0b0 @ _ : bits(
integer_conditional_select_decode(sf, op, S, Rm, cond, o2, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111000101 @ _ : bits(5) @ 0b110000 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000101 @ _ : bits(5) @ 0b110000 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
A : bits(1) = [op_code[23]];
@@ -867,7 +867,7 @@ function clause decode _ : bits(2) @ 0b111000101 @ _ : bits(5) @ 0b110000 @ _ :
memory_orderedrcpc_decode(size, V, A, R, Rs, o3, opc, Rn, Rt)
}
-function clause decode _ : bits(3) @ 0b01011001 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(3) @ 0b01011001 @ _ : bits(21) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -880,7 +880,7 @@ function clause decode _ : bits(3) @ 0b01011001 @ _ : bits(21) as op_code = {
integer_arithmetic_addsub_extendedreg_decode(sf, op, S, opt, Rm, option_name, imm3, Rn, Rd)
}
-function clause decode _ : bits(3) @ 0b10000 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(3) @ 0b10000 @ _ : bits(24) as op_code) = {
op : bits(1) = [op_code[31]];
immlo : bits(2) = op_code[30 .. 29];
immhi : bits(19) = op_code[23 .. 5];
@@ -888,7 +888,7 @@ function clause decode _ : bits(3) @ 0b10000 @ _ : bits(24) as op_code = {
integer_arithmetic_address_pcrel_decode(op, immlo, immhi, Rd)
}
-function clause decode 0b0 @ _ : bits(1) @ 0b0011010 @ _ : bits(2) @ 0b00000 @ _ : bits(16) as op_code = {
+function clause decode (0b0 @ _ : bits(1) @ 0b0011010 @ _ : bits(2) @ 0b00000 @ _ : bits(16) as op_code) = {
Q : bits(1) = [op_code[30]];
L : bits(1) = [op_code[22]];
R : bits(1) = [op_code[21]];
@@ -900,7 +900,7 @@ function clause decode 0b0 @ _ : bits(1) @ 0b0011010 @ _ : bits(2) @ 0b00000 @ _
memory_vector_single_nowb_aarch64_memory_vector_single_nowb__decode(Q, L, R, opcode, S, size, Rn, Rt)
}
-function clause decode 0b0 @ _ : bits(1) @ 0b0011011 @ _ : bits(23) as op_code = {
+function clause decode (0b0 @ _ : bits(1) @ 0b0011011 @ _ : bits(23) as op_code) = {
Q : bits(1) = [op_code[30]];
L : bits(1) = [op_code[22]];
R : bits(1) = [op_code[21]];
@@ -913,7 +913,7 @@ function clause decode 0b0 @ _ : bits(1) @ 0b0011011 @ _ : bits(23) as op_code =
memory_vector_single_postinc_aarch64_memory_vector_single_nowb__decode(Q, L, R, Rm, opcode, S, size, Rn, Rt)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(10) @ 0b1 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(10) @ 0b1 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
M : bits(1) = [op_code[23]];
@@ -925,7 +925,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b1 @ _ : bits(10)
memory_single_general_immediate_signed_pac_decode(size, V, M, S, imm9, W, Rn, Rt)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b101 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b101 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -935,7 +935,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b101 @ _ : bits(10)
integer_pac_autib_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code = {
+function clause decode (0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -946,7 +946,7 @@ function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code
integer_pac_autib_hint_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b01 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b01 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -958,7 +958,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(9) @ 0b01 @ _ :
float_compare_cond_decode(M, S, typ, Rm, cond, Rn, op, nzcv)
}
-function clause decode _ : bits(2) @ 0b0010000 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(2) @ 0b0010000 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code) = {
size : bits(2) = op_code[31 .. 30];
o2 : bits(1) = [op_code[23]];
L : bits(1) = [op_code[22]];
@@ -971,7 +971,7 @@ function clause decode _ : bits(2) @ 0b0010000 @ _ : bits(1) @ 0b0 @ _ : bits(21
memory_exclusive_single_decode(size, o2, L, o1, Rs, o0, Rt2, Rn, Rt)
}
-function clause decode _ : bits(1) @ 0b0011110 @ _ : bits(2) @ 0b0 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(1) @ 0b0011110 @ _ : bits(2) @ 0b0 @ _ : bits(21) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -983,7 +983,7 @@ function clause decode _ : bits(1) @ 0b0011110 @ _ : bits(2) @ 0b0 @ _ : bits(21
float_convert_fix_decode(sf, S, typ, rmode, opcode, scale, Rn, Rd)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1001 @ _ : bits(3) @ 0b10000 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1001 @ _ : bits(3) @ 0b10000 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -993,7 +993,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1001 @ _ : bits(3) @ 0b10000
float_arithmetic_round_decode(M, S, typ, rmode, Rn, Rd)
}
-function clause decode _ : bits(3) @ 0b01010 @ _ : bits(24) as op_code = {
+function clause decode (_ : bits(3) @ 0b01010 @ _ : bits(24) as op_code) = {
sf : bits(1) = [op_code[31]];
opc : bits(2) = op_code[30 .. 29];
shift : bits(2) = op_code[23 .. 22];
@@ -1005,7 +1005,7 @@ function clause decode _ : bits(3) @ 0b01010 @ _ : bits(24) as op_code = {
integer_logical_shiftedreg_decode(sf, opc, shift, N, Rm, imm6, Rn, Rd)
}
-function clause decode _ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b010 @ _ : bits(13) as op_code = {
+function clause decode (_ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b010 @ _ : bits(13) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -1018,7 +1018,7 @@ function clause decode _ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b010 @ _ : bi
integer_crc_decode(sf, op, S, Rm, opcode2, C, sz, Rn, Rd)
}
-function clause decode _ : bits(3) @ 0b11010000 @ _ : bits(5) @ 0b000000 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(3) @ 0b11010000 @ _ : bits(5) @ 0b000000 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -1029,7 +1029,7 @@ function clause decode _ : bits(3) @ 0b11010000 @ _ : bits(5) @ 0b000000 @ _ : b
integer_arithmetic_addsub_carry_decode(sf, op, S, Rm, opcode2, Rn, Rd)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b001000 @ _ : bits(7) @ 0b000 as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b001000 @ _ : bits(7) @ 0b000 as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -1040,7 +1040,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b001000 @
float_compare_uncond_decode(M, S, typ, Rm, op, Rn, opc)
}
-function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code = {
+function clause decode (0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code) = {
L : bits(1) = [op_code[21]];
op0 : bits(2) = op_code[20 .. 19];
op1 : bits(3) = op_code[18 .. 16];
@@ -1051,7 +1051,7 @@ function clause decode 0b11010101000000110010 @ _ : bits(7) @ 0b11111 as op_code
system_hints_decode(L, op0, op1, CRn, CRm, op2, Rt)
}
-function clause decode _ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b0010 @ _ : bits(12) as op_code = {
+function clause decode (_ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b0010 @ _ : bits(12) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
@@ -1063,7 +1063,7 @@ function clause decode _ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b0010 @ _ : b
integer_shift_variable_decode(sf, op, S, Rm, opcode2, op2, Rn, Rd)
}
-function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b011 @ _ : bits(10) as op_code = {
+function clause decode (0b110110101100000100 @ _ : bits(1) @ 0b011 @ _ : bits(10) as op_code) = {
sf : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
opcode2 : bits(5) = op_code[20 .. 16];
@@ -1073,7 +1073,7 @@ function clause decode 0b110110101100000100 @ _ : bits(1) @ 0b011 @ _ : bits(10)
integer_pac_pacdb_dp_1src_decode(sf, S, opcode2, Z, Rn, Rd)
}
-function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b10 @ _ : bits(10) as op_code = {
+function clause decode (_ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9) @ 0b10 @ _ : bits(10) as op_code) = {
size : bits(2) = op_code[31 .. 30];
V : bits(1) = [op_code[26]];
opc : bits(2) = op_code[23 .. 22];
@@ -1083,7 +1083,7 @@ function clause decode _ : bits(2) @ 0b111000 @ _ : bits(2) @ 0b0 @ _ : bits(9)
memory_single_general_immediate_signed_offset_unpriv_aarch64_memory_single_general_immediate_signed_offset_unpriv__decode(size, V, opc, imm9, Rn, Rt)
}
-function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b001 @ _ : bits(1) @ 0b10 @ _ : bits(10) as op_code = {
+function clause decode (0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b001 @ _ : bits(1) @ 0b10 @ _ : bits(10) as op_code) = {
M : bits(1) = [op_code[31]];
S : bits(1) = [op_code[29]];
typ : bits(2) = op_code[23 .. 22];
@@ -1094,7 +1094,7 @@ function clause decode 0b00011110 @ _ : bits(2) @ 0b1 @ _ : bits(5) @ 0b001 @ _
float_arithmetic_addsub_decode(M, S, typ, Rm, op, Rn, Rd)
}
-function clause decode _ : bits(1) @ 0b00100111 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code = {
+function clause decode (_ : bits(1) @ 0b00100111 @ _ : bits(1) @ 0b0 @ _ : bits(21) as op_code) = {
sf : bits(1) = [op_code[31]];
op21 : bits(2) = op_code[30 .. 29];
N : bits(1) = [op_code[22]];
@@ -1106,7 +1106,7 @@ function clause decode _ : bits(1) @ 0b00100111 @ _ : bits(1) @ 0b0 @ _ : bits(2
integer_insext_extract_immediate_decode(sf, op21, N, o0, Rm, imms, Rn, Rd)
}
-function clause decode 0b11010100010 @ _ : bits(16) @ 0b00000 as op_code = {
+function clause decode (0b11010100010 @ _ : bits(16) @ 0b00000 as op_code) = {
opc : bits(3) = op_code[23 .. 21];
imm16 : bits(16) = op_code[20 .. 5];
op2 : bits(3) = op_code[4 .. 2];
@@ -1114,7 +1114,7 @@ function clause decode 0b11010100010 @ _ : bits(16) @ 0b00000 as op_code = {
system_exceptions_debug_halt_decode(opc, imm16, op2, LL)
}
-function clause decode 0b10011011 @ _ : bits(1) @ 0b01 @ _ : bits(21) as op_code = {
+function clause decode (0b10011011 @ _ : bits(1) @ 0b01 @ _ : bits(21) as op_code) = {
sf : bits(1) = [op_code[31]];
op54 : bits(2) = op_code[30 .. 29];
U : bits(1) = [op_code[23]];
@@ -1126,7 +1126,7 @@ function clause decode 0b10011011 @ _ : bits(1) @ 0b01 @ _ : bits(21) as op_code
integer_arithmetic_mul_widening_3264_decode(sf, op54, U, Rm, o0, Ra, Rn, Rd)
}
-function clause decode _ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b00001 @ _ : bits(11) as op_code = {
+function clause decode (_ : bits(1) @ 0b0011010110 @ _ : bits(5) @ 0b00001 @ _ : bits(11) as op_code) = {
sf : bits(1) = [op_code[31]];
op : bits(1) = [op_code[30]];
S : bits(1) = [op_code[29]];
diff --git a/aarch64/mono/demo/aarch64_no_vector/aarch64_no_vector.sail b/aarch64/mono/demo/aarch64_no_vector/spec.sail
index 22b1e3a1..0bdd8f68 100644
--- a/aarch64/mono/demo/aarch64_no_vector/aarch64_no_vector.sail
+++ b/aarch64/mono/demo/aarch64_no_vector/spec.sail
@@ -1027,9 +1027,9 @@ function WaitForInterrupt () = {
()
}
-val EndOfInstruction : unit -> unit
+val EndOfInstruction : unit -> unit effect {escape}
-function EndOfInstruction () = ()
+function EndOfInstruction () = throw(Error_ExceptionTaken())
register ESR_EL3 : bits(32)
@@ -1702,9 +1702,9 @@ function ExternalInvasiveDebugEnabled () = return(DBGEN == HIGH)
val ConstrainUnpredictableInteger : (int, int, Unpredictable) -> (Constraint, int) effect {undef}
-function ConstrainUnpredictableInteger (low, high, which) = {
+function ConstrainUnpredictableInteger ('low, 'high, which) = {
c : Constraint = ConstrainUnpredictable(which);
- if c == Constraint_UNKNOWN then return((c, low)) else return((c, undefined : int))
+ if c == Constraint_UNKNOWN then return((c, low)) else return((c, undefined))
}
val ConstrainUnpredictableBool : Unpredictable -> bool effect {escape}
@@ -1803,7 +1803,7 @@ function LookUpRIndex ('n, mode) = {
return(result)
}
-val HighestSetBit : forall ('N : Int), 'N >= 2. bits('N) -> int
+val HighestSetBit : forall ('N : Int), 'N >= 0. bits('N) -> int
function HighestSetBit x = {
foreach (i from ('N - 1) to 0 by 1 in dec)
@@ -1813,18 +1813,19 @@ function HighestSetBit x = {
val CountLeadingZeroBits : forall ('N : Int), 'N >= 2. bits('N) -> int
-function CountLeadingZeroBits x = return('N - 1 - HighestSetBit(x))
+function CountLeadingZeroBits x = return(('N - 1) - HighestSetBit(x))
val CountLeadingSignBits : forall ('N : Int), 'N >= 3. bits('N) -> int
function CountLeadingSignBits x = return(CountLeadingZeroBits((x >> 1) ^ (x & slice_mask(0,'N))))
-val BitReverse : forall ('N : Int), 'N >= 2. bits('N) -> bits('N) effect {undef}
+val BitReverse : forall ('N : Int), 'N >= 0 & 'N >= 0.
+ bits('N) -> bits('N) effect {undef}
function BitReverse data = {
result : bits('N) = undefined;
foreach (i from 0 to ('N - 1) by 1 in inc)
- result['N - i - 1 .. 'N - i - 1] = [data[i]];
+ result = __SetSlice_bits('N, 1, result, ('N - i) - 1, [data[i]]);
return(result)
}
@@ -1946,7 +1947,7 @@ val BigEndianReverse : forall ('width : Int), 'width >= 0 & 'width >= 0.
bits('width) -> bits('width) effect {escape}
function BigEndianReverse value_name = {
- assert(('width == 8) | (('width == 16) | (('width == 32) | (('width == 64) | ('width == 128)))));
+ assert('width == 8 | 'width == 16 | 'width == 32 | 'width == 64 | 'width == 128);
result : bits('width) = replicate_bits(0b0,'width);
foreach (i from 0 to ('width - 1) by 8)
result[i+7 .. i] = (value_name['width-i - 1 .. 'width-i - 8] : bits(8));
@@ -2062,10 +2063,8 @@ val Replicate : forall ('M : Int) ('N : Int), 'M >= 0 & 'N >= 0.
bits('M) -> bits('N) effect {escape}
function Replicate x = {
- assert(('N % 'M) == 0, "((N MOD M) == 0)");
- let 'p = ex_int('N / 'M);
- assert(constraint('N = 'p * 'M));
- return(replicate_bits(x, p))
+ assert('N % 'M == 0, "((N MOD M) == 0)");
+ return(replicate_bits(x, 'N / 'M))
}
val Zeros__0 : forall ('N : Int), 'N >= 0. atom('N) -> bits('N)
@@ -2094,7 +2093,7 @@ val ZeroExtend__1 : forall ('M : Int) ('N : Int), 'M >= 0 & 'N >= 0.
overload ZeroExtend = {ZeroExtend__0, ZeroExtend__1}
function ZeroExtend__0 (x, N) = {
- assert(true);
+ assert('N >= 'M);
extzv(x)
}
@@ -2151,7 +2150,7 @@ function aset_SP value_name = {
val LSR_C : forall ('N : Int), 'N >= 0 & 'N >= 0 & 1 >= 0.
(bits('N), int) -> (bits('N), bits(1)) effect {escape}
-function LSR_C (x, shift) = {
+function LSR_C (x, 'shift) = {
assert(shift > 0, "(shift > 0)");
result : bits('N) = x >> shift;
carry_out : bits(1) = if shift > 'N then 0b0 else [x[shift - 1]];
@@ -2184,7 +2183,7 @@ function Poly32Mod2 (data__arg, poly) = {
val LSL_C : forall ('N : Int), 'N >= 0 & 'N >= 0 & 1 >= 0.
(bits('N), int) -> (bits('N), bits(1)) effect {escape}
-function LSL_C (x, shift) = {
+function LSL_C (x, 'shift) = {
assert(shift > 0, "(shift > 0)");
result : bits('N) = x << shift;
carry_out : bits(1) = if shift > 'N then 0b0 else [x['N - shift]];
@@ -2232,8 +2231,8 @@ val AddWithCarry : forall ('N : Int), 'N >= 0 & 'N >= 0 & 1 >= 0 & 'N >= 0 & 4 >
(bits('N), bits('N), bits(1)) -> (bits('N), bits(4))
function AddWithCarry (x, y, carry_in) = {
- unsigned_sum : int = UInt(x) + UInt(y) + UInt(carry_in);
- signed_sum : int = SInt(x) + SInt(y) + UInt(carry_in);
+ unsigned_sum : int = (UInt(x) + UInt(y)) + UInt(carry_in);
+ signed_sum : int = (SInt(x) + SInt(y)) + UInt(carry_in);
result : bits('N) = __GetSlice_int('N, unsigned_sum, 0);
n : bits(1) = [result['N - 1]];
z : bits(1) = if IsZero(result) then 0b1 else 0b0;
@@ -2282,7 +2281,7 @@ val FPZero : forall ('N : Int), 1 >= 0 & 'N >= 0.
function FPZero sign = {
assert('N == 16 | 'N == 32 | 'N == 64, "((N == 16) || ((N == 32) || (N == 64)))");
let 'E = (if 'N == 16 then 5 else if 'N == 32 then 8 else 11) : {|5, 8, 11|};
- F : atom('N - 'E - 1) = 'N - E - 1;
+ F : atom('N - 'E - 1) = ('N - E) - 1;
exp : bits('E) = Zeros(E);
frac : bits('N - 1 - 'E) = Zeros(F);
return(append(append(sign, exp), frac))
@@ -2305,7 +2304,7 @@ val ConstrainUnpredictableBits : forall ('width : Int), 'width >= 0.
function ConstrainUnpredictableBits which = {
c : Constraint = ConstrainUnpredictable(which);
- if c == Constraint_UNKNOWN then return((c, Zeros('width))) else return((c, undefined : bits('width)))
+ if c == Constraint_UNKNOWN then return((c, Zeros('width))) else return((c, undefined))
}
val AArch64_SysInstrWithResult : (int, int, int, int, int) -> bits(64) effect {escape}
@@ -2338,7 +2337,7 @@ val VFPExpandImm : forall ('N : Int), 8 >= 0 & 'N >= 0.
function VFPExpandImm imm8 = {
assert('N == 16 | 'N == 32 | 'N == 64, "((N == 16) || ((N == 32) || (N == 64)))");
let 'E = (if 'N == 16 then 5 else if 'N == 32 then 8 else 11) : {|5, 8, 11|};
- F : atom('N - 'E - 1) = 'N - E - 1;
+ F : atom('N - 'E - 1) = ('N - E) - 1;
sign : bits(1) = [imm8[7]];
exp : bits('E) = append(append(~([imm8[6]]), replicate_bits([imm8[6]], E - 3)), imm8[5 .. 4]);
frac : bits('N - 1 - 'E) = append(imm8[3 .. 0], Zeros(F - 4));
@@ -2375,7 +2374,7 @@ function Extend__1 (x, unsigned) = return(Extend(x, 'N, unsigned))
val ASR_C : forall ('N : Int), 'N >= 0 & 'N >= 0 & 1 >= 0.
(bits('N), int) -> (bits('N), bits(1)) effect {escape}
-function ASR_C (x, shift) = {
+function ASR_C (x, 'shift) = {
assert(shift > 0, "(shift > 0)");
result : bits('N) = arith_shiftright(x, shift);
carry_out : bits(1) = if shift > 'N then [x['N - 1]] else [x[shift - 1]];
@@ -2413,7 +2412,7 @@ val FPMaxNormal : forall ('N : Int), 1 >= 0 & 'N >= 0.
function FPMaxNormal sign = {
assert('N == 16 | 'N == 32 | 'N == 64, "((N == 16) || ((N == 32) || (N == 64)))");
let 'E = (if 'N == 16 then 5 else if 'N == 32 then 8 else 11) : {|5, 8, 11|};
- F : atom('N - 'E - 1) = 'N - E - 1;
+ F : atom('N - 'E - 1) = ('N - E) - 1;
exp : bits('E) = append(Ones(E - 1), 0b0);
frac : bits('N - 1 - 'E) = Ones(F);
return(append(append(sign, exp), frac))
@@ -2425,7 +2424,7 @@ val FPInfinity : forall ('N : Int), 1 >= 0 & 'N >= 0.
function FPInfinity sign = {
assert('N == 16 | 'N == 32 | 'N == 64, "((N == 16) || ((N == 32) || (N == 64)))");
let 'E = (if 'N == 16 then 5 else if 'N == 32 then 8 else 11) : {|5, 8, 11|};
- F : atom('N - 'E - 1) = 'N - E - 1;
+ F : atom('N - 'E - 1) = ('N - E) - 1;
exp : bits('E) = Ones(E);
frac : bits('N - 1 - 'E) = Zeros(F);
return(append(append(sign, exp), frac))
@@ -2436,7 +2435,7 @@ val FPDefaultNaN : forall ('N : Int), 'N >= 0. unit -> bits('N) effect {escape}
function FPDefaultNaN () = {
assert('N == 16 | 'N == 32 | 'N == 64, "((N == 16) || ((N == 32) || (N == 64)))");
let 'E = (if 'N == 16 then 5 else if 'N == 32 then 8 else 11) : {|5, 8, 11|};
- F : atom('N - 'E - 1) = 'N - E - 1;
+ F : atom('N - 'E - 1) = ('N - E) - 1;
sign : bits(1) = 0b0;
exp : bits('E) = Ones(E);
frac : bits('N - 1 - 'E) = append(0b1, Zeros(F - 1));
@@ -2546,7 +2545,7 @@ function PACInvSub Tinput = {
return(Toutput)
}
-val ComputePAC : (bits(64), bits(64), bits(64), bits(64)) -> bits(64) effect {rreg, undef, wreg, escape}
+val ComputePAC : (bits(64), bits(64), bits(64), bits(64)) -> bits(64) effect {escape, rreg, undef, wreg}
function ComputePAC (data, modifier, key0, key1) = {
workingval : bits(64) = undefined;
@@ -2609,7 +2608,7 @@ val Align__1 : forall ('N : Int), 'N >= 0 & 'N >= 0. (bits('N), int) -> bits('N)
overload Align = {Align__0, Align__1}
-function Align__0 ('x, 'y) = return(y * x / y)
+function Align__0 ('x, 'y) = return(y * (x / y))
function Align__1 (x, 'y) = return(__GetSlice_int('N, Align(UInt(x), y), 0))
@@ -2739,17 +2738,15 @@ function aarch64_integer_insext_extract_immediate ('d, 'datasize, 'lsb, 'm, 'n)
aset_X(d, result)
}
-val aarch64_integer_arithmetic_rev : (int, int, int, int) -> unit effect {escape, wreg, undef, rreg}
+val aarch64_integer_arithmetic_rev : (int, int, int, int) -> unit effect {escape, rreg, undef, wreg}
-function aarch64_integer_arithmetic_rev ('container_size, 'd, 'datasize, 'n) = {
+function aarch64_integer_arithmetic_rev ('container_size, 'd, 'datasize, 'n) = let 'dbytes = ex_int(datasize / 8) in {
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
- assert(constraint('container_size >= 0 + 1));
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
operand : bits('datasize) = aget_X(n);
result : bits('datasize) = undefined;
- let 'containers : int = datasize / container_size;
- assert(constraint('containers * 'container_size = 'datasize));
- let 'elements_per_container : int = container_size / 8;
- assert(constraint('elements_per_container * 8 = 'container_size));
+ containers : int = datasize / container_size;
+ elements_per_container : int = container_size / 8;
index : int = 0;
rev_index : int = undefined;
foreach (c from 0 to (containers - 1) by 1 in inc) {
@@ -2771,7 +2768,7 @@ function aarch64_integer_arithmetic_rbit ('d, 'datasize, 'n) = let 'dbytes = ex_
operand : bits('datasize) = aget_X(n);
result : bits('datasize) = undefined;
foreach (i from 0 to (datasize - 1) by 1 in inc)
- result = __SetSlice_bits(datasize, 1, result, datasize - 1 - i, [operand[i]]);
+ result = __SetSlice_bits(datasize, 1, result, (datasize - 1) - i, [operand[i]]);
aset_X(d, result)
}
@@ -2926,7 +2923,7 @@ function aarch64_integer_arithmetic_addsub_carry ('d, 'datasize, 'm, 'n, setflag
nzcv : bits(4) = undefined;
if sub_op then operand2 = ~(operand2) else ();
(result, nzcv) = AddWithCarry(operand1, operand2, PSTATE.C);
- if setflags then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = nzcv else ();
+ if setflags then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = nzcv else ();
aset_X(d, result)
}
@@ -3100,7 +3097,7 @@ function aarch64_integer_logical_shiftedreg ('d, 'datasize, invert, 'm, 'n, op,
LogicalOp_ORR => result = operand1 | operand2,
LogicalOp_EOR => result = operand1 ^ operand2
};
- if setflags then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = ([result[datasize - 1]] @ IsZeroBit(result)) @ 0b00 else ();
+ if setflags then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = ([result[datasize - 1]] @ IsZeroBit(result)) @ 0b00 else ();
aset_X(d, result)
}
@@ -3119,7 +3116,7 @@ function aarch64_integer_arithmetic_addsub_shiftedreg ('d, 'datasize, 'm, 'n, se
carry_in = 0b1
} else carry_in = 0b0;
(result, nzcv) = AddWithCarry(operand1, operand2, carry_in);
- if setflags then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = nzcv else ();
+ if setflags then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = nzcv else ();
aset_X(d, result)
}
@@ -3252,7 +3249,7 @@ function aarch64_integer_logical_immediate ('d, datasize, imm, 'n, op, setflags)
LogicalOp_ORR => result = operand1 | operand2,
LogicalOp_EOR => result = operand1 ^ operand2
};
- if setflags then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = ([result[datasize - 1]] @ IsZeroBit(result)) @ 0b00 else ();
+ if setflags then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = ([result[datasize - 1]] @ IsZeroBit(result)) @ 0b00 else ();
if d == 31 & ~(setflags) then aset_SP(result) else aset_X(d, result)
}
@@ -3272,7 +3269,7 @@ function aarch64_integer_arithmetic_addsub_immediate ('d, datasize, imm, 'n, set
carry_in = 0b1
} else carry_in = 0b0;
(result, nzcv) = AddWithCarry(operand1, operand2, carry_in);
- if setflags then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = nzcv else ();
+ if setflags then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = nzcv else ();
if d == 31 & ~(setflags) then aset_SP(result) else aset_X(d, result)
}
@@ -3291,7 +3288,7 @@ function aarch64_integer_arithmetic_addsub_extendedreg ('d, 'datasize, extend_ty
carry_in = 0b1
} else carry_in = 0b0;
(result, nzcv) = AddWithCarry(operand1, operand2, carry_in);
- if setflags then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = nzcv else ();
+ if setflags then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = nzcv else ();
if d == 31 & ~(setflags) then aset_SP(result) else aset_X(d, result)
}
@@ -3364,18 +3361,18 @@ function Auth (ptr, modifier, K, data, keynumber) = {
assert(constraint('bottom_PAC_bit >= 0));
extfield = replicate_bits([ptr[55]], 64);
if tbi then
- original_ptr = (ptr[63 .. 56] @ extfield[negate(bottom_PAC_bit) + 56 - 1 .. 0]) @ ptr[bottom_PAC_bit - 1 .. 0]
+ original_ptr = (ptr[63 .. 56] @ extfield[(negate(bottom_PAC_bit) + 56) - 1 .. 0]) @ ptr[bottom_PAC_bit - 1 .. 0]
else
- original_ptr = extfield[negate(bottom_PAC_bit) + 64 - 1 .. 0] @ ptr[bottom_PAC_bit - 1 .. 0];
+ original_ptr = extfield[(negate(bottom_PAC_bit) + 64) - 1 .. 0] @ ptr[bottom_PAC_bit - 1 .. 0];
PAC = ComputePAC(original_ptr, modifier, K[127 .. 64], K[63 .. 0]);
if tbi then
- if PAC[negate(bottom_PAC_bit) + 55 - 1 + bottom_PAC_bit .. bottom_PAC_bit] == ptr[negate(bottom_PAC_bit) + 55 - 1 + bottom_PAC_bit .. bottom_PAC_bit] then
+ if PAC[((negate(bottom_PAC_bit) + 55) - 1) + bottom_PAC_bit .. bottom_PAC_bit] == ptr[((negate(bottom_PAC_bit) + 55) - 1) + bottom_PAC_bit .. bottom_PAC_bit] then
result = original_ptr
else {
error_code = keynumber @ ~(keynumber);
result = (original_ptr[63 .. 55] @ error_code) @ original_ptr[52 .. 0]
}
- else if PAC[negate(bottom_PAC_bit) + 55 - 1 + bottom_PAC_bit .. bottom_PAC_bit] == ptr[negate(bottom_PAC_bit) + 55 - 1 + bottom_PAC_bit .. bottom_PAC_bit] & PAC[63 .. 56] == ptr[63 .. 56] then
+ else if PAC[((negate(bottom_PAC_bit) + 55) - 1) + bottom_PAC_bit .. bottom_PAC_bit] == ptr[((negate(bottom_PAC_bit) + 55) - 1) + bottom_PAC_bit .. bottom_PAC_bit] & PAC[63 .. 56] == ptr[63 .. 56] then
result = original_ptr
else {
error_code = keynumber @ ~(keynumber);
@@ -3530,8 +3527,8 @@ function FPRoundBase (op, fpcr, rounding) = {
else FPSR = __SetSlice_bits(32, 1, FPSR, 3, 0b1);
return(FPZero(sign))
} else ();
- biased_exp : int = max(exponent - minimum_exp + 1, 0);
- if biased_exp == 0 then mantissa = mantissa / (2.0 ^ (minimum_exp - exponent))
+ biased_exp : int = max((exponent - minimum_exp) + 1, 0);
+ if biased_exp == 0 then mantissa = mantissa / 2.0 ^ (minimum_exp - exponent)
else ();
int_mant : int = RoundDown(mantissa * 2.0 ^ F);
error : real = mantissa * 2.0 ^ F - Real(int_mant);
@@ -3578,13 +3575,13 @@ function FPRoundBase (op, fpcr, rounding) = {
FPProcessException(FPExc_Overflow, fpcr);
error = 1.0
} else
- result = (sign @ __GetSlice_int('N - F - 1, biased_exp, 0)) @ __GetSlice_int(F, int_mant, 0)
+ result = (sign @ __GetSlice_int(('N - F) - 1, biased_exp, 0)) @ __GetSlice_int(F, int_mant, 0)
else if biased_exp >= pow2(E) then {
result = sign @ Ones('N - 1);
FPProcessException(FPExc_InvalidOp, fpcr);
error = 0.0
} else
- result = (sign @ __GetSlice_int('N - F - 1, biased_exp, 0)) @ __GetSlice_int(F, int_mant, 0);
+ result = (sign @ __GetSlice_int(('N - F) - 1, biased_exp, 0)) @ __GetSlice_int(F, int_mant, 0);
if error != 0.0 then FPProcessException(FPExc_Inexact, fpcr) else ();
return(result)
}
@@ -3624,7 +3621,7 @@ function FixedToFP (op, 'fbits, unsigned, fpcr, rounding) = {
assert(fbits >= 0);
assert(rounding != FPRounding_ODD);
int_operand : int = asl_Int(op, unsigned);
- real_operand : real = Real(int_operand) / (2.0 ^ fbits);
+ real_operand : real = Real(int_operand) / 2.0 ^ fbits;
if real_operand == 0.0 then result = FPZero(0b0)
else result = FPRound(real_operand, fpcr, rounding);
return(result)
@@ -3970,7 +3967,7 @@ function FPToFixedJS (op, fpcr, Is64) = {
} else ();
if sign == 0b1 & value_name == 0.0 then Z = 0b0 else ();
if typ == FPType_Infinity then result = 0 else ();
- if Is64 then (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = (0b0 @ Z) @ 0b00 else FPSCR = __SetSlice_bits(32, 4, FPSCR, 28, (0b0 @ Z) @ 0b00);
+ if Is64 then (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = (0b0 @ Z) @ 0b00 else FPSCR = __SetSlice_bits(32, 4, FPSCR, 28, (0b0 @ Z) @ 0b00);
return(__GetSlice_int(32, result, 0))
}
@@ -4477,11 +4474,11 @@ function Halt reason = {
else assert([EDSCR[16]] == 0b1, "((EDSCR).SDD == '1')");
EDSCR[20 .. 20] = 0b0;
if UsingAArch32() then {
- (PSTATE.SS, PSTATE.A, PSTATE.I, PSTATE.F) = undefined : bits(4);
+ (PSTATE.SS @ PSTATE.A @ PSTATE.I @ PSTATE.F) = undefined : bits(4);
PSTATE.IT = 0x00;
PSTATE.T = 0b1
} else
- (PSTATE.SS, PSTATE.D, PSTATE.A, PSTATE.I, PSTATE.F) = undefined : bits(5);
+ (PSTATE.SS @ PSTATE.D @ PSTATE.A @ PSTATE.I @ PSTATE.F) = undefined : bits(5);
PSTATE.IL = 0b0;
StopInstructionPrefetchAndEnableITR();
EDSCR[5 .. 0] = reason;
@@ -4913,7 +4910,7 @@ function aarch64_integer_conditional_compare_register (condition, 'datasize, fla
} else ();
(__anon1, flags) = AddWithCarry(operand1, operand2, carry_in)
} else ();
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = flags
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = flags
}
val integer_conditional_compare_register_decode : (bits(1), bits(1), bits(1), bits(5), bits(4), bits(1), bits(5), bits(1), bits(4)) -> unit effect {escape, rreg, undef, wreg}
@@ -4947,7 +4944,7 @@ function aarch64_integer_conditional_compare_immediate (condition, datasize, fla
} else ();
(__anon1, flags) = AddWithCarry(operand1, operand2, carry_in)
} else ();
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = flags
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = flags
}
val integer_conditional_compare_immediate_decode : (bits(1), bits(1), bits(1), bits(5), bits(4), bits(1), bits(5), bits(1), bits(4)) -> unit effect {escape, wreg, undef, rreg}
@@ -5183,17 +5180,17 @@ function AddPAC (ptr, modifier, K, data) = {
assert(constraint('bottom_PAC_bit <= 55));
extfield = replicate_bits(selbit, 64);
if tbi then
- ext_ptr = (ptr[63 .. 56] @ extfield[negate(bottom_PAC_bit) + 56 - 1 .. 0]) @ ptr[bottom_PAC_bit - 1 .. 0]
+ ext_ptr = (ptr[63 .. 56] @ extfield[(negate(bottom_PAC_bit) + 56) - 1 .. 0]) @ ptr[bottom_PAC_bit - 1 .. 0]
else
- ext_ptr = extfield[negate(bottom_PAC_bit) + 64 - 1 .. 0] @ ptr[bottom_PAC_bit - 1 .. 0];
+ ext_ptr = extfield[(negate(bottom_PAC_bit) + 64) - 1 .. 0] @ ptr[bottom_PAC_bit - 1 .. 0];
PAC = ComputePAC(ext_ptr, modifier, K[127 .. 64], K[63 .. 0]);
- if ~(IsZero(ptr[top_bit - bottom_PAC_bit + 1 - 1 + bottom_PAC_bit .. bottom_PAC_bit])) & ~(IsOnes(ptr[top_bit - bottom_PAC_bit + 1 - 1 + bottom_PAC_bit .. bottom_PAC_bit])) then
+ if ~(IsZero(ptr[(((top_bit - bottom_PAC_bit) + 1) - 1) + bottom_PAC_bit .. bottom_PAC_bit])) & ~(IsOnes(ptr[(((top_bit - bottom_PAC_bit) + 1) - 1) + bottom_PAC_bit .. bottom_PAC_bit])) then
PAC[top_bit - 1 .. top_bit - 1] = ~([PAC[top_bit - 1]])
else ();
if tbi then
- result = ((ptr[63 .. 56] @ selbit) @ PAC[negate(bottom_PAC_bit) + 55 - 1 + bottom_PAC_bit .. bottom_PAC_bit]) @ ptr[bottom_PAC_bit - 1 .. 0]
+ result = ((ptr[63 .. 56] @ selbit) @ PAC[((negate(bottom_PAC_bit) + 55) - 1) + bottom_PAC_bit .. bottom_PAC_bit]) @ ptr[bottom_PAC_bit - 1 .. 0]
else
- result = ((PAC[63 .. 56] @ selbit) @ PAC[negate(bottom_PAC_bit) + 55 - 1 + bottom_PAC_bit .. bottom_PAC_bit]) @ ptr[bottom_PAC_bit - 1 .. 0];
+ result = ((PAC[63 .. 56] @ selbit) @ PAC[((negate(bottom_PAC_bit) + 55) - 1) + bottom_PAC_bit .. bottom_PAC_bit]) @ ptr[bottom_PAC_bit - 1 .. 0];
return(result)
}
@@ -5246,12 +5243,12 @@ function AArch64_WatchpointByteMatch (n, vaddress) = let 'top : {'n, true. atom(
let 'bottom2 : {'n, true. atom('n)} = ex_int(bottom);
if mask > bottom then {
assert(constraint('mask2 >= 'bottom2 + 1));
- WVR_match = vaddress[top - mask2 + 1 - 1 + mask2 .. mask2] == DBGWVR_EL1[n][top - mask2 + 1 - 1 + mask2 .. mask2];
- if WVR_match & ~(IsZero(DBGWVR_EL1[n][mask2 - bottom2 - 1 + bottom2 .. bottom2])) then
+ WVR_match = vaddress[(((top - mask2) + 1) - 1) + mask2 .. mask2] == DBGWVR_EL1[n][(((top - mask2) + 1) - 1) + mask2 .. mask2];
+ if WVR_match & ~(IsZero(DBGWVR_EL1[n][((mask2 - bottom2) - 1) + bottom2 .. bottom2])) then
WVR_match = ConstrainUnpredictableBool(Unpredictable_WPMASKEDBITS)
else ()
} else
- WVR_match = vaddress[top - bottom2 + 1 - 1 + bottom2 .. bottom2] == DBGWVR_EL1[n][top - bottom2 + 1 - 1 + bottom2 .. bottom2];
+ WVR_match = vaddress[(((top - bottom2) + 1) - 1) + bottom2 .. bottom2] == DBGWVR_EL1[n][(((top - bottom2) + 1) - 1) + bottom2 .. bottom2];
return(WVR_match & byte_select_match)
}
@@ -5339,7 +5336,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
else ()
} else ();
ps = slice(TCR_EL3, 16, 3);
- basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, top - inputsize + 1);
+ basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, (top - inputsize) + 1);
disabled = false;
baseregister = TTBR0_EL3;
descaddr.memattrs = WalkAttrDecode(slice(TCR_EL3, 12, 2), slice(TCR_EL3, 10, 2), slice(TCR_EL3, 8, 2), secondstage);
@@ -5368,7 +5365,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
if c == Constraint_FORCE then inputsize = inputsize_min
else ()
} else ();
- basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, top - inputsize + 1);
+ basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, (top - inputsize) + 1);
disabled = [TCR_EL2[7]] == 0b1;
baseregister = TTBR0_EL2;
descaddr.memattrs = WalkAttrDecode(slice(TCR_EL2, 12, 2), slice(TCR_EL2, 10, 2), slice(TCR_EL2, 8, 2), secondstage);
@@ -5391,7 +5388,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
if c == Constraint_FORCE then inputsize = inputsize_min
else ()
} else ();
- basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsOnes_slice(inputaddr, inputsize, top - inputsize + 1);
+ basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsOnes_slice(inputaddr, inputsize, (top - inputsize) + 1);
disabled = [TCR_EL2[23]] == 0b1;
baseregister = TTBR1_EL2;
descaddr.memattrs = WalkAttrDecode(slice(TCR_EL2, 28, 2), slice(TCR_EL2, 26, 2), slice(TCR_EL2, 24, 2), secondstage);
@@ -5422,7 +5419,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
else ()
} else ();
ps = slice(TCR_EL2, 16, 3);
- basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, top - inputsize + 1);
+ basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, (top - inputsize) + 1);
disabled = false;
baseregister = TTBR0_EL2;
descaddr.memattrs = WalkAttrDecode(slice(TCR_EL2, 12, 2), slice(TCR_EL2, 10, 2), slice(TCR_EL2, 8, 2), secondstage);
@@ -5451,7 +5448,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
if c == Constraint_FORCE then inputsize = inputsize_min
else ()
} else ();
- basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, top - inputsize + 1);
+ basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsZero_slice(inputaddr, inputsize, (top - inputsize) + 1);
disabled = [TCR_EL1[7]] == 0b1;
baseregister = TTBR0_EL1;
descaddr.memattrs = WalkAttrDecode(slice(TCR_EL1, 12, 2), slice(TCR_EL1, 10, 2), slice(TCR_EL1, 8, 2), secondstage);
@@ -5474,7 +5471,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
if c == Constraint_FORCE then inputsize = inputsize_min
else ()
} else ();
- basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsOnes_slice(inputaddr, inputsize, top - inputsize + 1);
+ basefound = (inputsize >= inputsize_min & inputsize <= inputsize_max) & IsOnes_slice(inputaddr, inputsize, (top - inputsize) + 1);
disabled = [TCR_EL1[23]] == 0b1;
baseregister = TTBR1_EL1;
descaddr.memattrs = WalkAttrDecode(slice(TCR_EL1, 28, 2), slice(TCR_EL1, 26, 2), slice(TCR_EL1, 24, 2), secondstage);
@@ -5592,7 +5589,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
result.addrdesc = __tmp_20;
return(result)
} else ();
- let 'baselowerbound = (3 + inputsize - ((3 - level) * stride + grainsize)) : int;
+ let 'baselowerbound = ((3 + inputsize) - ((3 - level) * stride + grainsize)) : int;
assert(constraint(0 <= 'baselowerbound & 'baselowerbound <= 48));
baseaddress : bits(52) = undefined;
if outputsize == 52 then let 'z = (if baselowerbound < 6 then 6 else baselowerbound) : int in {
@@ -5614,7 +5611,7 @@ function AArch64_TranslationTableWalk (ipaddress, vaddress, acctype, iswrite, se
addrselectbottom : int = undefined;
repeat {
addrselectbottom = (3 - level) * stride + grainsize;
- index : bits(52) = ZeroExtend_slice_append(inputaddr, addrselectbottom, addrselecttop - addrselectbottom + 1, 0b000);
+ index : bits(52) = ZeroExtend_slice_append(inputaddr, addrselectbottom, (addrselecttop - addrselectbottom) + 1, 0b000);
__tmp_21 : FullAddress = descaddr.paddress;
__tmp_21.physicaladdress = baseaddress | index;
descaddr.paddress = __tmp_21;
@@ -5861,7 +5858,7 @@ function AArch64_TranslateAddressS1Off (vaddress, acctype, iswrite) = {
secondstage : bool = undefined;
ipaddress : bits(52) = undefined;
level : int = undefined;
- if ~(IsZero_slice2(vaddress, PAMax(), Top + 1 - PAMax())) then {
+ if ~(IsZero_slice2(vaddress, PAMax(), (Top + 1) - PAMax())) then {
level = 0;
ipaddress = undefined;
secondstage = false;
@@ -6006,13 +6003,13 @@ function AArch64_TranslateAddressS1Off (vaddress, acctype, iswrite) = {
return(result)
}
-val AArch64_MaybeZeroRegisterUppers : unit -> unit effect {wreg, undef, rreg, escape}
+val AArch64_MaybeZeroRegisterUppers : unit -> unit effect {escape, rreg, undef, wreg}
function AArch64_MaybeZeroRegisterUppers () = {
assert(UsingAArch32(), "UsingAArch32()");
include_R15_name : bool = undefined;
- last : range(14, 30) = undefined;
- first : atom(0) = 0;
+ last : int = undefined;
+ first : int = undefined;
if PSTATE.EL == EL0 & ~(ELUsingAArch32(EL1)) then {
first = 0;
last = 14;
@@ -6027,9 +6024,9 @@ function AArch64_MaybeZeroRegisterUppers () = {
include_R15_name = true
};
foreach (n from first to last by 1 in inc)
- if (n : int != 15 : int | include_R15_name) & ConstrainUnpredictableBool(Unpredictable_ZEROUPPER) then {
+ if (n != 15 | include_R15_name) & ConstrainUnpredictableBool(Unpredictable_ZEROUPPER) then {
__tmp_3 : bits(64) = _R[n];
- __tmp_3[63 .. 32] = Zeros(32);
+ __tmp_3 = __SetSlice_bits(64, 32, __tmp_3, 32, Zeros());
_R[n] = __tmp_3
} else ();
()
@@ -6492,7 +6489,7 @@ function AArch64_TranslationTableWalk_SecondStage (ipaddress, vaddress, acctype,
result.addrdesc = __tmp_20;
return(result)
} else ();
- let 'baselowerbound = (3 + inputsize - ((3 - level) * stride + grainsize)) : int;
+ let 'baselowerbound = ((3 + inputsize) - ((3 - level) * stride + grainsize)) : int;
assert(constraint(0 <= 'baselowerbound & 'baselowerbound <= 48));
baseaddress : bits(52) = undefined;
if outputsize == 52 then let 'z = (if baselowerbound < 6 then 6 else baselowerbound) : int in {
@@ -6514,7 +6511,7 @@ function AArch64_TranslationTableWalk_SecondStage (ipaddress, vaddress, acctype,
addrselectbottom : int = undefined;
repeat {
addrselectbottom = (3 - level) * stride + grainsize;
- index : bits(52) = ZeroExtend_slice_append(inputaddr, addrselectbottom, addrselecttop - addrselectbottom + 1, 0b000);
+ index : bits(52) = ZeroExtend_slice_append(inputaddr, addrselectbottom, (addrselecttop - addrselectbottom) + 1, 0b000);
__tmp_21 : FullAddress = descaddr.paddress;
__tmp_21.physicaladdress = baseaddress | index;
descaddr.paddress = __tmp_21;
@@ -6802,9 +6799,21 @@ function AArch64_StateMatch (SSC__arg, HMC__arg, PxC__arg, linked__arg, LBN, isb
return((priv_match & security_state_match) & (~(linked) | linked_match))
}
-val AArch64_WatchpointMatch : (int, bits(64), int, bool, bool) -> bool
+val AArch64_WatchpointMatch : (int, bits(64), int, bool, bool) -> bool effect {escape, rreg, undef}
-function AArch64_WatchpointMatch (n, vaddress, size, ispriv, iswrite) = false
+function AArch64_WatchpointMatch ('n, vaddress, 'size, ispriv, iswrite) = {
+ assert(~(ELUsingAArch32(S1TranslationRegime())), "!(ELUsingAArch32(S1TranslationRegime()))");
+ assert(n <= UInt(slice(ID_AA64DFR0_EL1, 20, 4)), "(n <= UInt((ID_AA64DFR0_EL1).WRPs))");
+ enabled : bool = [DBGWCR_EL1[n][0]] == 0b1;
+ linked : bool = [DBGWCR_EL1[n][20]] == 0b1;
+ isbreakpnt : bool = false;
+ state_match : bool = AArch64_StateMatch(slice(DBGWCR_EL1[n], 14, 2), [DBGWCR_EL1[n][13]], slice(DBGWCR_EL1[n], 1, 2), linked, slice(DBGWCR_EL1[n], 16, 4), isbreakpnt, ispriv);
+ ls_match : bool = [slice(DBGWCR_EL1[n], 3, 2)[if iswrite then 1 else 0]] == 0b1;
+ value_match_name : bool = false;
+ foreach (byte from 0 to (size - 1) by 1 in inc)
+ value_match_name = value_match_name | AArch64_WatchpointByteMatch(n, vaddress + byte);
+ return(((value_match_name & state_match) & ls_match) & enabled)
+}
val AArch64_BreakpointMatch : (int, bits(64), int) -> bool effect {escape, rreg, undef}
@@ -6957,7 +6966,7 @@ function AArch64_TakeReset cold_reset = {
else PSTATE.EL = EL1;
AArch64_ResetControlRegisters(cold_reset);
PSTATE.SP = 0b1;
- (PSTATE.D, PSTATE.A, PSTATE.I, PSTATE.F) = 0xF;
+ (PSTATE.D @ PSTATE.A @ PSTATE.I @ PSTATE.F) = 0xF;
PSTATE.SS = 0b0;
PSTATE.IL = 0b0;
AArch64_ResetGeneralRegisters();
@@ -6993,11 +7002,18 @@ function AArch64_TakeException (target_el, exception, preferred_exception_return
if from_32 then AArch64_MaybeZeroRegisterUppers() else ();
if UInt(target_el) > UInt(PSTATE.EL) then {
lower_32 : bool = undefined;
- if target_el == EL3 then if ~(IsSecure()) & HaveEL(EL2) then lower_32 = ELUsingAArch32(EL2) else lower_32 = ELUsingAArch32(EL1) else if (IsInHost() & PSTATE.EL == EL0) & target_el == EL2 then lower_32 = ELUsingAArch32(EL0) else lower_32 = ELUsingAArch32(target_el - 1);
+ if target_el == EL3 then
+ if ~(IsSecure()) & HaveEL(EL2) then lower_32 = ELUsingAArch32(EL2)
+ else lower_32 = ELUsingAArch32(EL1)
+ else if (IsInHost() & PSTATE.EL == EL0) & target_el == EL2 then
+ lower_32 = ELUsingAArch32(EL0)
+ else lower_32 = ELUsingAArch32(target_el - 1);
vect_offset = vect_offset + (if lower_32 then 1536 else 1024)
- } else if PSTATE.SP == 0b1 then vect_offset = vect_offset + 512 else ();
+ } else if PSTATE.SP == 0b1 then vect_offset = vect_offset + 512
+ else ();
spsr : bits(32) = GetPSRFromPSTATE();
- if HaveUAOExt() then PSTATE.UAO = 0b0 else ();
+ if HaveUAOExt() then PSTATE.UAO = 0b0
+ else ();
if ~(exception.typ == Exception_IRQ | exception.typ == Exception_FIQ) then AArch64_ReportException(exception, target_el) else ();
PSTATE.EL = target_el;
PSTATE.nRW = 0b0;
@@ -7005,13 +7021,15 @@ function AArch64_TakeException (target_el, exception, preferred_exception_return
aset_SPSR(spsr);
aset_ELR(preferred_exception_return);
PSTATE.SS = 0b0;
- (PSTATE.D, PSTATE.A, PSTATE.I, PSTATE.F) = 0xF;
+ (PSTATE.D @ PSTATE.A @ PSTATE.I @ PSTATE.F) = 0xF;
PSTATE.IL = 0b0;
if from_32 then {
PSTATE.IT = 0x00;
PSTATE.T = 0b0
} else ();
- if (HavePANExt() & (PSTATE.EL == EL1 | PSTATE.EL == EL2 & ELIsInHost(EL0))) & [aget_SCTLR()[23]] == 0b0 then PSTATE.PAN = 0b1 else ();
+ if (HavePANExt() & (PSTATE.EL == EL1 | PSTATE.EL == EL2 & ELIsInHost(EL0))) & [aget_SCTLR()[23]] == 0b0 then
+ PSTATE.PAN = 0b1
+ else ();
BranchTo(slice(aget_VBAR(), 11, 53) @ __GetSlice_int(11, vect_offset, 0), BranchType_EXCEPTION);
iesb_req : bool = undefined;
if HaveRASExt() & [aget_SCTLR()[21]] == 0b1 then {
@@ -7962,7 +7980,7 @@ function AArch32_EnterMode (target_mode, preferred_exception_return, 'lr_offset,
aset_R(14, preferred_exception_return + lr_offset);
PSTATE.T = [SCTLR[30]];
PSTATE.SS = 0b0;
- if target_mode == M32_FIQ then (PSTATE.A, PSTATE.I, PSTATE.F) = 0b111 else if target_mode == M32_Abort | target_mode == M32_IRQ then (PSTATE.A, PSTATE.I) = 0b11 else PSTATE.I = 0b1;
+ if target_mode == M32_FIQ then (PSTATE.A @ PSTATE.I @ PSTATE.F) = 0b111 else if target_mode == M32_Abort | target_mode == M32_IRQ then (PSTATE.A @ PSTATE.I) = 0b11 else PSTATE.I = 0b1;
PSTATE.E = [SCTLR[25]];
PSTATE.IL = 0b0;
PSTATE.IT = 0x00;
@@ -8122,7 +8140,7 @@ function aarch64_float_compare_uncond (cmp_with_zero, 'datasize, 'm, 'n, signal_
CheckFPAdvSIMDEnabled64();
operand1 : bits('datasize) = aget_V(n);
operand2 : bits('datasize) = if cmp_with_zero then FPZero(0b0) else aget_V(m);
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = FPCompare(operand1, operand2, signal_all_nans, FPCR)
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = FPCompare(operand1, operand2, signal_all_nans, FPCR)
}
val aarch64_float_compare_cond : (bits(4), int, bits(4), int, int, bool) -> unit effect {escape, rreg, undef, wreg}
@@ -8135,7 +8153,7 @@ function aarch64_float_compare_cond (condition, 'datasize, flags__arg, 'm, 'n, s
operand1 : bits('datasize) = aget_V(n);
operand2 : bits('datasize) = aget_V(m);
if ConditionHolds(condition) then flags = FPCompare(operand1, operand2, signal_all_nans, FPCR) else ();
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = flags
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = flags
}
val aarch64_float_arithmetic_unary : (int, int, FPUnaryOp, int) -> unit effect {escape, rreg, undef, wreg}
@@ -8527,7 +8545,7 @@ function aarch64_memory_vector_single_nowb (datasize, esize, index, m, memop, n,
element = aget_Mem(address + offs, ebytes, AccType_VEC);
let 'v : {'n, true. atom('n)} = ex_int(datasize / esize) in {
assert(constraint('esize * 'v = 'datasize));
- aset_V(t, replicate_bits(element, 'v))
+ aset_V(t, replicate_bits(element, v))
};
offs = offs + ebytes;
t = (t + 1) % 32
@@ -8587,11 +8605,11 @@ function aarch64_memory_vector_multiple_nowb (datasize, elements, esize, m, memo
} else ()
}
-val aarch64_memory_single_simdfp_register : forall ('datasize : Int).
- (AccType, atom('datasize), ExtendType, int, MemOp, int, bool, int, int, bool) -> unit effect {escape, rmem, wmem, undef, wreg, rreg}
+val aarch64_memory_single_simdfp_register : (AccType, int, ExtendType, int, MemOp, int, bool, int, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_simdfp_register (acctype, datasize, extend_type, m, memop, n, postindex, shift, t, wback) = {
+function aarch64_memory_single_simdfp_register (acctype, 'datasize, extend_type, 'm, memop, 'n, postindex, 'shift, 't, wback) = let 'dbytes = ex_int(datasize / 8) in {
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
offset : bits(64) = ExtendReg(m, extend_type, shift);
CheckFPAdvSIMDEnabled64();
address : bits(64) = undefined;
@@ -8600,32 +8618,28 @@ function aarch64_memory_single_simdfp_register (acctype, datasize, extend_type,
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
- let 'dq8 = ex_int(datasize / 8);
- assert(constraint(8 * 'dq8 = 'datasize));
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
data = aget_V(t);
- aset_Mem(address, dq8, acctype, data)
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dq8, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
aset_V(t, data)
}
};
if wback then {
- if postindex then address = address + offset
- else ();
+ if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
-val aarch64_memory_single_simdfp_immediate_signed_postidx : forall ('datasize : Int).
- (AccType, atom('datasize), MemOp, int, bits(64), bool, int, bool) -> unit effect {escape, rmem, wmem, undef, wreg, rreg}
+val aarch64_memory_single_simdfp_immediate_signed_postidx : (AccType, int, MemOp, int, bits(64), bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_simdfp_immediate_signed_postidx (acctype, datasize, memop, n, offset, postindex, t, wback) = {
+function aarch64_memory_single_simdfp_immediate_signed_postidx (acctype, 'datasize, memop, 'n, offset, postindex, 't, wback) = let 'dbytes = ex_int(datasize / 8) in {
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
CheckFPAdvSIMDEnabled64();
address : bits(64) = undefined;
data : bits('datasize) = undefined;
@@ -8633,32 +8647,28 @@ function aarch64_memory_single_simdfp_immediate_signed_postidx (acctype, datasiz
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
- let 'dq8 = ex_int(datasize / 8);
- assert(constraint('dq8 * 8 = 'datasize));
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
data = aget_V(t);
- aset_Mem(address, dq8, acctype, data)
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dq8, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
aset_V(t, data)
}
};
if wback then {
- if postindex then address = address + offset
- else ();
+ if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
-val aarch64_memory_single_simdfp_immediate_signed_offset_normal : forall ('datasize : Int).
- (AccType, atom('datasize), MemOp, int, bits(64), bool, int, bool) -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
+val aarch64_memory_single_simdfp_immediate_signed_offset_normal : (AccType, int, MemOp, int, bits(64), bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_simdfp_immediate_signed_offset_normal (acctype, datasize, memop, n, offset, postindex, t, wback) = {
+function aarch64_memory_single_simdfp_immediate_signed_offset_normal (acctype, 'datasize, memop, 'n, offset, postindex, 't, wback) = let 'dbytes = ex_int(datasize / 8) in {
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
CheckFPAdvSIMDEnabled64();
address : bits(64) = undefined;
data : bits('datasize) = undefined;
@@ -8666,23 +8676,19 @@ function aarch64_memory_single_simdfp_immediate_signed_offset_normal (acctype, d
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
- let 'dq8 = ex_int(datasize / 8);
- assert(constraint(8 * 'dq8 = 'datasize));
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
data = aget_V(t);
- aset_Mem(address, dq8, acctype, data)
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dq8, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
aset_V(t, data)
}
};
if wback then {
- if postindex then address = address + offset
- else ();
+ if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
@@ -8812,41 +8818,39 @@ function memory_literal_general_decode (opc, V, imm19, Rt) = {
aarch64_memory_literal_general(memop, offset, signed, 8 * size, t)
}
-val aarch64_memory_atomicops_swp : forall ('datasize : Int) ('regsize : Int).
- (atom('datasize), AccType, int, atom('regsize), int, AccType, int) -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
+val aarch64_memory_atomicops_swp : (int, AccType, int, int, int, AccType, int) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_atomicops_swp (datasize, ldacctype, n, regsize, s, stacctype, t) = {
- assert(constraint('datasize in {8, 16, 32, 64, 128} & 'regsize >= 0), "datasize constraint");
+function aarch64_memory_atomicops_swp ('datasize, ldacctype, 'n, 'regsize, 's, stacctype, 't) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
+ let 'dbytes = ex_int(datasize / 8);
+ assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
address : bits(64) = undefined;
data : bits('datasize) = undefined;
- let 'dbytes = ex_int(datasize / 8);
- assert(constraint(8 * 'dbytes = 'datasize));
if n == 31 then {
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- data = aget_Mem(address, dbytes, ldacctype);
- aset_Mem(address, dbytes, stacctype, aget_X(s));
+ data = aget_Mem(address, datasize / 8, ldacctype);
+ aset_Mem(address, datasize / 8, stacctype, aget_X(s));
aset_X(t, ZeroExtend(data, regsize))
}
-val aarch64_memory_atomicops_st : forall ('datasize : Int).
- (atom('datasize), AccType, int, MemAtomicOp, int, AccType) -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
+val aarch64_memory_atomicops_st : (int, AccType, int, MemAtomicOp, int, AccType) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_atomicops_st (datasize, ldacctype, n, op, s, stacctype) = {
+function aarch64_memory_atomicops_st ('datasize, ldacctype, 'n, op, 's, stacctype) = let 'dbytes = ex_int(datasize / 8) in {
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
address : bits(64) = undefined;
value_name : bits('datasize) = undefined;
data : bits('datasize) = undefined;
result : bits('datasize) = undefined;
value_name = aget_X(s);
- let 'dbytes = ex_int(datasize / 8);
- assert(constraint(8 * 'dbytes = 'datasize));
if n == 31 then {
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- data = aget_Mem(address, dbytes, ldacctype);
+ data = aget_Mem(address, datasize / 8, ldacctype);
match op {
MemAtomicOp_ADD => result = data + value_name,
MemAtomicOp_BIC => result = data & ~(value_name),
@@ -8857,26 +8861,26 @@ function aarch64_memory_atomicops_st (datasize, ldacctype, n, op, s, stacctype)
MemAtomicOp_UMAX => result = if UInt(data) > UInt(value_name) then data else value_name,
MemAtomicOp_UMIN => result = if UInt(data) > UInt(value_name) then value_name else data
};
- aset_Mem(address, dbytes, stacctype, result)
+ aset_Mem(address, datasize / 8, stacctype, result)
}
-val aarch64_memory_atomicops_ld : forall ('datasize : Int) ('regsize : Int).
- (atom('datasize), AccType, int, MemAtomicOp, atom('regsize), int, AccType, int) -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
+val aarch64_memory_atomicops_ld : (int, AccType, int, MemAtomicOp, int, int, AccType, int) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_atomicops_ld (datasize, ldacctype, n, op, regsize, s, stacctype, t) = {
- assert(constraint('datasize in {8, 16, 32, 64, 128} & 'regsize >= 0), "datasize constraint");
+function aarch64_memory_atomicops_ld ('datasize, ldacctype, 'n, op, 'regsize, 's, stacctype, 't) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
+ let 'dbytes = ex_int(datasize / 8);
+ assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
address : bits(64) = undefined;
value_name : bits('datasize) = undefined;
data : bits('datasize) = undefined;
result : bits('datasize) = undefined;
value_name = aget_X(s);
- let 'dbytes = ex_int(datasize / 8);
- assert(constraint(8 * 'dbytes = 'datasize));
if n == 31 then {
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- data = aget_Mem(address, dbytes, ldacctype);
+ data = aget_Mem(address, datasize / 8, ldacctype);
match op {
MemAtomicOp_ADD => result = data + value_name,
MemAtomicOp_BIC => result = data & ~(value_name),
@@ -8887,15 +8891,14 @@ function aarch64_memory_atomicops_ld (datasize, ldacctype, n, op, regsize, s, st
MemAtomicOp_UMAX => result = if UInt(data) > UInt(value_name) then data else value_name,
MemAtomicOp_UMIN => result = if UInt(data) > UInt(value_name) then value_name else data
};
- aset_Mem(address, dbytes, stacctype, result);
+ aset_Mem(address, datasize / 8, stacctype, result);
aset_X(t, ZeroExtend(data, regsize))
}
-val aarch64_memory_atomicops_cas_single : forall ('datasize : Int) ('regsize : Int).
- (atom('datasize), AccType, int, atom('regsize), int, AccType, int) -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
+val aarch64_memory_atomicops_cas_single : (int, AccType, int, int, int, AccType, int) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_atomicops_cas_single (datasize, ldacctype, n, regsize, s, stacctype, t) = {
- assert(constraint('regsize >= 0), "destsize constraint");
+function aarch64_memory_atomicops_cas_single ('datasize, ldacctype, 'n, 'regsize, 's, stacctype, 't) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
@@ -8909,19 +8912,18 @@ function aarch64_memory_atomicops_cas_single (datasize, ldacctype, n, regsize, s
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- data = aget_Mem(address, dbytes, ldacctype);
- if data == comparevalue then aset_Mem(address, dbytes, stacctype, newvalue) else ();
+ data = aget_Mem(address, datasize / 8, ldacctype);
+ if data == comparevalue then aset_Mem(address, datasize / 8, stacctype, newvalue) else ();
aset_X(s, ZeroExtend(data, regsize))
}
-val aarch64_memory_atomicops_cas_pair : forall ('datasize : Int) ('regsize : Int).
- (atom('datasize), AccType, int, atom('regsize), int, AccType, int) -> unit effect {escape, undef, wreg, rreg, rmem, wmem}
+val aarch64_memory_atomicops_cas_pair : (int, AccType, int, int, int, AccType, int) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_atomicops_cas_pair (datasize, ldacctype, n, regsize, s, stacctype, t) = {
- assert(constraint('regsize >= 0), "destsize constraint");
- let 'dbytes = ex_int((2 * datasize) / 8);
+function aarch64_memory_atomicops_cas_pair ('datasize, ldacctype, 'n, 'regsize, 's, stacctype, 't) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
+ let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
- assert(constraint(4 * 'dbytes = 'datasize), "dbytes constraint");
+ assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
address : bits(64) = undefined;
comparevalue : bits(2 * 'datasize) = undefined;
newvalue : bits(2 * 'datasize) = undefined;
@@ -8936,8 +8938,8 @@ function aarch64_memory_atomicops_cas_pair (datasize, ldacctype, n, regsize, s,
CheckSPAlignment();
address = aget_SP()
} else address = aget_X(n);
- data = aget_Mem(address, dbytes, ldacctype);
- if data == comparevalue then aset_Mem(address, dbytes, stacctype, newvalue) else ();
+ data = aget_Mem(address, (2 * datasize) / 8, ldacctype);
+ if data == comparevalue then aset_Mem(address, (2 * datasize) / 8, stacctype, newvalue) else ();
if BigEndian() then {
aset_X(s, ZeroExtend(slice(data, datasize, datasize), regsize));
aset_X(s + 1, ZeroExtend(slice(data, 0, datasize), regsize))
@@ -9056,15 +9058,15 @@ function SetPSTATEFromPSR spsr__arg = {
}
};
if PSTATE.IL == 0b1 & PSTATE.nRW == 0b1 then if ConstrainUnpredictableBool(Unpredictable_ILZEROT) then spsr = __SetSlice_bits(32, 1, spsr, 5, 0b0) else () else ();
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V) = slice(spsr, 28, 4);
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V) = slice(spsr, 28, 4);
if PSTATE.nRW == 0b1 then {
PSTATE.Q = [spsr[27]];
PSTATE.IT = RestoredITBits(spsr);
PSTATE.GE = slice(spsr, 16, 4);
PSTATE.E = [spsr[9]];
- (PSTATE.A, PSTATE.I, PSTATE.F) = slice(spsr, 6, 3);
+ (PSTATE.A @ PSTATE.I @ PSTATE.F) = slice(spsr, 6, 3);
PSTATE.T = [spsr[5]]
- } else (PSTATE.D, PSTATE.A, PSTATE.I, PSTATE.F) = slice(spsr, 6, 4);
+ } else (PSTATE.D @ PSTATE.A @ PSTATE.I @ PSTATE.F) = slice(spsr, 6, 4);
if HavePANExt() then PSTATE.PAN = [spsr[22]] else ();
if HaveUAOExt() then PSTATE.UAO = [spsr[23]] else ();
()
@@ -9077,13 +9079,13 @@ function DRPSInstruction () = {
if (HaveRASExt() & [aget_SCTLR()[21]] == 0b1) & ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then ErrorSynchronizationBarrier(MBReqDomain_FullSystem, MBReqTypes_All) else ();
SetPSTATEFromPSR(aget_SPSR());
if UsingAArch32() then {
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V, PSTATE.Q, PSTATE.GE, PSTATE.SS, PSTATE.A, PSTATE.I, PSTATE.F) = undefined : bits(13);
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V @ PSTATE.Q @ PSTATE.GE @ PSTATE.SS @ PSTATE.A @ PSTATE.I @ PSTATE.F) = undefined : bits(13);
PSTATE.IT = 0x00;
PSTATE.T = 0b1;
DLR = undefined : bits(32);
DSPSR = undefined : bits(32)
} else {
- (PSTATE.N, PSTATE.Z, PSTATE.C, PSTATE.V, PSTATE.SS, PSTATE.D, PSTATE.A, PSTATE.I, PSTATE.F) = undefined : bits(9);
+ (PSTATE.N @ PSTATE.Z @ PSTATE.C @ PSTATE.V @ PSTATE.SS @ PSTATE.D @ PSTATE.A @ PSTATE.I @ PSTATE.F) = undefined : bits(9);
DLR_EL0 = undefined : bits(64);
DSPSR_EL0 = undefined : bits(32)
};
@@ -9196,11 +9198,10 @@ function system_exceptions_runtime_hvc_decode (opc, imm16, op2, LL) = {
aarch64_system_exceptions_runtime_hvc(imm)
}
-val aarch64_memory_single_general_register : forall ('datasize : Int) ('regsize : Int).
- (AccType, atom('datasize), ExtendType, int, MemOp, int, bool, atom('regsize), int, bool, int, bool) -> unit effect {escape, undef, rreg, wreg, rmem, wmem}
+val aarch64_memory_single_general_register : (AccType, int, ExtendType, int, MemOp, int, bool, int, int, bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_general_register (acctype, datasize, extend_type, m, memop, n, postindex, regsize, shift, signed, t, wback__arg) = {
- assert(constraint('regsize >= 0), "destsize constraint");
+function aarch64_memory_single_general_register (acctype, 'datasize, extend_type, 'm, memop, 'n, postindex, 'regsize, 'shift, signed, 't, wback__arg) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
@@ -9235,33 +9236,28 @@ function aarch64_memory_single_general_register (acctype, datasize, extend_type,
if memop != MemOp_PREFETCH then CheckSPAlignment() else ();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
- if rt_unknown then data = undefined
- else data = aget_X(t);
- aset_Mem(address, dbytes, acctype, data)
+ if rt_unknown then data = undefined else data = aget_X(t);
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dbytes, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
if signed then aset_X(t, SignExtend(data, regsize)) else aset_X(t, ZeroExtend(data, regsize))
},
MemOp_PREFETCH => Prefetch(address, __GetSlice_int(5, t, 0))
};
if wback then {
- if wb_unknown then address = undefined
- else if postindex then address = address + offset
- else ();
+ if wb_unknown then address = undefined else if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
-val aarch64_memory_single_general_immediate_unsigned : forall ('datasize : Int) ('regsize : Int).
- (AccType, atom('datasize), MemOp, int, bits(64), bool, atom('regsize), bool, int, bool) -> unit effect {escape, undef, rreg, wreg, wmem, rmem}
+val aarch64_memory_single_general_immediate_unsigned : (AccType, int, MemOp, int, bits(64), bool, int, bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_general_immediate_unsigned (acctype, datasize, memop, n, offset, postindex, regsize, signed, t, wback__arg) = {
- assert(constraint('regsize >= 0), "destsize constraint");
+function aarch64_memory_single_general_immediate_unsigned (acctype, 'datasize, memop, 'n, offset, postindex, 'regsize, signed, 't, wback__arg) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
@@ -9295,33 +9291,28 @@ function aarch64_memory_single_general_immediate_unsigned (acctype, datasize, me
if memop != MemOp_PREFETCH then CheckSPAlignment() else ();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
- if rt_unknown then data = undefined
- else data = aget_X(t);
- aset_Mem(address, dbytes, acctype, data)
+ if rt_unknown then data = undefined else data = aget_X(t);
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dbytes, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
if signed then aset_X(t, SignExtend(data, regsize)) else aset_X(t, ZeroExtend(data, regsize))
},
MemOp_PREFETCH => Prefetch(address, __GetSlice_int(5, t, 0))
};
if wback then {
- if wb_unknown then address = undefined
- else if postindex then address = address + offset
- else ();
+ if wb_unknown then address = undefined else if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
-val aarch64_memory_single_general_immediate_signed_postidx : forall ('datasize : Int) ('regsize : Int).
- (AccType, atom('datasize), MemOp, int, bits(64), bool, atom('regsize), bool, int, bool) -> unit effect {escape, undef, rreg, wreg, wmem, rmem}
+val aarch64_memory_single_general_immediate_signed_postidx : (AccType, int, MemOp, int, bits(64), bool, int, bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_general_immediate_signed_postidx (acctype, datasize, memop, n, offset, postindex, regsize, signed, t, wback__arg) = {
- assert(constraint('regsize >= 0), "destsize constraint");
+function aarch64_memory_single_general_immediate_signed_postidx (acctype, 'datasize, memop, 'n, offset, postindex, 'regsize, signed, 't, wback__arg) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
@@ -9355,24 +9346,20 @@ function aarch64_memory_single_general_immediate_signed_postidx (acctype, datasi
if memop != MemOp_PREFETCH then CheckSPAlignment() else ();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
- if rt_unknown then data = undefined
- else data = aget_X(t);
- aset_Mem(address, dbytes, acctype, data)
+ if rt_unknown then data = undefined else data = aget_X(t);
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dbytes, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
if signed then aset_X(t, SignExtend(data, regsize)) else aset_X(t, ZeroExtend(data, regsize))
},
MemOp_PREFETCH => Prefetch(address, __GetSlice_int(5, t, 0))
};
if wback then {
- if wb_unknown then address = undefined
- else if postindex then address = address + offset
- else ();
+ if wb_unknown then address = undefined else if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
@@ -9409,11 +9396,10 @@ function aarch64_memory_single_general_immediate_signed_pac ('n, offset, 't, use
} else ()
}
-val aarch64_memory_single_general_immediate_signed_offset_unpriv : forall ('datasize : Int) ('regsize : Int).
- (AccType, atom('datasize), MemOp, int, bits(64), bool, atom('regsize), bool, int, bool) -> unit effect {escape, undef, rreg, wreg, rmem, wmem}
+val aarch64_memory_single_general_immediate_signed_offset_unpriv : (AccType, int, MemOp, int, bits(64), bool, int, bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_general_immediate_signed_offset_unpriv (acctype, datasize, memop, n, offset, postindex, regsize, signed, t, wback__arg) = {
- assert(constraint('regsize >= 0), "destsize constraint");
+function aarch64_memory_single_general_immediate_signed_offset_unpriv (acctype, 'datasize, memop, 'n, offset, postindex, 'regsize, signed, 't, wback__arg) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
@@ -9447,33 +9433,28 @@ function aarch64_memory_single_general_immediate_signed_offset_unpriv (acctype,
if memop != MemOp_PREFETCH then CheckSPAlignment() else ();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
- if rt_unknown then data = undefined
- else data = aget_X(t);
- aset_Mem(address, dbytes, acctype, data)
+ if rt_unknown then data = undefined else data = aget_X(t);
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dbytes, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
if signed then aset_X(t, SignExtend(data, regsize)) else aset_X(t, ZeroExtend(data, regsize))
},
MemOp_PREFETCH => Prefetch(address, __GetSlice_int(5, t, 0))
};
if wback then {
- if wb_unknown then address = undefined
- else if postindex then address = address + offset
- else ();
+ if wb_unknown then address = undefined else if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
-val aarch64_memory_single_general_immediate_signed_offset_normal : forall ('datasize : Int) ('regsize : Int).
- (AccType, atom('datasize), MemOp, int, bits(64), bool, atom('regsize), bool, int, bool) -> unit effect {escape, undef, rreg, wreg, rmem, wmem}
+val aarch64_memory_single_general_immediate_signed_offset_normal : (AccType, int, MemOp, int, bits(64), bool, int, bool, int, bool) -> unit effect {escape, rmem, rreg, undef, wmem, wreg}
-function aarch64_memory_single_general_immediate_signed_offset_normal (acctype, datasize, memop, n, offset, postindex, regsize, signed, t, wback__arg) = {
- assert(constraint('regsize >= 0), "destsize constraint");
+function aarch64_memory_single_general_immediate_signed_offset_normal (acctype, 'datasize, memop, 'n, offset, postindex, 'regsize, signed, 't, wback__arg) = {
+ assert(constraint('regsize >= 0), "regsize constraint");
let 'dbytes = ex_int(datasize / 8);
assert(constraint('datasize in {8, 16, 32, 64, 128}), "datasize constraint");
assert(constraint(8 * 'dbytes = 'datasize), "dbytes constraint");
@@ -9507,24 +9488,20 @@ function aarch64_memory_single_general_immediate_signed_offset_normal (acctype,
if memop != MemOp_PREFETCH then CheckSPAlignment() else ();
address = aget_SP()
} else address = aget_X(n);
- if ~(postindex) then address = address + offset
- else ();
+ if ~(postindex) then address = address + offset else ();
match memop {
MemOp_STORE => {
- if rt_unknown then data = undefined
- else data = aget_X(t);
- aset_Mem(address, dbytes, acctype, data)
+ if rt_unknown then data = undefined else data = aget_X(t);
+ aset_Mem(address, datasize / 8, acctype, data)
},
MemOp_LOAD => {
- data = aget_Mem(address, dbytes, acctype);
+ data = aget_Mem(address, datasize / 8, acctype);
if signed then aset_X(t, SignExtend(data, regsize)) else aset_X(t, ZeroExtend(data, regsize))
},
MemOp_PREFETCH => Prefetch(address, __GetSlice_int(5, t, 0))
};
if wback then {
- if wb_unknown then address = undefined
- else if postindex then address = address + offset
- else ();
+ if wb_unknown then address = undefined else if postindex then address = address + offset else ();
if n == 31 then aset_SP(address) else aset_X(n, address)
} else ()
}
@@ -9944,10 +9921,10 @@ function aarch64_memory_exclusive_pair (acctype, datasize, elsize, memop, n, pai
},
MemOp_LOAD => {
AArch64_SetExclusiveMonitors(address, dbytes);
- if pair then {
- assert(constraint(- 'elsize + 'datasize > 0 & 'elsize >= 0), "datasize constraint");
+ if pair then
if rt_unknown then aset_X(t, undefined : bits(32)) else if elsize == 32 then {
- data = aget_Mem(address, dbytes, acctype);
+ assert(constraint(- 'elsize + 'datasize > 0 & 'elsize >= 0), "datasize constraint");
+ data = aget_Mem(address, dbytes, acctype);
if BigEndian() then {
aset_X(t, slice(data, elsize, negate(elsize) + datasize));
aset_X(t2, slice(data, 0, elsize))
@@ -9964,7 +9941,7 @@ function aarch64_memory_exclusive_pair (acctype, datasize, elsize, memop, n, pai
aset_X(t, aget_Mem(address + 0, 8, acctype));
aset_X(t2, aget_Mem(address + 8, 8, acctype))
}
- } else {
+ else {
data = aget_Mem(address, dbytes, acctype);
aset_X(t, ZeroExtend(data, regsize))
}
diff --git a/aarch64/mono/demo/mk b/aarch64/mono/demo/mk
index d8ee4a9e..64abea6f 100755
--- a/aarch64/mono/demo/mk
+++ b/aarch64/mono/demo/mk
@@ -1,8 +1,8 @@
#!/bin/bash
set -ex
../../../sail ../../prelude.sail ../mono_rewrites.sail \
- aarch64_no_vector/aarch64_no_vector.sail aarch64_no_vector/decode_start.sail aarch64_no_vector/aarch64_no_vector_decode.sail aarch64_no_vector/decode_end.sail \
- -memo_z3 -undefined_gen \
+ aarch64_no_vector/spec.sail aarch64_no_vector/decode_start.sail aarch64_no_vector/decode.sail aarch64_no_vector/decode_end.sail \
+ -no_lexp_bounds_check -memo_z3 -undefined_gen \
-auto_mono -mono_rewrites -dall_split_errors -dmono_continue \
-lem -lem_mwords -lem_sequential -lem_lib Aarch64_extras -o aarch64_mono
lem -isa -lib ../../../src/gen_lib/ -lib ../../../src/lem_interp ../aarch64_extras.lem aarch64_mono_types.lem aarch64_mono.lem
diff --git a/src/monomorphise.ml b/src/monomorphise.ml
index 75b82da2..c743ac61 100644
--- a/src/monomorphise.ml
+++ b/src/monomorphise.ml
@@ -636,6 +636,7 @@ let nexp_subst_fns substs =
| LEXP_tup les -> re (LEXP_tup (List.map s_lexp les))
| LEXP_vector (le,e) -> re (LEXP_vector (s_lexp le, s_exp e))
| LEXP_vector_range (le,e1,e2) -> re (LEXP_vector_range (s_lexp le, s_exp e1, s_exp e2))
+ | LEXP_vector_concat les -> re (LEXP_vector_concat (List.map s_lexp les))
| LEXP_field (le,id) -> re (LEXP_field (s_lexp le, id))
| LEXP_deref e -> re (LEXP_deref (s_exp e))
in (s_pat,s_exp)
@@ -955,7 +956,9 @@ let rec assigned_vars_in_lexp (LEXP_aux (le,_)) =
match le with
| LEXP_id id
| LEXP_cast (_,id) -> IdSet.singleton id
- | LEXP_tup lexps -> List.fold_left (fun vs le -> IdSet.union vs (assigned_vars_in_lexp le)) IdSet.empty lexps
+ | LEXP_tup lexps
+ | LEXP_vector_concat lexps ->
+ List.fold_left (fun vs le -> IdSet.union vs (assigned_vars_in_lexp le)) IdSet.empty lexps
| LEXP_memory (_,es) -> List.fold_left (fun vs e -> IdSet.union vs (assigned_vars e)) IdSet.empty es
| LEXP_vector (le,e) -> IdSet.union (assigned_vars_in_lexp le) (assigned_vars e)
| LEXP_vector_range (le,e1,e2) ->
@@ -1468,6 +1471,7 @@ let split_defs all_errors splits defs =
re (LEXP_vector_range (fst (const_prop_lexp ref_vars substs assigns le),
fst (const_prop_exp ref_vars substs assigns e1),
fst (const_prop_exp ref_vars substs assigns e2)))
+ | LEXP_vector_concat les -> re (LEXP_vector_concat (List.map (fun le -> fst (const_prop_lexp ref_vars substs assigns le)) les))
| LEXP_field (le,id) -> re (LEXP_field (fst (const_prop_lexp ref_vars substs assigns le), id))
| LEXP_deref e ->
re (LEXP_deref (fst (const_prop_exp ref_vars substs assigns e)))
@@ -2014,6 +2018,7 @@ let split_defs all_errors splits defs =
| LEXP_tup les -> re (LEXP_tup (List.map map_lexp les))
| LEXP_vector (le,e) -> re (LEXP_vector (map_lexp le, map_exp e))
| LEXP_vector_range (le,e1,e2) -> re (LEXP_vector_range (map_lexp le, map_exp e1, map_exp e2))
+ | LEXP_vector_concat les -> re (LEXP_vector_concat (List.map map_lexp les))
| LEXP_field (le,id) -> re (LEXP_field (map_lexp le, id))
| LEXP_deref e -> re (LEXP_deref (map_exp e))
in map_pexp, map_letbind
@@ -3120,7 +3125,8 @@ and analyse_lexp fn_id env assigns deps (LEXP_aux (lexp,(l,_))) =
| LEXP_memory (id,es) ->
let _, assigns, r = analyse_exp fn_id env assigns (E_aux (E_tuple es,(Unknown,None))) in
assigns, r
- | LEXP_tup lexps ->
+ | LEXP_tup lexps
+ | LEXP_vector_concat lexps ->
List.fold_left (fun (assigns,r) lexp ->
let assigns,r' = analyse_lexp fn_id env assigns deps lexp
in assigns,merge r r') (assigns,empty) lexps