summaryrefslogtreecommitdiff
path: root/rvcontroller.lua
diff options
context:
space:
mode:
Diffstat (limited to 'rvcontroller.lua')
-rw-r--r--rvcontroller.lua166
1 files changed, 165 insertions, 1 deletions
diff --git a/rvcontroller.lua b/rvcontroller.lua
index 8033a01..ee66cd3 100644
--- a/rvcontroller.lua
+++ b/rvcontroller.lua
@@ -483,7 +483,7 @@ local function readcsr(address)
true, --Zihintpause
false, --Zknd
false, --Zkne
- false, --Zknh
+ true, --Zknh
false, --Zksed
false, --Zksh
true, --Zkt
@@ -2068,6 +2068,150 @@ local operations = {
end
setreg(rd,implodebits(outputbits,32))
end,
+ sha256sig0 = 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+7)%32] end
+ for i=0,31 do xor(i,srcbits[(i+18)%32]) end
+ for i=0,31 do xor(i,srcbits[i+3]) end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha256sig1 = 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+17)%32] end
+ for i=0,31 do xor(i,srcbits[(i+19)%32]) end
+ for i=0,31 do xor(i,srcbits[i+10]) end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha256sum0 = 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+2)%32] end
+ for i=0,31 do xor(i,srcbits[(i+13)%32]) end
+ for i=0,31 do xor(i,srcbits[(i+22)%32]) end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha256sum1 = 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+6)%32] end
+ for i=0,31 do xor(i,srcbits[(i+11)%32]) end
+ for i=0,31 do xor(i,srcbits[(i+25)%32]) end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha512sig0l = function(rd,rs1,rs2)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local src1bits = explodebits(getreg(rs1),32)
+ local src2bits = explodebits(getreg(rs2),32)
+ for i=0,31 do
+ outputbits[i] = src1bits[i+1]
+ xor(i,src1bits[i+7])
+ xor(i,src1bits[i+8])
+ xor(i,src2bits[i-31])
+ xor(i,src2bits[i-25])
+ xor(i,src2bits[i-24])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha512sig0h = function(rd,rs1,rs2)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local src1bits = explodebits(getreg(rs1),32)
+ local src2bits = explodebits(getreg(rs2),32)
+ for i=0,31 do
+ outputbits[i] = src1bits[i+1]
+ xor(i,src1bits[i+7])
+ xor(i,src1bits[i+8])
+ xor(i,src2bits[i-31])
+ xor(i,src2bits[i-24])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha512sig1h = function(rd,rs1,rs2)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local src1bits = explodebits(getreg(rs1),32)
+ local src2bits = explodebits(getreg(rs2),32)
+ for i=0,31 do
+ outputbits[i] = src1bits[i-3]
+ xor(i,src1bits[i+6])
+ xor(i,src1bits[i+19])
+ xor(i,src2bits[i+29])
+ xor(i,src2bits[i-13])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha512sig1l = function(rd,rs1,rs2)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local src1bits = explodebits(getreg(rs1),32)
+ local src2bits = explodebits(getreg(rs2),32)
+ for i=0,31 do
+ outputbits[i] = src1bits[i-3]
+ xor(i,src1bits[i+6])
+ xor(i,src1bits[i+19])
+ xor(i,src2bits[i+29])
+ xor(i,src2bits[i-26])
+ xor(i,src2bits[i-13])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha512sum0r = function(rd,rs1,rs2)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local src1bits = explodebits(getreg(rs1),32)
+ local src2bits = explodebits(getreg(rs2),32)
+ for i=0,31 do
+ outputbits[i] = src1bits[i-25]
+ xor(i,src1bits[i-30])
+ xor(i,src1bits[i+28])
+ xor(i,src2bits[i+7])
+ xor(i,src2bits[i+2])
+ xor(i,src2bits[i-4])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
+ sha512sum1r = function(rd,rs1,rs2)
+ local outputbits = {}
+ local function xor(index,new)
+ if new then outputbits[index] = not outputbits[index] end
+ end
+ local src1bits = explodebits(getreg(rs1),32)
+ local src2bits = explodebits(getreg(rs2),32)
+ for i=0,31 do
+ outputbits[i] = src1bits[i-23]
+ xor(i,src1bits[i+14])
+ xor(i,src1bits[i+18])
+ xor(i,src2bits[i+9])
+ xor(i,src2bits[i-18])
+ xor(i,src2bits[i-14])
+ end
+ setreg(rd,implodebits(outputbits,32))
+ end,
}
local function runinst(instruction)
@@ -2092,6 +2236,18 @@ local function runinst(instruction)
operations.add(rd,rs1,rs2)
elseif f3 == 0x0 and f7 == 0x20 then
operations.sub(rd,rs1,rs2)
+ elseif f3 == 0x0 and f7 == 0x28 then
+ operations.sha512sum0r(rd,rs1,rs2)
+ elseif f3 == 0x0 and f7 == 0x29 then
+ operations.sha512sum1r(rd,rs1,rs2)
+ elseif f3 == 0x0 and f7 == 0x2a then
+ operations.sha512sig0l(rd,rs1,rs2)
+ elseif f3 == 0x0 and f7 == 0x2b then
+ operations.sha512sig1l(rd,rs1,rs2)
+ elseif f3 == 0x0 and f7 == 0x2e then
+ operations.sha512sig0h(rd,rs1,rs2)
+ elseif f3 == 0x0 and f7 == 0x2f then
+ operations.sha512sig1h(rd,rs1,rs2)
elseif f3 == 0x4 and f7 == 0x0 then
operations.xor(rd,rs1,rs2)
elseif f3 == 0x6 and f7 == 0x0 then
@@ -2200,6 +2356,14 @@ local function runinst(instruction)
operations.andi(rd,rs1,imm)
elseif f3 == 0x1 and math.floor(imm/0x20) == 0x0 then
operations.slli(rd,rs1,imm%0x20)
+ elseif f3 == 0x1 and imm == 0x100 then
+ operations.sha256sum0(rd,rs1)
+ elseif f3 == 0x1 and imm == 0x101 then
+ operations.sha256sum1(rd,rs1)
+ elseif f3 == 0x1 and imm == 0x102 then
+ operations.sha256sig0(rd,rs1)
+ elseif f3 == 0x1 and imm == 0x103 then
+ operations.sha256sig1(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