Skip to content

Commit 715527b

Browse files
committed
core: add zero and sign extension pseudoinstructions
1 parent 3578008 commit 715527b

3 files changed

Lines changed: 49 additions & 3 deletions

File tree

src/exec/core.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,34 @@ const char *handle_alu_reg(Parser *p, const char *opcode, size_t opcode_len) {
786786
return NULL;
787787
}
788788

789+
const char *handle_ext(Parser *p, const char *opcode, size_t opcode_len) {
790+
int d, s1, s2;
791+
792+
skip_trailing(p);
793+
if ((d = parse_reg(p)) == -1) return "Invalid rd";
794+
skip_trailing(p);
795+
if (!consume_if(p, ',')) return "Expected ,";
796+
797+
skip_trailing(p);
798+
if ((s1 = parse_reg(p)) == -1) return "Invalid rs1";
799+
skip_trailing(p);
800+
801+
if (str_eq_case(opcode, opcode_len, "zext.b")) {
802+
asm_emit(ANDI(d, s1, 255), p->startline);
803+
} else if (str_eq_case(opcode, opcode_len, "zext.h")) {
804+
asm_emit(SLLI(d, s1, 16), p->startline);
805+
asm_emit(SRLI(d, d, 16), p->startline);
806+
} else if (str_eq_case(opcode, opcode_len, "sext.b")) {
807+
asm_emit(SLLI(d, s1, 24), p->startline);
808+
asm_emit(SRAI(d, d, 24), p->startline);
809+
} else if (str_eq_case(opcode, opcode_len, "sext.h")) {
810+
asm_emit(SLLI(d, s1, 16), p->startline);
811+
asm_emit(SRAI(d, d, 16), p->startline);
812+
}
813+
814+
return NULL;
815+
}
816+
789817
const char *handle_alu_imm(Parser *p, const char *opcode, size_t opcode_len) {
790818
Parser orig = *p;
791819
int d, s1;
@@ -1092,7 +1120,7 @@ const char *handle_upper(Parser *p, const char *opcode, size_t opcode_len) {
10921120
} else if (!parse_numeric(p, &simm)) return "Invalid immediate";
10931121
// the immediate can either be signed or unsigned 20 bit
10941122
if (simm < -524288 || simm > 1048575) return "Out of bounds immediate";
1095-
1123+
10961124
if (str_eq_case(opcode, opcode_len, "lui")) inst = LUI(d, simm);
10971125
else if (str_eq_case(opcode, opcode_len, "auipc")) inst = AUIPC(d, simm);
10981126

@@ -1247,6 +1275,7 @@ OpcodeHandling opcode_types[] = {
12471275
},
12481276
{handle_alu_imm,
12491277
{"addi", "slti", "sltiu", "andi", "ori", "xori", "slli", "srli", "srai"}},
1278+
{handle_ext, {"sext.b", "sext.h", "zext.b", "zext.h"}},
12501279
{handle_ldst, {"lb", "lh", "lw", "lbu", "lhu", "sb", "sh", "sw"}},
12511280
{handle_branch,
12521281
{"beq", "bne", "blt", "bge", "bltu", "bgeu", "bgt", "ble", "bgtu",

src/webui/IntegratedHelp.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,14 @@ seqz rd, rs1
182182
(sltiu rd, rs1, 1)
183183
rd = (rs1 == 0) ? 1 : 0
184184
185+
sext.b rd, rs1
186+
(slli rd, rs1, 24; srai rd, rd, 24)
187+
rd = (int32_t)((int8_t)rs1[7:0])
188+
189+
sext.h rd, rs1
190+
(slli rd, rs1, 16; srai rd, rd, 16)
191+
rd = (int32_t)((int16_t)rs1[15:0])
192+
185193
sgtz rd, rs1
186194
(slt rd, zero, rs1)
187195
rd = (rs1 > 0) ? 1 : 0
@@ -202,7 +210,7 @@ slti rd, rs1, imm
202210
rd = (rs1 < imm) ? 1 : 0 (signed)
203211
204212
sltiu rd, rs1, imm
205-
rd = (rs1 < (uint32_t)sext(imm)) ? 1 : 0 (unsigned, ***)
213+
rd = (rs1 < sext(imm)) ? 1 : 0 (unsigned, ***)
206214
207215
sltu rd, rs1, rs2
208216
rd = (rs1 < rs2) ? 1 : 0 (unsigned)
@@ -237,7 +245,15 @@ xor rd, rs1, rs2
237245
rd = rs1 ^ rs2
238246
239247
xori rd, rs1, imm
240-
rd = rs1 ^ imm
248+
rd = rs1 ^ imm
249+
250+
zext.b rd, rs1
251+
(andi rd, rs1, 0xFF)
252+
rd = rs1[7:0]
253+
254+
zext.h rd, rs1
255+
(slli rd, rs1, 16; srli rd, rd, 16)
256+
rd = rs1[15:0]
241257
`;
242258

243259
const asterisks = `

src/webui/riscv.grammar

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ RegisterExpression {
9696
(
9797
"add" | "slt" | "sltu" | "and" | "or" | "xor" | "sll" | "srl" | "sub" | "sra" | "mul" | "mulh" | "mulhsu" | "mulhu" | "div" |
9898
"divu" | "rem" | "remu" |
99+
"zext.b" | "zext.h" | "sext.b" | "sext.h" |
99100
"addi" | "slt" | "sltiu" | "andi" | "ori" | "xori" | "slli" | "srli" | "srai" |
100101
"lb" | "lh" | "lw" | "lbu" | "lhu" | "sb" | "sh" | "sw" |
101102
"beq" | "bne" | "blt" | "bge" | "bltu" | "bgeu" | "bgt" | "ble" | "bgtu" | "bleu" |

0 commit comments

Comments
 (0)