From b10cb715610d0186b70765a152baaf71e192a9f1 Mon Sep 17 00:00:00 2001 From: Mathias Magnusson Date: Sun, 1 Jun 2025 01:38:13 +0200 Subject: codegen: add RV64M extension --- src/codegen.zig | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) (limited to 'src') 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, -- cgit v1.2.3