| ... | @@ -981,13 +981,19 @@ fn binOpRegister( | ... | @@ -981,13 +981,19 @@ fn binOpRegister( |
| 981 | if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register}); | 981 | if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register}); |
| 982 | if (rhs_is_register) self.register_manager.freezeRegs(&.{rhs.register}); | 982 | if (rhs_is_register) self.register_manager.freezeRegs(&.{rhs.register}); |
| 983 | | 983 | |
| | 984 | const branch = &self.branch_stack.items[self.branch_stack.items.len - 1]; |
| | 985 | |
| 984 | const lhs_reg = if (lhs_is_register) lhs.register else blk: { | 986 | const lhs_reg = if (lhs_is_register) lhs.register else blk: { |
| 985 | const track_inst: ?Air.Inst.Index = if (maybe_inst) |inst| inst: { | 987 | const track_inst: ?Air.Inst.Index = if (maybe_inst) |inst| inst: { |
| 986 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; | 988 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 987 | break :inst Air.refToIndex(bin_op.lhs).?; | 989 | break :inst Air.refToIndex(bin_op.lhs).?; |
| 988 | } else null; | 990 | } else null; |
| | 991 | |
| 989 | const reg = try self.register_manager.allocReg(track_inst); | 992 | const reg = try self.register_manager.allocReg(track_inst); |
| 990 | self.register_manager.freezeRegs(&.{reg}); | 993 | self.register_manager.freezeRegs(&.{reg}); |
| | 994 | |
| | 995 | if (track_inst) |inst| branch.inst_table.putAssumeCapacity(inst, .{ .register = reg }); |
| | 996 | |
| 991 | break :blk reg; | 997 | break :blk reg; |
| 992 | }; | 998 | }; |
| 993 | defer self.register_manager.unfreezeRegs(&.{lhs_reg}); | 999 | defer self.register_manager.unfreezeRegs(&.{lhs_reg}); |
| ... | @@ -997,8 +1003,12 @@ fn binOpRegister( | ... | @@ -997,8 +1003,12 @@ fn binOpRegister( |
| 997 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; | 1003 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 998 | break :inst Air.refToIndex(bin_op.rhs).?; | 1004 | break :inst Air.refToIndex(bin_op.rhs).?; |
| 999 | } else null; | 1005 | } else null; |
| | 1006 | |
| 1000 | const reg = try self.register_manager.allocReg(track_inst); | 1007 | const reg = try self.register_manager.allocReg(track_inst); |
| 1001 | self.register_manager.freezeRegs(&.{reg}); | 1008 | self.register_manager.freezeRegs(&.{reg}); |
| | 1009 | |
| | 1010 | if (track_inst) |inst| branch.inst_table.putAssumeCapacity(inst, .{ .register = reg }); |
| | 1011 | |
| 1002 | break :blk reg; | 1012 | break :blk reg; |
| 1003 | }; | 1013 | }; |
| 1004 | defer self.register_manager.unfreezeRegs(&.{rhs_reg}); | 1014 | defer self.register_manager.unfreezeRegs(&.{rhs_reg}); |
| ... | @@ -1077,6 +1087,8 @@ fn binOpImmediate( | ... | @@ -1077,6 +1087,8 @@ fn binOpImmediate( |
| 1077 | | 1087 | |
| 1078 | if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register}); | 1088 | if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register}); |
| 1079 | | 1089 | |
| | 1090 | const branch = &self.branch_stack.items[self.branch_stack.items.len - 1]; |
| | 1091 | |
| 1080 | const lhs_reg = if (lhs_is_register) lhs.register else blk: { | 1092 | const lhs_reg = if (lhs_is_register) lhs.register else blk: { |
| 1081 | const track_inst: ?Air.Inst.Index = if (maybe_inst) |inst| inst: { | 1093 | const track_inst: ?Air.Inst.Index = if (maybe_inst) |inst| inst: { |
| 1082 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; | 1094 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| ... | @@ -1084,8 +1096,12 @@ fn binOpImmediate( | ... | @@ -1084,8 +1096,12 @@ fn binOpImmediate( |
| 1084 | if (lhs_and_rhs_swapped) bin_op.rhs else bin_op.lhs, | 1096 | if (lhs_and_rhs_swapped) bin_op.rhs else bin_op.lhs, |
| 1085 | ).?; | 1097 | ).?; |
| 1086 | } else null; | 1098 | } else null; |
| | 1099 | |
| 1087 | const reg = try self.register_manager.allocReg(track_inst); | 1100 | const reg = try self.register_manager.allocReg(track_inst); |
| 1088 | self.register_manager.freezeRegs(&.{reg}); | 1101 | self.register_manager.freezeRegs(&.{reg}); |
| | 1102 | |
| | 1103 | if (track_inst) |inst| branch.inst_table.putAssumeCapacity(inst, .{ .register = reg }); |
| | 1104 | |
| 1089 | break :blk reg; | 1105 | break :blk reg; |
| 1090 | }; | 1106 | }; |
| 1091 | defer self.register_manager.unfreezeRegs(&.{lhs_reg}); | 1107 | defer self.register_manager.unfreezeRegs(&.{lhs_reg}); |
| ... | @@ -3141,7 +3157,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void | ... | @@ -3141,7 +3157,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 3141 | .tag = .cset, | 3157 | .tag = .cset, |
| 3142 | .data = .{ .r_cond = .{ | 3158 | .data = .{ .r_cond = .{ |
| 3143 | .rd = reg, | 3159 | .rd = reg, |
| 3144 | .cond = condition, | 3160 | .cond = condition.negate(), |
| 3145 | } }, | 3161 | } }, |
| 3146 | }); | 3162 | }); |
| 3147 | }, | 3163 | }, |