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...@@ -3651,10 +3651,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
3651 .dead => unreachable,3651 .dead => unreachable,
3652 .eflags => unreachable,3652 .eflags => unreachable,
3653 .register_overflow => unreachable,3653 .register_overflow => unreachable,
3654 .immediate => |imm| {3654 .immediate, .stack_offset => {
3655 try self.setRegOrMem(value_ty, .{ .memory = imm }, value);
3656 },
3657 .stack_offset => {
3658 const reg = try self.copyToTmpRegister(ptr_ty, ptr);3655 const reg = try self.copyToTmpRegister(ptr_ty, ptr);
3659 try self.store(.{ .register = reg }, value, ptr_ty, value_ty);3656 try self.store(.{ .register = reg }, value, ptr_ty, value_ty);
3660 },3657 },
...@@ -3748,23 +3745,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type...@@ -3748,23 +3745,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
3748 -@intCast(i32, overflow_bit_offset),3745 -@intCast(i32, overflow_bit_offset),
3749 );3746 );
3750 },3747 },
3751 .linker_load,3748 .linker_load, .memory, .stack_offset => if (abi_size <= 8) {
3752 .memory,3749 const tmp_reg = try self.copyToTmpRegister(value_ty, value);
3753 .stack_offset,3750 try self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);
3754 => {3751 } else try self.genInlineMemcpy(
3755 if (abi_size <= 8) {3752 .{ .stack_offset = 0 },
3756 const tmp_reg = try self.copyToTmpRegister(value_ty, value);3753 value,
3757 return self.store(ptr, .{ .register = tmp_reg }, ptr_ty, value_ty);3754 .{ .immediate = abi_size },
3758 }3755 .{ .source_stack_base = .rbp, .dest_stack_base = reg.to64() },
37593756 ),
3760 try self.genInlineMemcpy(.{ .stack_offset = 0 }, value, .{ .immediate = abi_size }, .{
3761 .source_stack_base = .rbp,
3762 .dest_stack_base = reg.to64(),
3763 });
3764 },
3765 .ptr_stack_offset => {3757 .ptr_stack_offset => {
3766 const tmp_reg = try self.copyToTmpRegister(value_ty, value);3758 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);
3768 },3760 },
3769 }3761 }
3770 },3762 },
...@@ -3788,7 +3780,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type...@@ -3788,7 +3780,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
3788 );3780 );
37893781
3790 const new_ptr = MCValue{ .register = addr_reg.to64() };3782 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);
3792 },3784 },
3793 }3785 }
3794}3786}
test/behavior/inttoptr.zig-1
...@@ -11,7 +11,6 @@ fn addressToFunction() void {...@@ -11,7 +11,6 @@ fn addressToFunction() void {
11}11}
1212
13test "mutate through ptr initialized with constant intToPtr value" {13test "mutate through ptr initialized with constant intToPtr value" {
14 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;14 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
16 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;15 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO16 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO