aboutsummaryrefslogtreecommitdiff
path: root/model/riscv_insts_zbkx.sail
diff options
context:
space:
mode:
authorBilal Sakhawat <63648044+bilalsakhawat-10xe@users.noreply.github.com>2022-01-21 15:06:54 +0500
committerGitHub <noreply@github.com>2022-01-21 10:06:54 +0000
commit4da2ab1df34056d7a7c0d033dc7f43c50a6d2db4 (patch)
tree742e28f313eaa677eb05d225907d04d384ba2367 /model/riscv_insts_zbkx.sail
parent5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac (diff)
downloadsail-riscv-4da2ab1df34056d7a7c0d033dc7f43c50a6d2db4.zip
sail-riscv-4da2ab1df34056d7a7c0d033dc7f43c50a6d2db4.tar.gz
sail-riscv-4da2ab1df34056d7a7c0d033dc7f43c50a6d2db4.tar.bz2
Add support for Scalar Cryptography Zbkb, Zbkc and Zbkx Extensions (#135)
Diffstat (limited to 'model/riscv_insts_zbkx.sail')
-rw-r--r--model/riscv_insts_zbkx.sail45
1 files changed, 45 insertions, 0 deletions
diff --git a/model/riscv_insts_zbkx.sail b/model/riscv_insts_zbkx.sail
new file mode 100644
index 0000000..890facf
--- /dev/null
+++ b/model/riscv_insts_zbkx.sail
@@ -0,0 +1,45 @@
+/* ****************************************************************** */
+union clause ast = RISCV_XPERM8 : (regidx, regidx, regidx)
+
+mapping clause encdec = RISCV_XPERM8(rs2, rs1, rd) if haveZbkx()
+ <-> 0b0010100 @ rs2 @ rs1 @ 0b100 @ rd @ 0b0110011 if haveZbkx()
+
+mapping clause assembly = RISCV_XPERM8(rs2, rs1, rd)
+ <-> "xperm8" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2)
+
+function clause execute (RISCV_XPERM8(rs2, rs1, rd)) = {
+ let rs1_val = X(rs1);
+ let rs2_val = X(rs2);
+ result : xlenbits = zeros();
+ foreach (i from 0 to (sizeof(xlen) - 8) by 8) {
+ let index = unsigned(rs2_val[i+7..i]);
+ result[i+7..i] = if 8*index < sizeof(xlen)
+ then rs1_val[8*index+7..8*index]
+ else zeros()
+ };
+ X(rd) = result;
+ RETIRE_SUCCESS
+}
+
+/* ****************************************************************** */
+union clause ast = RISCV_XPERM4 : (regidx, regidx, regidx)
+
+mapping clause encdec = RISCV_XPERM4(rs2, rs1, rd) if haveZbkx()
+ <-> 0b0010100 @ rs2 @ rs1 @ 0b010 @ rd @ 0b0110011 if haveZbkx()
+
+mapping clause assembly = RISCV_XPERM4(rs2, rs1, rd)
+ <-> "xperm4" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2)
+
+function clause execute (RISCV_XPERM4(rs2, rs1, rd)) = {
+ let rs1_val = X(rs1);
+ let rs2_val = X(rs2);
+ result : xlenbits = zeros();
+ foreach (i from 0 to (sizeof(xlen) - 4) by 4) {
+ let index = unsigned(rs2_val[i+3..i]);
+ result[i+3..i] = if 8*index < sizeof(xlen)
+ then rs1_val[8*index+3..8*index]
+ else zeros()
+ };
+ X(rd) = result;
+ RETIRE_SUCCESS
+}