aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/codegen.zig71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index bb244da..b9f39c9 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -122,6 +122,77 @@ const Instruction = packed union {
return R.init(0b0110011, rd, 3, rs1, rs2, 0);
}
+ // start M extension
+
+ /// Multiply.
+ /// rd = rs1 * r2
+ fn mul(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 0, rs1, rs2, 1);
+ }
+ /// Multiply, get high bits.
+ /// rd = (rs1 * r2) >> 64
+ fn mulh(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 1, rs1, rs2, 1);
+ }
+ /// Multiply signed `rs1` by unsigned `rs2`, get high bits.
+ /// rd = (rs1 * r2) >> 64
+ fn mulhsu(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 2, rs1, rs2, 1);
+ }
+ /// Multiply unsigned `rs1` by unsigned `rs2`, get high bits.
+ /// rd = (rs1 * r2) >> 64
+ fn mulhu(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 3, rs1, rs2, 1);
+ }
+ /// Divide, signed.
+ /// rd = rs1 / r2
+ fn div(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 4, rs1, rs2, 1);
+ }
+ /// Divide, unsigned.
+ /// rd = rs1 / r2
+ fn divu(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 5, rs1, rs2, 1);
+ }
+ /// Remainder, unsigned.
+ /// rd = rs1 % r2
+ fn rem(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 6, rs1, rs2, 1);
+ }
+ /// Remainder, signed (modulus).
+ /// rd = rs1 % r2
+ fn remu(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0110011, rd, 7, rs1, rs2, 1);
+ }
+
+ // end M extension
+
+ /// Multiply words.
+ /// rd = rs1 * r2
+ fn mulw(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0111011, rd, 0, rs1, rs2, 1);
+ }
+ /// Divide words, signed.
+ /// rd = rs1 / r2
+ fn divw(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0111011, rd, 4, rs1, rs2, 1);
+ }
+ /// Divide words, unsigned.
+ /// rd = rs1 / r2
+ fn divuw(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0111011, rd, 5, rs1, rs2, 1);
+ }
+ /// Remainder of words, unsigned.
+ /// rd = rs1 % r2
+ fn remw(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0111011, rd, 6, rs1, rs2, 1);
+ }
+ /// Remainder of words, signed (modulus).
+ /// rd = rs1 % r2
+ fn remuw(rd: Register, rs1: Register, rs2: Register) Self {
+ return R.init(0b0111011, rd, 7, rs1, rs2, 1);
+ }
+
const I = packed struct(u32) {
opcode: Opcode,
rd: Register,