aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-04-02 22:25:35 -0400
committerJakub Konka <kubkon@jakubkonka.com>2023-04-03 17:45:16 +0200
commit1980f5479b2139112ff67de5d5f2e6af09fb215e (patch)
treea0faed4b737de0e5ed4f972517d6ed09bf2ce79e /src
parent272acb7ee5368a32d9f4bc559e93d96759b80173 (diff)
downloadzig-1980f5479b2139112ff67de5d5f2e6af09fb215e.tar.gz
zig-1980f5479b2139112ff67de5d5f2e6af09fb215e.zip
x86_64: implement store to immediate address
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig32
1 files changed, 12 insertions, 20 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index f3bd6a9e8a..44362f9bc0 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -3651,10 +3651,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
.dead => unreachable,
.eflags => unreachable,
.register_overflow => unreachable,
- .immediate => |imm| {
- try self.setRegOrMem(value_ty, .{ .memory = imm }, value);
- },
- .stack_offset => {
+ .immediate, .stack_offset => {
const reg = try self.copyToTmpRegister(ptr_ty, ptr);
try self.store(.{ .register = reg }, value, ptr_ty, value_ty);
},
@@ -3748,23 +3745,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
-@intCast(i32, overflow_bit_offset),
);
},
- .linker_load,
- .memory,
- .stack_offset,
- => {
- if (abi_size <= 8) {
- const tmp_reg = try self.copyToTmpRegister(value_ty, value);
- return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
- }
-
- try self.genInlineMemcpy(.{ .stack_offset = 0 }, value, .{ .immediate = abi_size }, .{
- .source_stack_base = .rbp,
- .dest_stack_base = reg.to64(),
- });
- },
+ .linker_load, .memory, .stack_offset => if (abi_size <= 8) {
+ const tmp_reg = try self.copyToTmpRegister(value_ty, value);
+ try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
+ } else try self.genInlineMemcpy(
+ .{ .stack_offset = 0 },
+ value,
+ .{ .immediate = abi_size },
+ .{ .source_stack_base = .rbp, .dest_stack_base = reg.to64() },
+ ),
.ptr_stack_offset => {
const tmp_reg = try self.copyToTmpRegister(value_ty, value);
- return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
+ try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
},
}
},
@@ -3788,7 +3780,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
);
const new_ptr = MCValue{ .register = addr_reg.to64() };
- return self.store(new_ptr, value, ptr_ty, value_ty);
+ try self.store(new_ptr, value, ptr_ty, value_ty);
},
}
}