diff options
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, |