Skip to content

Commit a7cd544

Browse files
committed
fix csr gen
1 parent 46a8e08 commit a7cd544

File tree

2 files changed

+67
-22
lines changed

2 files changed

+67
-22
lines changed

src/machine/instruction.test.data.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,11 @@
182182
{0x100073, "ebreak"},
183183
{0x10200073, "sret"},
184184
{0x30200073, "mret"},
185-
{0x109073, "csrrw x0, 0x1, x1", "csrw 0x1, x1"},
186-
{0x1090f3, "csrrw x1, 0x1, x1"},
187-
{0x1020f3, "csrrs x1, 0x1, x0", "csrr x1, 0x1"},
188-
{0x10a0f3, "csrrs x1, 0x1, x1"},
189-
{0x10b0f3, "csrrc x1, 0x1, x1"},
190-
{0x10d0f3, "csrrwi x1, 0x1, 0x1"},
191-
{0x10e0f3, "csrrsi x1, 0x1, 0x1"},
192-
{0x10f0f3, "csrrci x1, 0x1, 0x1"},
185+
{0xf1209073, "csrrw x0, 0xf12, x1", "csrw 0xf12, x1"},
186+
{0xf12090f3, "csrrw x1, 0xf12, x1"},
187+
{0xf12020f3, "csrrs x1, 0xf12, x0", "csrr x1, 0xf12"},
188+
{0xf120a0f3, "csrrs x1, 0xf12, x1"},
189+
{0xf120b0f3, "csrrc x1, 0xf12, x1"},
190+
{0xf120d0f3, "csrrwi x1, 0xf12, 0x1"},
191+
{0xf120e0f3, "csrrsi x1, 0xf12, 0x1"},
192+
{0xf120f0f3, "csrrci x1, 0xf12, 0x1"},

src/machine/instruction.test.gendata.cpp

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@
77
using namespace machine;
88

99
static const uint32_t MASK_AMO_RS2 = 0b1111100000000000000000000;
10+
static const uint32_t MASK_I_RS1 = 0b11111000000000000000;
1011

11-
#define AMO_MAP_4ITEMS(NAME_BASE, MASK) \
12-
{ NAME_BASE, MASK }, { NAME_BASE ".rl", MASK }, { NAME_BASE ".aq", MASK }, \
13-
{ NAME_BASE ".aqrl", MASK },
12+
#define AMO_MAP_4ITEMS(NAME, MASK) \
13+
{ NAME, MASK }, { NAME ".aq", MASK }, { NAME ".rl", MASK }, { \
14+
NAME ".aqrl", MASK \
15+
}
1416

15-
static const QMap<QString, uint32_t> mask_map
16-
= { AMO_MAP_4ITEMS("lr.w", MASK_AMO_RS2) AMO_MAP_4ITEMS("lr.d", MASK_AMO_RS2) };
17+
static const QMap<QString, uint32_t> mask_map = {
18+
// lr.w/d rs2 = 0
19+
AMO_MAP_4ITEMS("lr.w", MASK_AMO_RS2), AMO_MAP_4ITEMS("lr.d", MASK_AMO_RS2),
20+
// csrw(alias of csrrs) rs1 = 0
21+
// { "csrrs", MASK_I_RS1 }
22+
};
1723

1824
void generate_code_and_string_data(
1925
QTextStream &out,
@@ -30,7 +36,7 @@ void generate_code_and_string_data(
3036
}
3137
const InstructionMap *im = &im_iter[i];
3238

33-
if (im->name == "unknown") { continue; }
39+
if (QString(im->name) == "unknown") { continue; }
3440

3541
if (im->subclass != nullptr) {
3642
generate_code_and_string_data(out, im->subclass, im->subfield, nullptr);
@@ -41,7 +47,7 @@ void generate_code_and_string_data(
4147
QString string_data = im->name;
4248

4349
if (im->args.size()) {
44-
int val_mask;
50+
uint32_t val_mask = 0;
4551
Instruction::Type t = im->type;
4652
if (alias_parent != nullptr) { t = alias_parent->type; }
4753
switch (t) {
@@ -52,7 +58,8 @@ void generate_code_and_string_data(
5258
}
5359
case Instruction::Type::I: val_mask = 0b00000000000100001000000010000000; break;
5460
case Instruction::Type::ZICSR: {
55-
val_mask = 0b00000000000100001000000010000000;
61+
// dest is not set here
62+
val_mask = 0b00000000000000001000000010000000;
5663
break;
5764
}
5865
case Instruction::Type::S: {
@@ -108,7 +115,17 @@ void generate_code_and_string_data(
108115
break;
109116
}
110117
case 'E': {
111-
string_data += "0x1";
118+
int i = 0;
119+
for (auto &reg : CSR::REGISTERS) {
120+
if (i < 2) {
121+
i++;
122+
continue;
123+
}
124+
string_data += QString::asprintf("0x%x", reg.address.data);
125+
code |= reg.address.data << 20;
126+
if (mask_map.count(im->name)) { code &= ~mask_map[im->name]; }
127+
break;
128+
}
112129
break;
113130
}
114131
}
@@ -124,25 +141,53 @@ void generate_code_and_string_data(
124141
bool check_failed = false;
125142
QString parsed_string_data = Instruction(code).to_str();
126143
if (alias_parent == nullptr) {
144+
// bash inst
127145
enum_str = QString::asprintf("{0x%x, \"%s\"},", code, qPrintable(string_data));
128146
if (parsed_string_data != string_data) { check_failed = true; }
129147
} else {
148+
// alias inst
130149
enum_str = QString::asprintf(
131150
"{0x%x, \"%s\", \"%s\"},", code, qPrintable(parsed_string_data),
132151
qPrintable(string_data));
152+
uint32_t parsed_code;
153+
Instruction::code_from_string(
154+
&parsed_code, parsed_string_data.length(), string_data, Address(0x0));
155+
if (parsed_code != code) { check_failed = true; }
133156
}
134-
uint32_t parsed_code;
135-
Instruction::code_from_string(
136-
&parsed_code, parsed_string_data.length(), string_data, Address(0x0));
137-
if (parsed_code != code) { check_failed = true; }
138157
if (check_failed) { enum_str += " // failed"; }
139158

140159
enum_str += "\n";
141160
out << enum_str;
142161
}
143162
}
144163

145-
int main(int argc, char *argv[]) {
164+
int main() {
165+
struct {
166+
QString str;
167+
uint32_t code;
168+
} strings[] = { { "csrrci x0, 0xc00, 0x1", 0xc000f073 }, { "csrw 0xc00, x1", 0xc0009073 } };
169+
for (int i = 0; i < 2; i++) {
170+
QString expected_str = strings[i].str;
171+
uint32_t expected_code = strings[i].code;
172+
173+
bool check_failed = false;
174+
uint32_t parsed_code;
175+
Instruction::code_from_string(
176+
&parsed_code, expected_str.length(), expected_str, Address(0x0));
177+
printf("code: %x ", parsed_code);
178+
if (parsed_code != expected_code) { check_failed = true; }
179+
180+
QString parsed_string_data = Instruction(parsed_code).to_str();
181+
printf("parsed_string_data: %s ", qPrintable(parsed_string_data));
182+
183+
parsed_code = 0;
184+
Instruction::code_from_string(
185+
&parsed_code, parsed_string_data.length(), parsed_string_data, Address(0x0));
186+
printf("parsed_code_from_parsed_string_data: %x ", parsed_code);
187+
if (parsed_code != expected_code) { check_failed = true; }
188+
if (check_failed) { printf("// failed\n"); }
189+
}
190+
146191
fill_argdesbycode();
147192
instruction_from_string_build_base();
148193
QFile outfile("instruction.test.data.h");

0 commit comments

Comments
 (0)