diff options
author | Bilal Sakhawat <63648044+bilalsakhawat-10xe@users.noreply.github.com> | 2022-01-21 15:06:54 +0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-21 10:06:54 +0000 |
commit | 4da2ab1df34056d7a7c0d033dc7f43c50a6d2db4 (patch) | |
tree | 742e28f313eaa677eb05d225907d04d384ba2367 /model/riscv_insts_zbkx.sail | |
parent | 5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac (diff) | |
download | sail-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.sail | 45 |
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 +} |