authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-04-02 22:25:35-04:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-03 17:45:16+02:00
log1980f5479b2139112ff67de5d5f2e6af09fb215e
treea0faed4b737de0e5ed4f972517d6ed09bf2ce79e
parent272acb7ee5368a32d9f4bc559e93d96759b80173

x86_64: implement store to immediate address


2 files changed, 12 insertions(+), 21 deletions(-)

src/arch/x86_64/CodeGen.zig+12-20
......@@ -3651,10 +3651,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
36513651 .dead => unreachable,
36523652 .eflags => unreachable,
36533653 .register_overflow => unreachable,
3654 .immediate => |imm| {
3655 try self.setRegOrMem(value_ty, .{ .memory = imm }, value);
3656 },
3657 .stack_offset => {
3654 .immediate, .stack_offset => {
36583655 const reg = try self.copyToTmpRegister(ptr_ty, ptr);
36593656 try self.store(.{ .register = reg }, value, ptr_ty, value_ty);
36603657 },
......@@ -3748,23 +3745,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
37483745 -@intCast(i32, overflow_bit_offset),
37493746 );
37503747 },
3751 .linker_load,
3752 .memory,
3753 .stack_offset,
3754 => {
3755 if (abi_size <= 8) {
3756 const tmp_reg = try self.copyToTmpRegister(value_ty, value);
3757 return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
3758 }
3759
3760 try self.genInlineMemcpy(.{ .stack_offset = 0 }, value, .{ .immediate = abi_size }, .{
3761 .source_stack_base = .rbp,
3762 .dest_stack_base = reg.to64(),
3763 });
3764 },
3748 .linker_load, .memory, .stack_offset => if (abi_size <= 8) {
3749 const tmp_reg = try self.copyToTmpRegister(value_ty, value);
3750 try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
3751 } else try self.genInlineMemcpy(
3752 .{ .stack_offset = 0 },
3753 value,
3754 .{ .immediate = abi_size },
3755 .{ .source_stack_base = .rbp, .dest_stack_base = reg.to64() },
3756 ),
37653757 .ptr_stack_offset => {
37663758 const tmp_reg = try self.copyToTmpRegister(value_ty, value);
3767 return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
3759 try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
37683760 },
37693761 }
37703762 },
......@@ -3788,7 +3780,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
37883780 );
37893781
37903782 const new_ptr = MCValue{ .register = addr_reg.to64() };
3791 return self.store(new_ptr, value, ptr_ty, value_ty);
3783 try self.store(new_ptr, value, ptr_ty, value_ty);
37923784 },
37933785 }
37943786}
test/behavior/inttoptr.zig-1
......@@ -11,7 +11,6 @@ fn addressToFunction() void {
1111}
1212
1313test "mutate through ptr initialized with constant intToPtr value" {
14 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
1514 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1615 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1716 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO