diff options
Diffstat (limited to 'rvcontroller.lua')
| -rw-r--r-- | rvcontroller.lua | 166 |
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 |
