diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2025-06-01 01:38:13 +0200 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2025-06-01 01:38:13 +0200 |
commit | b10cb715610d0186b70765a152baaf71e192a9f1 (patch) | |
tree | 3d5929a37cb3f72fc4aeba097ba7687335c22742 /src | |
parent | 18cc7a9ff7e83f47e9289d2adbd15663833fefef (diff) | |
download | huginn-b10cb715610d0186b70765a152baaf71e192a9f1.tar.gz |
codegen: add RV64M extension
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen.zig | 71 |
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, |