aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-06-07 18:30:59 +0200
committerJakub Konka <kubkon@jakubkonka.com>2022-06-07 19:33:43 +0200
commit03068ce6a67d2cf83954606dc96329b85bd4be1a (patch)
treec77dc2b1edcfec298db9cae0d16b2f65be36ac92 /src
parenta8bce8f14b5a2a3a6b5e069f3b434fd9430d9a8e (diff)
downloadzig-03068ce6a67d2cf83954606dc96329b85bd4be1a.tar.gz
zig-03068ce6a67d2cf83954606dc96329b85bd4be1a.zip
x64: clean up store helper
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig51
1 files changed, 9 insertions, 42 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 5c81233845..839063e0e4 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -2730,15 +2730,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
// movabs does not support indirect register addressing
// so we need an extra register and an extra mov.
const tmp_reg = try self.copyToTmpRegister(value_ty, value);
- _ = try self.addInst(.{
- .tag = .mov,
- .ops = Mir.Inst.Ops.encode(.{
- .reg1 = reg.to64(),
- .reg2 = tmp_reg.to64(),
- .flags = 0b10,
- }),
- .data = .{ .imm = 0 },
- });
+ return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
},
else => {
return self.fail("TODO implement set pointee with immediate of ABI size {d}", .{abi_size});
@@ -2835,6 +2827,8 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
.data = .{ .imm = 0 },
});
+ const new_ptr = MCValue{ .register = addr_reg.to64() };
+
switch (value) {
.immediate => |imm| {
if (abi_size > 8) {
@@ -2873,16 +2867,8 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
.data = .{ .payload = payload },
});
},
- .register => |reg| {
- _ = try self.addInst(.{
- .tag = .mov,
- .ops = Mir.Inst.Ops.encode(.{
- .reg1 = addr_reg.to64(),
- .reg2 = reg,
- .flags = 0b10,
- }),
- .data = .{ .imm = 0 },
- });
+ .register => {
+ return self.store(new_ptr, value, ptr_ty, value_ty);
},
.got_load,
.direct_load,
@@ -2904,37 +2890,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
}),
.data = .{ .imm = 0 },
});
- _ = try self.addInst(.{
- .tag = .mov,
- .ops = Mir.Inst.Ops.encode(.{
- .reg1 = addr_reg.to64(),
- .reg2 = tmp_reg,
- .flags = 0b10,
- }),
- .data = .{ .imm = 0 },
- });
- return;
+ return self.store(new_ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
}
- try self.genInlineMemcpy(.{ .register = addr_reg.to64() }, value, .{ .immediate = abi_size }, .{});
+ try self.genInlineMemcpy(new_ptr, value, .{ .immediate = abi_size }, .{});
},
.stack_offset => {
if (abi_size <= 8) {
- // TODO this should really be a recursive call
const tmp_reg = try self.copyToTmpRegister(value_ty, value);
- _ = try self.addInst(.{
- .tag = .mov,
- .ops = Mir.Inst.Ops.encode(.{
- .reg1 = addr_reg.to64(),
- .reg2 = tmp_reg,
- .flags = 0b10,
- }),
- .data = .{ .imm = 0 },
- });
- return;
+ return self.store(new_ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
}
- try self.genInlineMemcpy(.{ .register = addr_reg.to64() }, value, .{ .immediate = abi_size }, .{});
+ try self.genInlineMemcpy(new_ptr, value, .{ .immediate = abi_size }, .{});
},
else => return self.fail("TODO implement storing {} to MCValue.memory", .{value}),
}