diff options
| author | Koakuma <koachan@protonmail.com> | 2022-06-24 20:29:12 +0700 |
|---|---|---|
| committer | Koakuma <koachan@protonmail.com> | 2022-06-24 21:19:33 +0700 |
| commit | ad176b319d810da7755b9a1ec39e68210df8d807 (patch) | |
| tree | c82c32c3462dd221bcd25dac644f6f7f1f9db0fd /src/arch | |
| parent | 65c5ef52e94323e15005cb943cd98b929119ce39 (diff) | |
| download | zig-ad176b319d810da7755b9a1ec39e68210df8d807.tar.gz zig-ad176b319d810da7755b9a1ec39e68210df8d807.zip | |
stage2: sparc64: Implement SPARCv9 movr
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/sparc64/Emit.zig | 22 | ||||
| -rw-r--r-- | src/arch/sparc64/bits.zig | 8 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/arch/sparc64/Emit.zig b/src/arch/sparc64/Emit.zig index 937431afae..ac7fd89d00 100644 --- a/src/arch/sparc64/Emit.zig +++ b/src/arch/sparc64/Emit.zig @@ -102,7 +102,7 @@ pub fn emitMir( .movcc => try emit.mirConditionalMove(inst), - .movr => @panic("TODO implement sparc64 movr"), + .movr => try emit.mirConditionalMove(inst), .mulx => try emit.mirArithmetic3Op(inst), .sdivx => try emit.mirArithmetic3Op(inst), @@ -346,6 +346,26 @@ fn mirConditionalMove(emit: *Emit, inst: Mir.Inst.Index) !void { )); } }, + .movr => { + const data = emit.mir.instructions.items(.data)[inst].conditional_move_reg; + if (data.is_imm) { + try emit.writeInstruction(Instruction.movr( + i10, + data.cond, + data.rs1, + data.rs2_or_imm.imm, + data.rd, + )); + } else { + try emit.writeInstruction(Instruction.movr( + Register, + data.cond, + data.rs1, + data.rs2_or_imm.rs2, + data.rd, + )); + } + }, else => unreachable, } } diff --git a/src/arch/sparc64/bits.zig b/src/arch/sparc64/bits.zig index 4c1a641d45..ebfc55635c 100644 --- a/src/arch/sparc64/bits.zig +++ b/src/arch/sparc64/bits.zig @@ -1273,6 +1273,14 @@ pub const Instruction = union(enum) { }; } + pub fn movr(comptime s2: type, cond: RCondition, rs1: Register, rs2: s2, rd: Register) Instruction { + return switch (s2) { + Register => format3e(0b10, 0b10_1111, cond, rs1, rs2, rd), + i10 => format3f(0b10, 0b10_1111, cond, rs1, rs2, rd), + else => unreachable, + }; + } + pub fn mulx(comptime s2: type, rs1: Register, rs2: s2, rd: Register) Instruction { return switch (s2) { Register => format3a(0b10, 0b00_1001, rs1, rs2, rd), |
