authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-17 23:09:44+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-18 09:14:15+01:00
logd74e9b2d98d00b0e9ae0196c0bb3272b2de2b52e
tree9ee2a6c06d309c2a38c7763c9f732b05aff2af94
parent83744b92a1d1a923fb3faf3aca9d0f57b09cb97d

x64: rename copyToNewRegister to copyToRegisterWithInstTracking for impr clarity


1 files changed, 20 insertions(+), 13 deletions(-)

src/arch/x86_64/CodeGen.zig+20-13
...@@ -883,7 +883,8 @@ fn copyToTmpRegister(self: *Self, ty: Type, mcv: MCValue) !Register {...@@ -883,7 +883,8 @@ fn copyToTmpRegister(self: *Self, ty: Type, mcv: MCValue) !Register {
883/// Allocates a new register and copies `mcv` into it.883/// Allocates a new register and copies `mcv` into it.
884/// `reg_owner` is the instruction that gets associated with the register in the register table.884/// `reg_owner` is the instruction that gets associated with the register in the register table.
885/// This can have a side effect of spilling instructions to the stack to free up a register.885/// This can have a side effect of spilling instructions to the stack to free up a register.
886fn copyToNewRegister(self: *Self, reg_owner: Air.Inst.Index, ty: Type, mcv: MCValue) !MCValue {886/// WARNING make sure that the allocated register matches the returned MCValue from an instruction!
887fn copyToRegisterWithInstTracking(self: *Self, reg_owner: Air.Inst.Index, ty: Type, mcv: MCValue) !MCValue {
887 const reg = try self.register_manager.allocReg(reg_owner);888 const reg = try self.register_manager.allocReg(reg_owner);
888 try self.genSetReg(ty, reg, mcv);889 try self.genSetReg(ty, reg, mcv);
889 return MCValue{ .register = reg };890 return MCValue{ .register = reg };
...@@ -939,7 +940,7 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {...@@ -939,7 +940,7 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {
939 operand.freezeIfRegister(&self.register_manager);940 operand.freezeIfRegister(&self.register_manager);
940 defer operand.unfreezeIfRegister(&self.register_manager);941 defer operand.unfreezeIfRegister(&self.register_manager);
941942
942 break :blk try self.copyToNewRegister(inst, dest_ty, operand);943 break :blk try self.copyToRegisterWithInstTracking(inst, dest_ty, operand);
943 };944 };
944945
945 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });946 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
...@@ -970,7 +971,7 @@ fn airTrunc(self: *Self, inst: Air.Inst.Index) !void {...@@ -970,7 +971,7 @@ fn airTrunc(self: *Self, inst: Air.Inst.Index) !void {
970 break :blk operand.register.to64();971 break :blk operand.register.to64();
971 }972 }
972 }973 }
973 const mcv = try self.copyToNewRegister(inst, src_ty, operand);974 const mcv = try self.copyToRegisterWithInstTracking(inst, src_ty, operand);
974 break :blk mcv.register.to64();975 break :blk mcv.register.to64();
975 };976 };
976977
...@@ -1088,7 +1089,7 @@ fn genPtrBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_r...@@ -1088,7 +1089,7 @@ fn genPtrBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_r
1088 if (self.reuseOperand(inst, op_lhs, 0, ptr)) {1089 if (self.reuseOperand(inst, op_lhs, 0, ptr)) {
1089 if (ptr.isMemory() or ptr.isRegister()) break :blk ptr;1090 if (ptr.isMemory() or ptr.isRegister()) break :blk ptr;
1090 }1091 }
1091 break :blk try self.copyToNewRegister(inst, dst_ty, ptr);1092 break :blk try self.copyToRegisterWithInstTracking(inst, dst_ty, ptr);
1092 };1093 };
10931094
1094 const offset_mcv = blk: {1095 const offset_mcv = blk: {
...@@ -1338,7 +1339,7 @@ fn airOptionalPayload(self: *Self, inst: Air.Inst.Index) !void {...@@ -1338,7 +1339,7 @@ fn airOptionalPayload(self: *Self, inst: Air.Inst.Index) !void {
1338 if (self.reuseOperand(inst, ty_op.operand, 0, operand)) {1339 if (self.reuseOperand(inst, ty_op.operand, 0, operand)) {
1339 break :result operand;1340 break :result operand;
1340 }1341 }
1341 break :result try self.copyToNewRegister(inst, self.air.typeOfIndex(inst), operand);1342 break :result try self.copyToRegisterWithInstTracking(inst, self.air.typeOfIndex(inst), operand);
1342 };1343 };
1343 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });1344 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
1344}1345}
...@@ -1666,7 +1667,7 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {...@@ -1666,7 +1667,7 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {
1666 self.register_manager.freezeRegs(&.{offset_reg});1667 self.register_manager.freezeRegs(&.{offset_reg});
1667 defer self.register_manager.unfreezeRegs(&.{offset_reg});1668 defer self.register_manager.unfreezeRegs(&.{offset_reg});
16681669
1669 const dst_mcv = try self.copyToNewRegister(inst, ptr_ty, ptr);1670 const dst_mcv = try self.copyToRegisterWithInstTracking(inst, ptr_ty, ptr);
1670 try self.genBinMathOpMir(.add, ptr_ty, dst_mcv, .{ .register = offset_reg });1671 try self.genBinMathOpMir(.add, ptr_ty, dst_mcv, .{ .register = offset_reg });
1671 break :result dst_mcv;1672 break :result dst_mcv;
1672 };1673 };
...@@ -2113,7 +2114,7 @@ fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, inde...@@ -2113,7 +2114,7 @@ fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, inde
2113 self.register_manager.freezeRegs(&.{offset_reg});2114 self.register_manager.freezeRegs(&.{offset_reg});
2114 defer self.register_manager.unfreezeRegs(&.{offset_reg});2115 defer self.register_manager.unfreezeRegs(&.{offset_reg});
21152116
2116 const dst_mcv = try self.copyToNewRegister(inst, ptr_ty, mcv);2117 const dst_mcv = try self.copyToRegisterWithInstTracking(inst, ptr_ty, mcv);
2117 try self.genBinMathOpMir(.add, ptr_ty, dst_mcv, .{ .register = offset_reg });2118 try self.genBinMathOpMir(.add, ptr_ty, dst_mcv, .{ .register = offset_reg });
2118 break :result dst_mcv;2119 break :result dst_mcv;
2119 },2120 },
...@@ -2174,7 +2175,9 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -2174,7 +2175,9 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
2174 if (self.reuseOperand(inst, operand, 0, mcv)) {2175 if (self.reuseOperand(inst, operand, 0, mcv)) {
2175 break :blk mcv;2176 break :blk mcv;
2176 } else {2177 } else {
2177 const dst_mcv = try self.copyToNewRegister(inst, Type.usize, .{ .register = reg.to64() });2178 const dst_mcv = try self.copyToRegisterWithInstTracking(inst, Type.usize, .{
2179 .register = reg.to64(),
2180 });
2178 break :blk dst_mcv;2181 break :blk dst_mcv;
2179 }2182 }
2180 };2183 };
...@@ -2237,7 +2240,7 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:...@@ -2237,7 +2240,7 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:
2237 // LHS dies; use it as the destination.2240 // LHS dies; use it as the destination.
2238 // Both operands cannot be memory.2241 // Both operands cannot be memory.
2239 if (lhs.isMemory() and rhs.isMemory()) {2242 if (lhs.isMemory() and rhs.isMemory()) {
2240 dst_mcv = try self.copyToNewRegister(inst, dst_ty, lhs);2243 dst_mcv = try self.copyToRegisterWithInstTracking(inst, dst_ty, lhs);
2241 src_mcv = rhs;2244 src_mcv = rhs;
2242 } else {2245 } else {
2243 dst_mcv = lhs;2246 dst_mcv = lhs;
...@@ -2247,7 +2250,7 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:...@@ -2247,7 +2250,7 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:
2247 // RHS dies; use it as the destination.2250 // RHS dies; use it as the destination.
2248 // Both operands cannot be memory.2251 // Both operands cannot be memory.
2249 if (lhs.isMemory() and rhs.isMemory()) {2252 if (lhs.isMemory() and rhs.isMemory()) {
2250 dst_mcv = try self.copyToNewRegister(inst, dst_ty, rhs);2253 dst_mcv = try self.copyToRegisterWithInstTracking(inst, dst_ty, rhs);
2251 src_mcv = lhs;2254 src_mcv = lhs;
2252 } else {2255 } else {
2253 dst_mcv = rhs;2256 dst_mcv = rhs;
...@@ -2258,13 +2261,13 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:...@@ -2258,13 +2261,13 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:
2258 rhs.freezeIfRegister(&self.register_manager);2261 rhs.freezeIfRegister(&self.register_manager);
2259 defer rhs.unfreezeIfRegister(&self.register_manager);2262 defer rhs.unfreezeIfRegister(&self.register_manager);
22602263
2261 dst_mcv = try self.copyToNewRegister(inst, dst_ty, lhs);2264 dst_mcv = try self.copyToRegisterWithInstTracking(inst, dst_ty, lhs);
2262 src_mcv = rhs;2265 src_mcv = rhs;
2263 } else {2266 } else {
2264 lhs.freezeIfRegister(&self.register_manager);2267 lhs.freezeIfRegister(&self.register_manager);
2265 defer lhs.unfreezeIfRegister(&self.register_manager);2268 defer lhs.unfreezeIfRegister(&self.register_manager);
22662269
2267 dst_mcv = try self.copyToNewRegister(inst, dst_ty, rhs);2270 dst_mcv = try self.copyToRegisterWithInstTracking(inst, dst_ty, rhs);
2268 src_mcv = lhs;2271 src_mcv = lhs;
2269 }2272 }
2270 }2273 }
...@@ -2837,7 +2840,11 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void {...@@ -2837,7 +2840,11 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void {
2837 .register => |reg| {2840 .register => |reg| {
2838 if (Register.allocIndex(reg) == null) {2841 if (Register.allocIndex(reg) == null) {
2839 // Save function return value in a callee saved register2842 // Save function return value in a callee saved register
2840 break :result try self.copyToNewRegister(inst, self.air.typeOfIndex(inst), info.return_value);2843 break :result try self.copyToRegisterWithInstTracking(
2844 inst,
2845 self.air.typeOfIndex(inst),
2846 info.return_value,
2847 );
2841 }2848 }
2842 },2849 },
2843 else => {},2850 else => {},