Skip to content

Commit 5549f15

Browse files
Support BitManip Zba, Zbb, Zbc and Zbs extensions (#116)
1 parent 085cfcd commit 5549f15

7 files changed

Lines changed: 574 additions & 0 deletions

File tree

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ SAIL_CHECK_SRCS = riscv_addr_checks_common.sail riscv_addr_checks.sail riscv_mis
2222
SAIL_DEFAULT_INST = riscv_insts_base.sail riscv_insts_aext.sail riscv_insts_cext.sail riscv_insts_mext.sail riscv_insts_zicsr.sail riscv_insts_next.sail riscv_insts_hints.sail
2323
SAIL_DEFAULT_INST += riscv_insts_fext.sail riscv_insts_cfext.sail
2424
SAIL_DEFAULT_INST += riscv_insts_dext.sail riscv_insts_cdext.sail
25+
26+
SAIL_DEFAULT_INST += riscv_insts_zba.sail
27+
SAIL_DEFAULT_INST += riscv_insts_zbb.sail
28+
SAIL_DEFAULT_INST += riscv_insts_zbc.sail
29+
SAIL_DEFAULT_INST += riscv_insts_zbs.sail
2530
SAIL_DEFAULT_INST += riscv_insts_zkn.sail
2631
SAIL_DEFAULT_INST += riscv_insts_zks.sail
2732

model/riscv_insts_zba.sail

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/* ****************************************************************** */
2+
union clause ast = RISCV_SLLIUW : (bits(6), regidx, regidx)
3+
4+
mapping clause encdec = RISCV_SLLIUW(shamt, rs1, rd) if haveZba() & sizeof(xlen) == 64
5+
<-> 0b000010 @ shamt @ rs1 @ 0b001 @ rd @ 0b0011011 if haveZba() & sizeof(xlen) == 64
6+
7+
mapping clause assembly = RISCV_SLLIUW(shamt, rs1, rd)
8+
<-> "slli.uw" ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ hex_bits_6(shamt)
9+
10+
function clause execute (RISCV_SLLIUW(shamt, rs1, rd)) = {
11+
let rs1_val = X(rs1);
12+
let result : xlenbits = EXTZ(rs1_val[31..0]) << shamt;
13+
X(rd) = result;
14+
RETIRE_SUCCESS
15+
}
16+
17+
/* ****************************************************************** */
18+
union clause ast = ZBA_RTYPEUW : (regidx, regidx, regidx, bropw_zba)
19+
20+
mapping clause encdec = ZBA_RTYPEUW(rs2, rs1, rd, RISCV_ADDUW) if haveZba() & sizeof(xlen) == 64
21+
<-> 0b0000100 @ rs2 @ rs1 @ 0b000 @ rd @ 0b0111011 if haveZba() & sizeof(xlen) == 64
22+
23+
mapping clause encdec = ZBA_RTYPEUW(rs2, rs1, rd, RISCV_SH1ADDUW) if haveZba() & sizeof(xlen) == 64
24+
<-> 0b0010000 @ rs2 @ rs1 @ 0b010 @ rd @ 0b0111011 if haveZba() & sizeof(xlen) == 64
25+
26+
mapping clause encdec = ZBA_RTYPEUW(rs2, rs1, rd, RISCV_SH2ADDUW) if haveZba() & sizeof(xlen) == 64
27+
<-> 0b0010000 @ rs2 @ rs1 @ 0b100 @ rd @ 0b0111011 if haveZba() & sizeof(xlen) == 64
28+
29+
mapping clause encdec = ZBA_RTYPEUW(rs2, rs1, rd, RISCV_SH3ADDUW) if haveZba() & sizeof(xlen) == 64
30+
<-> 0b0010000 @ rs2 @ rs1 @ 0b110 @ rd @ 0b0111011 if haveZba() & sizeof(xlen) == 64
31+
32+
mapping zba_rtypeuw_mnemonic : bropw_zba <-> string = {
33+
RISCV_ADDUW <-> "add.uw",
34+
RISCV_SH1ADDUW <-> "sh1add.uw",
35+
RISCV_SH2ADDUW <-> "sh2add.uw",
36+
RISCV_SH3ADDUW <-> "sh3add.uw"
37+
}
38+
39+
mapping clause assembly = ZBA_RTYPEUW(rs2, rs1, rd, op)
40+
<-> zba_rtypeuw_mnemonic(op) ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2)
41+
42+
function clause execute (ZBA_RTYPEUW(rs2, rs1, rd, op)) = {
43+
let rs1_val = X(rs1);
44+
let rs2_val = X(rs2);
45+
let shamt : bits(2) = match op {
46+
RISCV_ADDUW => 0b00,
47+
RISCV_SH1ADDUW => 0b01,
48+
RISCV_SH2ADDUW => 0b10,
49+
RISCV_SH3ADDUW => 0b11
50+
};
51+
let result : xlenbits = (EXTZ(rs1_val[31..0]) << shamt) + rs2_val;
52+
X(rd) = result;
53+
RETIRE_SUCCESS
54+
}
55+
56+
/* ****************************************************************** */
57+
union clause ast = ZBA_RTYPE : (regidx, regidx, regidx, brop_zba)
58+
59+
mapping clause encdec = ZBA_RTYPE(rs2, rs1, rd, RISCV_SH1ADD) if haveZba()
60+
<-> 0b0010000 @ rs2 @ rs1 @ 0b010 @ rd @ 0b0110011 if haveZba()
61+
mapping clause encdec = ZBA_RTYPE(rs2, rs1, rd, RISCV_SH2ADD) if haveZba()
62+
<-> 0b0010000 @ rs2 @ rs1 @ 0b100 @ rd @ 0b0110011 if haveZba()
63+
mapping clause encdec = ZBA_RTYPE(rs2, rs1, rd, RISCV_SH3ADD) if haveZba()
64+
<-> 0b0010000 @ rs2 @ rs1 @ 0b110 @ rd @ 0b0110011 if haveZba()
65+
66+
mapping zba_rtype_mnemonic : brop_zba <-> string = {
67+
RISCV_SH1ADD <-> "sh1add",
68+
RISCV_SH2ADD <-> "sh2add",
69+
RISCV_SH3ADD <-> "sh3add"
70+
}
71+
72+
mapping clause assembly = ZBA_RTYPE(rs2, rs1, rd, op)
73+
<-> zba_rtype_mnemonic(op) ^ spc() ^ reg_name(rd) ^ sep() ^ reg_name(rs1) ^ sep() ^ reg_name(rs2)
74+
75+
function clause execute (ZBA_RTYPE(rs2, rs1, rd, op)) = {
76+
let rs1_val = X(rs1);
77+
let rs2_val = X(rs2);
78+
let shamt : bits(2) = match op {
79+
RISCV_SH1ADD => 0b01,
80+
RISCV_SH2ADD => 0b10,
81+
RISCV_SH3ADD => 0b11
82+
};
83+
let result : xlenbits = (rs1_val << shamt) + rs2_val;
84+
X(rd) = result;
85+
RETIRE_SUCCESS
86+
}

0 commit comments

Comments
 (0)