aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChih-Min Chao <chihmin.chao@sifive.com>2020-05-13 20:31:13 -0700
committerChih-Min Chao <chihmin.chao@sifive.com>2020-05-13 22:08:50 -0700
commite792aae0a95f4f4d12f9bcbc7da81db1d912ca8d (patch)
treeb6ad74452aebf760b172c5cf3dbf8a32e00cd139
parent7e75ab9f7417a1c31b1f97bd69a9683251b5224a (diff)
downloadspike-e792aae0a95f4f4d12f9bcbc7da81db1d912ca8d.zip
spike-e792aae0a95f4f4d12f9bcbc7da81db1d912ca8d.tar.gz
spike-e792aae0a95f4f4d12f9bcbc7da81db1d912ca8d.tar.bz2
rvv: change to 0.9amo
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
-rw-r--r--riscv/decode.h4
-rw-r--r--riscv/encoding.h162
-rw-r--r--riscv/insns/vamoadde16_v.h2
-rw-r--r--riscv/insns/vamoadde32_v.h2
-rw-r--r--riscv/insns/vamoadde64_v.h2
-rw-r--r--riscv/insns/vamoadde8_v.h2
-rw-r--r--riscv/insns/vamoadde_v.h2
-rw-r--r--riscv/insns/vamoande16_v.h2
-rw-r--r--riscv/insns/vamoande32_v.h2
-rw-r--r--riscv/insns/vamoande64_v.h2
-rw-r--r--riscv/insns/vamoande8_v.h2
-rw-r--r--riscv/insns/vamoande_v.h2
-rw-r--r--riscv/insns/vamomaxe16_v.h2
-rw-r--r--riscv/insns/vamomaxe32_v.h2
-rw-r--r--riscv/insns/vamomaxe64_v.h2
-rw-r--r--riscv/insns/vamomaxe8_v.h2
-rw-r--r--riscv/insns/vamomaxe_v.h2
-rw-r--r--riscv/insns/vamomaxue16_v.h2
-rw-r--r--riscv/insns/vamomaxue32_v.h2
-rw-r--r--riscv/insns/vamomaxue64_v.h2
-rw-r--r--riscv/insns/vamomaxue8_v.h2
-rw-r--r--riscv/insns/vamomaxue_v.h2
-rw-r--r--riscv/insns/vamomine16_v.h2
-rw-r--r--riscv/insns/vamomine32_v.h2
-rw-r--r--riscv/insns/vamomine64_v.h2
-rw-r--r--riscv/insns/vamomine8_v.h2
-rw-r--r--riscv/insns/vamomine_v.h2
-rw-r--r--riscv/insns/vamominue16_v.h2
-rw-r--r--riscv/insns/vamominue32_v.h2
-rw-r--r--riscv/insns/vamominue64_v.h2
-rw-r--r--riscv/insns/vamominue8_v.h2
-rw-r--r--riscv/insns/vamominue_v.h2
-rw-r--r--riscv/insns/vamoore16_v.h2
-rw-r--r--riscv/insns/vamoore32_v.h2
-rw-r--r--riscv/insns/vamoore64_v.h2
-rw-r--r--riscv/insns/vamoore8_v.h2
-rw-r--r--riscv/insns/vamoore_v.h2
-rw-r--r--riscv/insns/vamoswape16_v.h2
-rw-r--r--riscv/insns/vamoswape32_v.h2
-rw-r--r--riscv/insns/vamoswape64_v.h2
-rw-r--r--riscv/insns/vamoswape8_v.h2
-rw-r--r--riscv/insns/vamoswape_v.h2
-rw-r--r--riscv/insns/vamoxore16_v.h2
-rw-r--r--riscv/insns/vamoxore32_v.h2
-rw-r--r--riscv/insns/vamoxore64_v.h2
-rw-r--r--riscv/insns/vamoxore8_v.h2
-rw-r--r--riscv/insns/vamoxore_v.h2
-rw-r--r--riscv/riscv.mk.in45
-rw-r--r--spike_main/disasm.cc55
49 files changed, 254 insertions, 102 deletions
diff --git a/riscv/decode.h b/riscv/decode.h
index d4db8e7..218df98 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -1708,11 +1708,11 @@ for (reg_t i = 0; i < P.VU.vlmax && P.VU.vl != 0; ++i) { \
//
// vector: amo
//
-#define VI_AMO(op, type) \
+#define VI_AMO(op, type, idx_type) \
require_vector; \
require_extension(EXT_ZVAMO); \
VI_CHECK_SSS(false); \
- VI_DUPLICATE_VREG(insn.rs2(), P.VU.vlmax); \
+ VI_DUPLICATE_VREG(insn.rs2(), idx_type); \
const reg_t vl = P.VU.vl; \
const reg_t baseAddr = RS1; \
const reg_t vd = insn.rd(); \
diff --git a/riscv/encoding.h b/riscv/encoding.h
index ab5457c..61cf403 100644
--- a/riscv/encoding.h
+++ b/riscv/encoding.h
@@ -1663,42 +1663,78 @@
#define MASK_VWMACCUS_VX 0xfc00707f
#define MATCH_VWMACCSU_VX 0xfc006057
#define MASK_VWMACCSU_VX 0xfc00707f
-#define MATCH_VAMOSWAPW_V 0x800602f
-#define MASK_VAMOSWAPW_V 0xf800707f
-#define MATCH_VAMOADDW_V 0x602f
-#define MASK_VAMOADDW_V 0xf800707f
-#define MATCH_VAMOXORW_V 0x2000602f
-#define MASK_VAMOXORW_V 0xf800707f
-#define MATCH_VAMOANDW_V 0x6000602f
-#define MASK_VAMOANDW_V 0xf800707f
-#define MATCH_VAMOORW_V 0x4000602f
-#define MASK_VAMOORW_V 0xf800707f
-#define MATCH_VAMOMINW_V 0x8000602f
-#define MASK_VAMOMINW_V 0xf800707f
-#define MATCH_VAMOMAXW_V 0xa000602f
-#define MASK_VAMOMAXW_V 0xf800707f
-#define MATCH_VAMOMINUW_V 0xc000602f
-#define MASK_VAMOMINUW_V 0xf800707f
-#define MATCH_VAMOMAXUW_V 0xe000602f
-#define MASK_VAMOMAXUW_V 0xf800707f
-#define MATCH_VAMOSWAPE_V 0x800702f
-#define MASK_VAMOSWAPE_V 0xf800707f
-#define MATCH_VAMOADDE_V 0x702f
-#define MASK_VAMOADDE_V 0xf800707f
-#define MATCH_VAMOXORE_V 0x2000702f
-#define MASK_VAMOXORE_V 0xf800707f
-#define MATCH_VAMOANDE_V 0x6000702f
-#define MASK_VAMOANDE_V 0xf800707f
-#define MATCH_VAMOORE_V 0x4000702f
-#define MASK_VAMOORE_V 0xf800707f
-#define MATCH_VAMOMINE_V 0x8000702f
-#define MASK_VAMOMINE_V 0xf800707f
-#define MATCH_VAMOMAXE_V 0xa000702f
-#define MASK_VAMOMAXE_V 0xf800707f
-#define MATCH_VAMOMINUE_V 0xc000702f
-#define MASK_VAMOMINUE_V 0xf800707f
-#define MATCH_VAMOMAXUE_V 0xe000702f
-#define MASK_VAMOMAXUE_V 0xf800707f
+#define MATCH_VAMOSWAPE8_V 0x800002f
+#define MASK_VAMOSWAPE8_V 0xf800707f
+#define MATCH_VAMOADDE8_V 0x2f
+#define MASK_VAMOADDE8_V 0xf800707f
+#define MATCH_VAMOXORE8_V 0x2000002f
+#define MASK_VAMOXORE8_V 0xf800707f
+#define MATCH_VAMOANDE8_V 0x6000002f
+#define MASK_VAMOANDE8_V 0xf800707f
+#define MATCH_VAMOORE8_V 0x4000002f
+#define MASK_VAMOORE8_V 0xf800707f
+#define MATCH_VAMOMINE8_V 0x8000002f
+#define MASK_VAMOMINE8_V 0xf800707f
+#define MATCH_VAMOMAXE8_V 0xa000002f
+#define MASK_VAMOMAXE8_V 0xf800707f
+#define MATCH_VAMOMINUE8_V 0xc000002f
+#define MASK_VAMOMINUE8_V 0xf800707f
+#define MATCH_VAMOMAXUE8_V 0xe000002f
+#define MASK_VAMOMAXUE8_V 0xf800707f
+#define MATCH_VAMOSWAPE16_V 0x800502f
+#define MASK_VAMOSWAPE16_V 0xf800707f
+#define MATCH_VAMOADDE16_V 0x502f
+#define MASK_VAMOADDE16_V 0xf800707f
+#define MATCH_VAMOXORE16_V 0x2000502f
+#define MASK_VAMOXORE16_V 0xf800707f
+#define MATCH_VAMOANDE16_V 0x6000502f
+#define MASK_VAMOANDE16_V 0xf800707f
+#define MATCH_VAMOORE16_V 0x4000502f
+#define MASK_VAMOORE16_V 0xf800707f
+#define MATCH_VAMOMINE16_V 0x8000502f
+#define MASK_VAMOMINE16_V 0xf800707f
+#define MATCH_VAMOMAXE16_V 0xa000502f
+#define MASK_VAMOMAXE16_V 0xf800707f
+#define MATCH_VAMOMINUE16_V 0xc000502f
+#define MASK_VAMOMINUE16_V 0xf800707f
+#define MATCH_VAMOMAXUE16_V 0xe000502f
+#define MASK_VAMOMAXUE16_V 0xf800707f
+#define MATCH_VAMOSWAPE32_V 0x800602f
+#define MASK_VAMOSWAPE32_V 0xf800707f
+#define MATCH_VAMOADDE32_V 0x602f
+#define MASK_VAMOADDE32_V 0xf800707f
+#define MATCH_VAMOXORE32_V 0x2000602f
+#define MASK_VAMOXORE32_V 0xf800707f
+#define MATCH_VAMOANDE32_V 0x6000602f
+#define MASK_VAMOANDE32_V 0xf800707f
+#define MATCH_VAMOORE32_V 0x4000602f
+#define MASK_VAMOORE32_V 0xf800707f
+#define MATCH_VAMOMINE32_V 0x8000602f
+#define MASK_VAMOMINE32_V 0xf800707f
+#define MATCH_VAMOMAXE32_V 0xa000602f
+#define MASK_VAMOMAXE32_V 0xf800707f
+#define MATCH_VAMOMINUE32_V 0xc000602f
+#define MASK_VAMOMINUE32_V 0xf800707f
+#define MATCH_VAMOMAXUE32_V 0xe000602f
+#define MASK_VAMOMAXUE32_V 0xf800707f
+#define MATCH_VAMOSWAPE64_V 0x800702f
+#define MASK_VAMOSWAPE64_V 0xf800707f
+#define MATCH_VAMOADDE64_V 0x702f
+#define MASK_VAMOADDE64_V 0xf800707f
+#define MATCH_VAMOXORE64_V 0x2000702f
+#define MASK_VAMOXORE64_V 0xf800707f
+#define MATCH_VAMOANDE64_V 0x6000702f
+#define MASK_VAMOANDE64_V 0xf800707f
+#define MATCH_VAMOORE64_V 0x4000702f
+#define MASK_VAMOORE64_V 0xf800707f
+#define MATCH_VAMOMINE64_V 0x8000702f
+#define MASK_VAMOMINE64_V 0xf800707f
+#define MATCH_VAMOMAXE64_V 0xa000702f
+#define MASK_VAMOMAXE64_V 0xf800707f
+#define MATCH_VAMOMINUE64_V 0xc000702f
+#define MASK_VAMOMINUE64_V 0xf800707f
+#define MATCH_VAMOMAXUE64_V 0xe000702f
+#define MASK_VAMOMAXUE64_V 0xf800707f
#define MATCH_VMVNFR_V 0x9e003057
#define MASK_VMVNFR_V 0xfe00707f
#define CSR_FFLAGS 0x1
@@ -2703,24 +2739,42 @@ DECLARE_INSN(vwmaccu_vx, MATCH_VWMACCU_VX, MASK_VWMACCU_VX)
DECLARE_INSN(vwmacc_vx, MATCH_VWMACC_VX, MASK_VWMACC_VX)
DECLARE_INSN(vwmaccus_vx, MATCH_VWMACCUS_VX, MASK_VWMACCUS_VX)
DECLARE_INSN(vwmaccsu_vx, MATCH_VWMACCSU_VX, MASK_VWMACCSU_VX)
-DECLARE_INSN(vamoswapw_v, MATCH_VAMOSWAPW_V, MASK_VAMOSWAPW_V)
-DECLARE_INSN(vamoaddw_v, MATCH_VAMOADDW_V, MASK_VAMOADDW_V)
-DECLARE_INSN(vamoxorw_v, MATCH_VAMOXORW_V, MASK_VAMOXORW_V)
-DECLARE_INSN(vamoandw_v, MATCH_VAMOANDW_V, MASK_VAMOANDW_V)
-DECLARE_INSN(vamoorw_v, MATCH_VAMOORW_V, MASK_VAMOORW_V)
-DECLARE_INSN(vamominw_v, MATCH_VAMOMINW_V, MASK_VAMOMINW_V)
-DECLARE_INSN(vamomaxw_v, MATCH_VAMOMAXW_V, MASK_VAMOMAXW_V)
-DECLARE_INSN(vamominuw_v, MATCH_VAMOMINUW_V, MASK_VAMOMINUW_V)
-DECLARE_INSN(vamomaxuw_v, MATCH_VAMOMAXUW_V, MASK_VAMOMAXUW_V)
-DECLARE_INSN(vamoswape_v, MATCH_VAMOSWAPE_V, MASK_VAMOSWAPE_V)
-DECLARE_INSN(vamoadde_v, MATCH_VAMOADDE_V, MASK_VAMOADDE_V)
-DECLARE_INSN(vamoxore_v, MATCH_VAMOXORE_V, MASK_VAMOXORE_V)
-DECLARE_INSN(vamoande_v, MATCH_VAMOANDE_V, MASK_VAMOANDE_V)
-DECLARE_INSN(vamoore_v, MATCH_VAMOORE_V, MASK_VAMOORE_V)
-DECLARE_INSN(vamomine_v, MATCH_VAMOMINE_V, MASK_VAMOMINE_V)
-DECLARE_INSN(vamomaxe_v, MATCH_VAMOMAXE_V, MASK_VAMOMAXE_V)
-DECLARE_INSN(vamominue_v, MATCH_VAMOMINUE_V, MASK_VAMOMINUE_V)
-DECLARE_INSN(vamomaxue_v, MATCH_VAMOMAXUE_V, MASK_VAMOMAXUE_V)
+DECLARE_INSN(vamoswape8_v, MATCH_VAMOSWAPE8_V, MASK_VAMOSWAPE8_V)
+DECLARE_INSN(vamoadde8_v, MATCH_VAMOADDE8_V, MASK_VAMOADDE8_V)
+DECLARE_INSN(vamoxore8_v, MATCH_VAMOXORE8_V, MASK_VAMOXORE8_V)
+DECLARE_INSN(vamoande8_v, MATCH_VAMOANDE8_V, MASK_VAMOANDE8_V)
+DECLARE_INSN(vamoore8_v, MATCH_VAMOORE8_V, MASK_VAMOORE8_V)
+DECLARE_INSN(vamomine8_v, MATCH_VAMOMINE8_V, MASK_VAMOMINE8_V)
+DECLARE_INSN(vamomaxe8_v, MATCH_VAMOMAXE8_V, MASK_VAMOMAXE8_V)
+DECLARE_INSN(vamominue8_v, MATCH_VAMOMINUE8_V, MASK_VAMOMINUE8_V)
+DECLARE_INSN(vamomaxue8_v, MATCH_VAMOMAXUE8_V, MASK_VAMOMAXUE8_V)
+DECLARE_INSN(vamoswape16_v, MATCH_VAMOSWAPE16_V, MASK_VAMOSWAPE16_V)
+DECLARE_INSN(vamoadde16_v, MATCH_VAMOADDE16_V, MASK_VAMOADDE16_V)
+DECLARE_INSN(vamoxore16_v, MATCH_VAMOXORE16_V, MASK_VAMOXORE16_V)
+DECLARE_INSN(vamoande16_v, MATCH_VAMOANDE16_V, MASK_VAMOANDE16_V)
+DECLARE_INSN(vamoore16_v, MATCH_VAMOORE16_V, MASK_VAMOORE16_V)
+DECLARE_INSN(vamomine16_v, MATCH_VAMOMINE16_V, MASK_VAMOMINE16_V)
+DECLARE_INSN(vamomaxe16_v, MATCH_VAMOMAXE16_V, MASK_VAMOMAXE16_V)
+DECLARE_INSN(vamominue16_v, MATCH_VAMOMINUE16_V, MASK_VAMOMINUE16_V)
+DECLARE_INSN(vamomaxue16_v, MATCH_VAMOMAXUE16_V, MASK_VAMOMAXUE16_V)
+DECLARE_INSN(vamoswape32_v, MATCH_VAMOSWAPE32_V, MASK_VAMOSWAPE32_V)
+DECLARE_INSN(vamoadde32_v, MATCH_VAMOADDE32_V, MASK_VAMOADDE32_V)
+DECLARE_INSN(vamoxore32_v, MATCH_VAMOXORE32_V, MASK_VAMOXORE32_V)
+DECLARE_INSN(vamoande32_v, MATCH_VAMOANDE32_V, MASK_VAMOANDE32_V)
+DECLARE_INSN(vamoore32_v, MATCH_VAMOORE32_V, MASK_VAMOORE32_V)
+DECLARE_INSN(vamomine32_v, MATCH_VAMOMINE32_V, MASK_VAMOMINE32_V)
+DECLARE_INSN(vamomaxe32_v, MATCH_VAMOMAXE32_V, MASK_VAMOMAXE32_V)
+DECLARE_INSN(vamominue32_v, MATCH_VAMOMINUE32_V, MASK_VAMOMINUE32_V)
+DECLARE_INSN(vamomaxue32_v, MATCH_VAMOMAXUE32_V, MASK_VAMOMAXUE32_V)
+DECLARE_INSN(vamoswape64_v, MATCH_VAMOSWAPE64_V, MASK_VAMOSWAPE64_V)
+DECLARE_INSN(vamoadde64_v, MATCH_VAMOADDE64_V, MASK_VAMOADDE64_V)
+DECLARE_INSN(vamoxore64_v, MATCH_VAMOXORE64_V, MASK_VAMOXORE64_V)
+DECLARE_INSN(vamoande64_v, MATCH_VAMOANDE64_V, MASK_VAMOANDE64_V)
+DECLARE_INSN(vamoore64_v, MATCH_VAMOORE64_V, MASK_VAMOORE64_V)
+DECLARE_INSN(vamomine64_v, MATCH_VAMOMINE64_V, MASK_VAMOMINE64_V)
+DECLARE_INSN(vamomaxe64_v, MATCH_VAMOMAXE64_V, MASK_VAMOMAXE64_V)
+DECLARE_INSN(vamominue64_v, MATCH_VAMOMINUE64_V, MASK_VAMOMINUE64_V)
+DECLARE_INSN(vamomaxue64_v, MATCH_VAMOMAXUE64_V, MASK_VAMOMAXUE64_V)
DECLARE_INSN(vmvnfr_v, MATCH_VMVNFR_V, MASK_VMVNFR_V)
#endif
#ifdef DECLARE_CSR
diff --git a/riscv/insns/vamoadde16_v.h b/riscv/insns/vamoadde16_v.h
new file mode 100644
index 0000000..06b8c79
--- /dev/null
+++ b/riscv/insns/vamoadde16_v.h
@@ -0,0 +1,2 @@
+//vamoadde.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs + vs3; }, uint, e8);
diff --git a/riscv/insns/vamoadde32_v.h b/riscv/insns/vamoadde32_v.h
new file mode 100644
index 0000000..06b8c79
--- /dev/null
+++ b/riscv/insns/vamoadde32_v.h
@@ -0,0 +1,2 @@
+//vamoadde.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs + vs3; }, uint, e8);
diff --git a/riscv/insns/vamoadde64_v.h b/riscv/insns/vamoadde64_v.h
new file mode 100644
index 0000000..06b8c79
--- /dev/null
+++ b/riscv/insns/vamoadde64_v.h
@@ -0,0 +1,2 @@
+//vamoadde.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs + vs3; }, uint, e8);
diff --git a/riscv/insns/vamoadde8_v.h b/riscv/insns/vamoadde8_v.h
new file mode 100644
index 0000000..06b8c79
--- /dev/null
+++ b/riscv/insns/vamoadde8_v.h
@@ -0,0 +1,2 @@
+//vamoadde.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs + vs3; }, uint, e8);
diff --git a/riscv/insns/vamoadde_v.h b/riscv/insns/vamoadde_v.h
deleted file mode 100644
index 9e59bdd..0000000
--- a/riscv/insns/vamoadde_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamoadde.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs + vs3; }, uint);
diff --git a/riscv/insns/vamoande16_v.h b/riscv/insns/vamoande16_v.h
new file mode 100644
index 0000000..c47645d
--- /dev/null
+++ b/riscv/insns/vamoande16_v.h
@@ -0,0 +1,2 @@
+//vamoande.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs & vs3; }, uint, e8);
diff --git a/riscv/insns/vamoande32_v.h b/riscv/insns/vamoande32_v.h
new file mode 100644
index 0000000..c47645d
--- /dev/null
+++ b/riscv/insns/vamoande32_v.h
@@ -0,0 +1,2 @@
+//vamoande.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs & vs3; }, uint, e8);
diff --git a/riscv/insns/vamoande64_v.h b/riscv/insns/vamoande64_v.h
new file mode 100644
index 0000000..c47645d
--- /dev/null
+++ b/riscv/insns/vamoande64_v.h
@@ -0,0 +1,2 @@
+//vamoande.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs & vs3; }, uint, e8);
diff --git a/riscv/insns/vamoande8_v.h b/riscv/insns/vamoande8_v.h
new file mode 100644
index 0000000..c47645d
--- /dev/null
+++ b/riscv/insns/vamoande8_v.h
@@ -0,0 +1,2 @@
+//vamoande.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs & vs3; }, uint, e8);
diff --git a/riscv/insns/vamoande_v.h b/riscv/insns/vamoande_v.h
deleted file mode 100644
index 90eb60d..0000000
--- a/riscv/insns/vamoande_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamoande.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs & vs3; }, uint);
diff --git a/riscv/insns/vamomaxe16_v.h b/riscv/insns/vamomaxe16_v.h
new file mode 100644
index 0000000..9697b3a
--- /dev/null
+++ b/riscv/insns/vamomaxe16_v.h
@@ -0,0 +1,2 @@
+//vamomaxe.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomaxe32_v.h b/riscv/insns/vamomaxe32_v.h
new file mode 100644
index 0000000..9697b3a
--- /dev/null
+++ b/riscv/insns/vamomaxe32_v.h
@@ -0,0 +1,2 @@
+//vamomaxe.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomaxe64_v.h b/riscv/insns/vamomaxe64_v.h
new file mode 100644
index 0000000..9697b3a
--- /dev/null
+++ b/riscv/insns/vamomaxe64_v.h
@@ -0,0 +1,2 @@
+//vamomaxe.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomaxe8_v.h b/riscv/insns/vamomaxe8_v.h
new file mode 100644
index 0000000..9697b3a
--- /dev/null
+++ b/riscv/insns/vamomaxe8_v.h
@@ -0,0 +1,2 @@
+//vamomaxe.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomaxe_v.h b/riscv/insns/vamomaxe_v.h
deleted file mode 100644
index ab6539d..0000000
--- a/riscv/insns/vamomaxe_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamomaxe.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs >= vs3 ? lhs : vs3; }, int);
diff --git a/riscv/insns/vamomaxue16_v.h b/riscv/insns/vamomaxue16_v.h
new file mode 100644
index 0000000..357ba24
--- /dev/null
+++ b/riscv/insns/vamomaxue16_v.h
@@ -0,0 +1,2 @@
+//vamomaxue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamomaxue32_v.h b/riscv/insns/vamomaxue32_v.h
new file mode 100644
index 0000000..357ba24
--- /dev/null
+++ b/riscv/insns/vamomaxue32_v.h
@@ -0,0 +1,2 @@
+//vamomaxue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamomaxue64_v.h b/riscv/insns/vamomaxue64_v.h
new file mode 100644
index 0000000..357ba24
--- /dev/null
+++ b/riscv/insns/vamomaxue64_v.h
@@ -0,0 +1,2 @@
+//vamomaxue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamomaxue8_v.h b/riscv/insns/vamomaxue8_v.h
new file mode 100644
index 0000000..357ba24
--- /dev/null
+++ b/riscv/insns/vamomaxue8_v.h
@@ -0,0 +1,2 @@
+//vamomaxue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs >= vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamomaxue_v.h b/riscv/insns/vamomaxue_v.h
deleted file mode 100644
index 1bdc50c..0000000
--- a/riscv/insns/vamomaxue_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamomaxue.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs >= vs3 ? lhs : vs3;; }, uint);
diff --git a/riscv/insns/vamomine16_v.h b/riscv/insns/vamomine16_v.h
new file mode 100644
index 0000000..5c035ea
--- /dev/null
+++ b/riscv/insns/vamomine16_v.h
@@ -0,0 +1,2 @@
+//vamomine.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomine32_v.h b/riscv/insns/vamomine32_v.h
new file mode 100644
index 0000000..5c035ea
--- /dev/null
+++ b/riscv/insns/vamomine32_v.h
@@ -0,0 +1,2 @@
+//vamomine.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomine64_v.h b/riscv/insns/vamomine64_v.h
new file mode 100644
index 0000000..5c035ea
--- /dev/null
+++ b/riscv/insns/vamomine64_v.h
@@ -0,0 +1,2 @@
+//vamomine.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomine8_v.h b/riscv/insns/vamomine8_v.h
new file mode 100644
index 0000000..5c035ea
--- /dev/null
+++ b/riscv/insns/vamomine8_v.h
@@ -0,0 +1,2 @@
+//vamomine.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3; }, int, e8);
diff --git a/riscv/insns/vamomine_v.h b/riscv/insns/vamomine_v.h
deleted file mode 100644
index fd931b2..0000000
--- a/riscv/insns/vamomine_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamomine.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs < vs3 ? lhs : vs3; }, int);
diff --git a/riscv/insns/vamominue16_v.h b/riscv/insns/vamominue16_v.h
new file mode 100644
index 0000000..3749d05
--- /dev/null
+++ b/riscv/insns/vamominue16_v.h
@@ -0,0 +1,2 @@
+//vamominue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamominue32_v.h b/riscv/insns/vamominue32_v.h
new file mode 100644
index 0000000..3749d05
--- /dev/null
+++ b/riscv/insns/vamominue32_v.h
@@ -0,0 +1,2 @@
+//vamominue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamominue64_v.h b/riscv/insns/vamominue64_v.h
new file mode 100644
index 0000000..3749d05
--- /dev/null
+++ b/riscv/insns/vamominue64_v.h
@@ -0,0 +1,2 @@
+//vamominue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamominue8_v.h b/riscv/insns/vamominue8_v.h
new file mode 100644
index 0000000..3749d05
--- /dev/null
+++ b/riscv/insns/vamominue8_v.h
@@ -0,0 +1,2 @@
+//vamominue.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs < vs3 ? lhs : vs3;; }, uint, e8);
diff --git a/riscv/insns/vamominue_v.h b/riscv/insns/vamominue_v.h
deleted file mode 100644
index d8616da..0000000
--- a/riscv/insns/vamominue_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamominue.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs < vs3 ? lhs : vs3;; }, uint);
diff --git a/riscv/insns/vamoore16_v.h b/riscv/insns/vamoore16_v.h
new file mode 100644
index 0000000..364035d
--- /dev/null
+++ b/riscv/insns/vamoore16_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs | vs3; }, uint, e8);
diff --git a/riscv/insns/vamoore32_v.h b/riscv/insns/vamoore32_v.h
new file mode 100644
index 0000000..364035d
--- /dev/null
+++ b/riscv/insns/vamoore32_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs | vs3; }, uint, e8);
diff --git a/riscv/insns/vamoore64_v.h b/riscv/insns/vamoore64_v.h
new file mode 100644
index 0000000..364035d
--- /dev/null
+++ b/riscv/insns/vamoore64_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs | vs3; }, uint, e8);
diff --git a/riscv/insns/vamoore8_v.h b/riscv/insns/vamoore8_v.h
new file mode 100644
index 0000000..364035d
--- /dev/null
+++ b/riscv/insns/vamoore8_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs | vs3; }, uint, e8);
diff --git a/riscv/insns/vamoore_v.h b/riscv/insns/vamoore_v.h
deleted file mode 100644
index c35789c..0000000
--- a/riscv/insns/vamoore_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamoore.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs | vs3; }, uint);
diff --git a/riscv/insns/vamoswape16_v.h b/riscv/insns/vamoswape16_v.h
new file mode 100644
index 0000000..af37c8c
--- /dev/null
+++ b/riscv/insns/vamoswape16_v.h
@@ -0,0 +1,2 @@
+//vamoswape.v vd, (rs1), vs2, vd
+VI_AMO({ return vs3; }, uint, e8);
diff --git a/riscv/insns/vamoswape32_v.h b/riscv/insns/vamoswape32_v.h
new file mode 100644
index 0000000..af37c8c
--- /dev/null
+++ b/riscv/insns/vamoswape32_v.h
@@ -0,0 +1,2 @@
+//vamoswape.v vd, (rs1), vs2, vd
+VI_AMO({ return vs3; }, uint, e8);
diff --git a/riscv/insns/vamoswape64_v.h b/riscv/insns/vamoswape64_v.h
new file mode 100644
index 0000000..af37c8c
--- /dev/null
+++ b/riscv/insns/vamoswape64_v.h
@@ -0,0 +1,2 @@
+//vamoswape.v vd, (rs1), vs2, vd
+VI_AMO({ return vs3; }, uint, e8);
diff --git a/riscv/insns/vamoswape8_v.h b/riscv/insns/vamoswape8_v.h
new file mode 100644
index 0000000..af37c8c
--- /dev/null
+++ b/riscv/insns/vamoswape8_v.h
@@ -0,0 +1,2 @@
+//vamoswape.v vd, (rs1), vs2, vd
+VI_AMO({ return vs3; }, uint, e8);
diff --git a/riscv/insns/vamoswape_v.h b/riscv/insns/vamoswape_v.h
deleted file mode 100644
index 4cc15cb..0000000
--- a/riscv/insns/vamoswape_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamoswape.v vd, (rs1), vs2, vd
-VI_AMO({ return vs3; }, uint);
diff --git a/riscv/insns/vamoxore16_v.h b/riscv/insns/vamoxore16_v.h
new file mode 100644
index 0000000..4b6c798
--- /dev/null
+++ b/riscv/insns/vamoxore16_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs ^ vs3; }, uint, e8);
diff --git a/riscv/insns/vamoxore32_v.h b/riscv/insns/vamoxore32_v.h
new file mode 100644
index 0000000..4b6c798
--- /dev/null
+++ b/riscv/insns/vamoxore32_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs ^ vs3; }, uint, e8);
diff --git a/riscv/insns/vamoxore64_v.h b/riscv/insns/vamoxore64_v.h
new file mode 100644
index 0000000..4b6c798
--- /dev/null
+++ b/riscv/insns/vamoxore64_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs ^ vs3; }, uint, e8);
diff --git a/riscv/insns/vamoxore8_v.h b/riscv/insns/vamoxore8_v.h
new file mode 100644
index 0000000..4b6c798
--- /dev/null
+++ b/riscv/insns/vamoxore8_v.h
@@ -0,0 +1,2 @@
+//vamoore.v vd, (rs1), vs2, vd
+VI_AMO({ return lhs ^ vs3; }, uint, e8);
diff --git a/riscv/insns/vamoxore_v.h b/riscv/insns/vamoxore_v.h
deleted file mode 100644
index 7eb1199..0000000
--- a/riscv/insns/vamoxore_v.h
+++ /dev/null
@@ -1,2 +0,0 @@
-//vamoore.v vd, (rs1), vs2, vd
-VI_AMO({ return lhs ^ vs3; }, uint);
diff --git a/riscv/riscv.mk.in b/riscv/riscv.mk.in
index eeff3d0..768439f 100644
--- a/riscv/riscv.mk.in
+++ b/riscv/riscv.mk.in
@@ -646,15 +646,42 @@ riscv_insn_ext_v_alu_fp = \
vmfne_vv \
riscv_insn_ext_v_amo = \
- vamoswape_v \
- vamoadde_v \
- vamoande_v \
- vamomaxe_v \
- vamomaxue_v \
- vamomine_v \
- vamominue_v \
- vamoore_v \
- vamoxore_v \
+ vamoswape8_v \
+ vamoadde8_v \
+ vamoande8_v \
+ vamomaxe8_v \
+ vamomaxue8_v \
+ vamomine8_v \
+ vamominue8_v \
+ vamoore8_v \
+ vamoxore8_v \
+ vamoswape16_v \
+ vamoadde16_v \
+ vamoande16_v \
+ vamomaxe16_v \
+ vamomaxue16_v \
+ vamomine16_v \
+ vamominue16_v \
+ vamoore16_v \
+ vamoxore16_v \
+ vamoswape32_v \
+ vamoadde32_v \
+ vamoande32_v \
+ vamomaxe32_v \
+ vamomaxue32_v \
+ vamomine32_v \
+ vamominue32_v \
+ vamoore32_v \
+ vamoxore32_v \
+ vamoswape64_v \
+ vamoadde64_v \
+ vamoande64_v \
+ vamomaxe64_v \
+ vamomaxue64_v \
+ vamomine64_v \
+ vamominue64_v \
+ vamoore64_v \
+ vamoxore64_v \
riscv_insn_ext_v_ldst = \
vle8_v \
diff --git a/spike_main/disasm.cc b/spike_main/disasm.cc
index 571ec23..fbfa869 100644
--- a/spike_main/disasm.cc
+++ b/spike_main/disasm.cc
@@ -382,6 +382,8 @@ disassembler_t::disassembler_t(int xlen)
const uint32_t mask_nf = 0x7Ul << 29;
const uint32_t mask_wd = 0x1Ul << 26;
const uint32_t mask_vldst = 0x7Ul << 12 | 0x1UL << 28;
+ const uint32_t mask_amoop = 0x1fUl;
+ const uint32_t mask_width = 0x7Ul << 12;
#define DECLARE_INSN(code, match, mask) \
const uint32_t match_##code = match; \
@@ -1149,25 +1151,40 @@ disassembler_t::disassembler_t(int xlen)
#undef DISASM_OPIV_W__INSN
#undef DISASM_VFUNARY0_INSN
- #define DISASM_VAMO_INSN(name) \
- add_insn(new disasm_insn_t(#name "e.v", match_##name##e_v | mask_wd, \
- mask_##name##e_v | mask_wd, \
- {&vd, &v_address, &vs2, &vd, &opt, &vm})); \
- add_insn(new disasm_insn_t(#name "e.v", match_##name##e_v, \
- mask_##name##e_v | mask_wd, \
- {&x0, &v_address, &vs2, &vd, &opt, &vm}));
-
- DISASM_VAMO_INSN(vamoswap);
- DISASM_VAMO_INSN(vamoadd);
- DISASM_VAMO_INSN(vamoxor);
- DISASM_VAMO_INSN(vamoand);
- DISASM_VAMO_INSN(vamoor);
- DISASM_VAMO_INSN(vamomin);
- DISASM_VAMO_INSN(vamomax);
- DISASM_VAMO_INSN(vamominu);
- DISASM_VAMO_INSN(vamomaxu);
-
- #undef DISASM_VAMO_INSN
+ // vector amo
+ std::vector<const arg_t *> v_fmt_amo_wd = {&vd, &v_address, &vs2, &vd, &opt, &vm};
+ std::vector<const arg_t *> v_fmt_amo = {&x0, &v_address, &vs2, &vd, &opt, &vm};
+ for (size_t elt = 0; elt <= 3; ++elt) {
+ const ldst_seg_t template_insn[] = {
+ {match_vamoswape8_v | mask_wd, mask_vamoswape8_v | mask_wd,
+ "%se%d.v", v_fmt_amo_wd},
+ {match_vamoswape8_v, mask_vamoswape8_v | mask_wd,
+ "%se%d.v", v_fmt_amo},
+ };
+ std::pair<const char*, reg_t> amo_map[] = {
+ {"vamoswap", 0x01ul << 27},
+ {"vamoadd", 0x00ul << 27},
+ {"vamoxor", 0x04ul << 27},
+ {"vamoor", 0x0cul << 27},
+ {"vamomin", 0x10ul << 27},
+ {"vamomax", 0x14ul << 27},
+ {"vamominu", 0x18ul << 27},
+ {"vamomaxu", 0x1cul << 27}};
+ const reg_t elt_map[] = {0x0ul << 12, 0x4ul << 12,
+ 0x6ul <<12, 0x7ul << 12};
+
+ for (size_t idx = 0; idx < sizeof(amo_map) / sizeof(amo_map[0]); ++idx) {
+ for (auto item : template_insn) {
+ char buf[128];
+ sprintf(buf, item.fmt, amo_map[idx].first, 8 << elt);
+ add_insn(new disasm_insn_t(buf,
+ (item.match & ~mask_width & ~mask_amoop) |
+ (amo_map[idx].second | elt_map[elt]),
+ item.mask,
+ item.arg));
+ }
+ }
+ }
if (xlen == 32) {
DISASM_INSN("c.flw", c_flw, 0, {&rvc_fp_rs2s, &rvc_lw_address});