authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-19 19:48:27+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-19 19:48:27+01:00
log7cdc47a4e08cd32e1f68ca4aad3ca22b11e4e7b2
tree6444e2961ca1509b573de24e8c34ffacaa4a529a
parent956d9f4ce019243ed0bd7f587acdeb1af4b5f61c
signature Commit is signed but in an unrecognized format.

stage2 RISCV64: implement move register to register


3 files changed, 33 insertions(+), 0 deletions(-)

src/arch/riscv64/CodeGen.zig+14
......@@ -2074,6 +2074,20 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
20742074 return self.fail("TODO genSetReg 33-64 bit immediates for riscv64", .{}); // glhf
20752075 }
20762076 },
2077 .register => |src_reg| {
2078 // If the registers are the same, nothing to do.
2079 if (src_reg.id() == reg.id())
2080 return;
2081
2082 // mov reg, src_reg
2083 _ = try self.addInst(.{
2084 .tag = .mv,
2085 .data = .{ .rr = .{
2086 .rd = reg,
2087 .rs = src_reg,
2088 } },
2089 });
2090 },
20772091 .memory => |addr| {
20782092 // The value is in memory at a hard-coded address.
20792093 // If the type is a pointer, it means the pointer address is at this memory location.
src/arch/riscv64/Emit.zig+11
......@@ -56,6 +56,8 @@ pub fn emitMir(
5656 .dbg_prologue_end => try emit.mirDebugPrologueEnd(),
5757 .dbg_epilogue_begin => try emit.mirDebugEpilogueBegin(),
5858
59 .mv => try emit.mirRR(inst),
60
5961 .nop => try emit.mirNop(inst),
6062 .ret => try emit.mirNop(inst),
6163
......@@ -186,6 +188,15 @@ fn mirDebugEpilogueBegin(self: *Emit) !void {
186188 }
187189}
188190
191fn mirRR(emit: *Emit, inst: Mir.Inst.Index) !void {
192 const tag = emit.mir.instructions.items(.tag)[inst];
193 const rr = emit.mir.instructions.items(.data)[inst].rr;
194
195 switch (tag) {
196 .mv => try emit.writeInstruction(Instruction.addi(rr.rd, rr.rs, 0)),
197 else => unreachable,
198 }
199}
189200fn mirUType(emit: *Emit, inst: Mir.Inst.Index) !void {
190201 const tag = emit.mir.instructions.items(.tag)[inst];
191202 const u_type = emit.mir.instructions.items(.data)[inst].u_type;
src/arch/riscv64/Mir.zig+8
......@@ -36,6 +36,7 @@ pub const Inst = struct {
3636 jalr,
3737 ld,
3838 lui,
39 mv,
3940 nop,
4041 ret,
4142 sd,
......@@ -68,6 +69,13 @@ pub const Inst = struct {
6869 ///
6970 /// Used by e.g. blr
7071 reg: Register,
72 /// Two registers
73 ///
74 /// Used by e.g. mv
75 rr: struct {
76 rd: Register,
77 rs: Register,
78 },
7179 /// I-Type
7280 ///
7381 /// Used by e.g. jalr