authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-28 09:05:57+07:00
committergravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-06-06 20:34:53+07:00
log3220e0b61c127b60188a040b5f4679765e8f6f40
tree8aea23feed2c7c46c0fcbcbbda857f2b2c8e90ce
parent9db81fee5df6abcf1eb1212ecc005d22f7b2ca32

stage2: sparc64: Proper handling of compare flags


1 files changed, 6 insertions(+), 0 deletions(-)

src/arch/sparc64/CodeGen.zig+6
...@@ -2029,6 +2029,7 @@ fn binOpImmediate(...@@ -2029,6 +2029,7 @@ fn binOpImmediate(
2029 defer if (new_lhs_lock) |reg| self.register_manager.unlockReg(reg);2029 defer if (new_lhs_lock) |reg| self.register_manager.unlockReg(reg);
20302030
2031 const dest_reg = switch (mir_tag) {2031 const dest_reg = switch (mir_tag) {
2032 .cmp => undefined, // cmp has no destination register
2032 else => if (metadata) |md| blk: {2033 else => if (metadata) |md| blk: {
2033 if (lhs_is_register and self.reuseOperand(2034 if (lhs_is_register and self.reuseOperand(
2034 md.inst,2035 md.inst,
...@@ -2148,6 +2149,7 @@ fn binOpRegister(...@@ -2148,6 +2149,7 @@ fn binOpRegister(
2148 defer if (new_rhs_lock) |reg| self.register_manager.unlockReg(reg);2149 defer if (new_rhs_lock) |reg| self.register_manager.unlockReg(reg);
21492150
2150 const dest_reg = switch (mir_tag) {2151 const dest_reg = switch (mir_tag) {
2152 .cmp => undefined, // cmp has no destination register
2151 else => if (metadata) |md| blk: {2153 else => if (metadata) |md| blk: {
2152 if (lhs_is_register and self.reuseOperand(md.inst, md.lhs, 0, lhs)) {2154 if (lhs_is_register and self.reuseOperand(md.inst, md.lhs, 0, lhs)) {
2153 break :blk lhs_reg;2155 break :blk lhs_reg;
...@@ -3064,6 +3066,10 @@ fn processDeath(self: *Self, inst: Air.Inst.Index) void {...@@ -3064,6 +3066,10 @@ fn processDeath(self: *Self, inst: Air.Inst.Index) void {
3064 .register => |reg| {3066 .register => |reg| {
3065 self.register_manager.freeReg(reg);3067 self.register_manager.freeReg(reg);
3066 },3068 },
3069 .register_with_overflow => |rwo| {
3070 self.register_manager.freeReg(rwo.reg);
3071 self.compare_flags_inst = null;
3072 },
3067 .compare_flags_signed, .compare_flags_unsigned => {3073 .compare_flags_signed, .compare_flags_unsigned => {
3068 self.compare_flags_inst = null;3074 self.compare_flags_inst = null;
3069 },3075 },