forked from riscv/sail-riscv
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathriscv_insts_zks.sail
78 lines (63 loc) · 2.91 KB
/
riscv_insts_zks.sail
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
* Scalar Cryptography Extension - Scalar SM3 instructions
* ----------------------------------------------------------------------
*/
union clause ast = SM3P0 : (regidx, regidx)
union clause ast = SM3P1 : (regidx, regidx)
mapping clause encdec = SM3P0 (rs1, rd) if haveZksh()
<-> 0b00 @ 0b01000 @ 0b01000 @ rs1 @ 0b001 @ rd @ 0b0010011
mapping clause encdec = SM3P1 (rs1, rd) if haveZksh()
<-> 0b00 @ 0b01000 @ 0b01001 @ rs1 @ 0b001 @ rd @ 0b0010011
mapping clause assembly = SM3P0 (rs1, rd) <->
"sm3p0" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1)
mapping clause assembly = SM3P1 (rs1, rd) <->
"sm3p1" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1)
function clause execute (SM3P0(rs1, rd)) = {
let r1 : bits(32) = X(rs1)[31..0];
let result : bits(32) = r1 ^ (r1 <<< 9) ^ (r1 <<< 17);
X(rd) = EXTS(result);
RETIRE_SUCCESS
}
function clause execute (SM3P1(rs1, rd)) = {
let r1 : bits(32) = X(rs1)[31..0];
let result : bits(32) = r1 ^ (r1 <<< 15) ^ (r1 <<< 23);
X(rd) = EXTS(result);
RETIRE_SUCCESS
}
/*
* Scalar Cryptography Extension - Scalar SM4 instructions
* ----------------------------------------------------------------------
*/
union clause ast = SM4ED : (bits(2), regidx, regidx, regidx)
union clause ast = SM4KS : (bits(2), regidx, regidx, regidx)
mapping clause encdec = SM4ED (bs, rs2, rs1, rd) if haveZksed()
<-> bs @ 0b11000 @ rs2 @ rs1 @ 0b000 @ rd @ 0b0110011
mapping clause encdec = SM4KS (bs, rs2, rs1, rd) if haveZksed()
<-> bs @ 0b11010 @ rs2 @ rs1 @ 0b000 @ rd @ 0b0110011
mapping clause assembly = SM4ED (bs, rs2, rs1, rd) <->
"sm4ed" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2) ^ sep() ^ hex_bits_2(bs)
mapping clause assembly = SM4KS (bs, rs2, rs1, rd) <->
"sm4ks" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2) ^ sep() ^ hex_bits_2(bs)
function clause execute (SM4ED (bs, rs2, rs1, rd)) = {
let shamt : bits(5) = bs @ 0b000; /* shamt = bs*8 */
let sb_in : bits(8) = (X(rs2)[31..0] >> shamt)[7..0];
let x : bits(32) = 0x000000 @ sm4_sbox(sb_in);
let y : bits(32) = x ^ (x << 8) ^ ( x << 2) ^
(x << 18) ^ ((x & 0x0000003F) << 26) ^
((x & 0x000000C0) << 10);
let z : bits(32) = (y <<< shamt);
let result : bits(32) = z ^ X(rs1)[31..0];
X(rd) = EXTS(result);
RETIRE_SUCCESS
}
function clause execute (SM4KS (bs, rs2, rs1, rd)) = {
let shamt : bits(5) = (bs @ 0b000); /* shamt = bs*8 */
let sb_in : bits(8) = (X(rs2)[31..0] >> shamt)[7..0];
let x : bits(32) = 0x000000 @ sm4_sbox(sb_in);
let y : bits(32) = x ^ ((x & 0x00000007) << 29) ^ ((x & 0x000000FE) << 7) ^
((x & 0x00000001) << 23) ^ ((x & 0x000000F8) << 13) ;
let z : bits(32) = (y <<< shamt);
let result : bits(32) = z ^ X(rs1)[31..0];
X(rd) = EXTS(result);
RETIRE_SUCCESS
}