summaryrefslogtreecommitdiff
path: root/rvcontroller.lua
diff options
context:
space:
mode:
Diffstat (limited to 'rvcontroller.lua')
-rw-r--r--rvcontroller.lua32
1 files changed, 31 insertions, 1 deletions
diff --git a/rvcontroller.lua b/rvcontroller.lua
index ee66cd3..459116d 100644
--- a/rvcontroller.lua
+++ b/rvcontroller.lua
@@ -485,7 +485,7 @@ local function readcsr(address)
false, --Zkne
true, --Zknh
false, --Zksed
- false, --Zksh
+ true, --Zksh
true, --Zkt
true, --Ztso
false, --Zvbb
@@ -2212,6 +2212,32 @@ local operations = {
end
setreg(rd,implodebits(outputbits,32))
end,
+ sm3p0 = function(rd,rs1)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local srcbits = explodebits(getreg(rs1),32)
+ for i=0,31 do
+ outputbits[i] = srcbits[i]
+ xor(i,srcbits[(i-9)%32])
+ xor(i,srcbits[(i-17)%32])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sm3p1 = function(rd,rs1)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local srcbits = explodebits(getreg(rs1),32)
+ for i=0,31 do
+ outputbits[i] = srcbits[i]
+ xor(i,srcbits[(i-15)%32])
+ xor(i,srcbits[(i-23)%32])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
}
local function runinst(instruction)
@@ -2364,6 +2390,10 @@ local function runinst(instruction)
operations.sha256sig0(rd,rs1)
elseif f3 == 0x1 and imm == 0x103 then
operations.sha256sig1(rd,rs1)
+ elseif f3 == 0x1 and imm == 0x108 then
+ operations.sm3p0(rd,rs1)
+ elseif f3 == 0x1 and imm == 0x109 then
+ operations.sm3p1(rd,rs1)
elseif f3 == 0x5 and math.floor(imm/0x20) == 0x0 then
operations.srli(rd,rs1,imm%0x20)
elseif f3 == 0x5 and math.floor(imm/0x20) == 0x20 then