authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-11 15:04:59+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-16 14:13:06+01:00
logc7775a9f628a7fa971e85dec65e1400866ad012c
tree705334e82a02795cea34628feeeff10128a63327
parent5283a52af565521094bcd1186efc179b4be7ee8c

x64: impl genBinMathOpMir for ptr_stack_off and PIE memory


2 files changed, 11 insertions(+), 8 deletions(-)

src/arch/x86_64/CodeGen.zig+11-5
...@@ -2244,7 +2244,9 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC...@@ -2244,7 +2244,9 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
2244 .none => unreachable,2244 .none => unreachable,
2245 .undef => try self.genSetReg(dst_ty, dst_reg, .undef),2245 .undef => try self.genSetReg(dst_ty, dst_reg, .undef),
2246 .dead, .unreach => unreachable,2246 .dead, .unreach => unreachable,
2247 .ptr_stack_offset => unreachable,2247 .ptr_stack_offset => |off| {
2248 return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .immediate = @bitCast(u32, off) });
2249 },
2248 .ptr_embedded_in_code => unreachable,2250 .ptr_embedded_in_code => unreachable,
2249 .register => |src_reg| {2251 .register => |src_reg| {
2250 _ = try self.addInst(.{2252 _ = try self.addInst(.{
...@@ -2265,16 +2267,17 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC...@@ -2265,16 +2267,17 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
2265 .data = .{ .imm = @truncate(u32, imm) },2267 .data = .{ .imm = @truncate(u32, imm) },
2266 });2268 });
2267 },2269 },
2268 .embedded_in_code, .memory => {2270 .embedded_in_code,
2271 .memory,
2272 .got_load,
2273 .direct_load,
2274 => {
2269 assert(abi_size <= 8);2275 assert(abi_size <= 8);
2270 self.register_manager.freezeRegs(&.{dst_reg});2276 self.register_manager.freezeRegs(&.{dst_reg});
2271 defer self.register_manager.unfreezeRegs(&.{dst_reg});2277 defer self.register_manager.unfreezeRegs(&.{dst_reg});
2272 const reg = try self.copyToTmpRegister(dst_ty, src_mcv);2278 const reg = try self.copyToTmpRegister(dst_ty, src_mcv);
2273 return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .register = reg });2279 return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .register = reg });
2274 },2280 },
2275 .got_load, .direct_load => {
2276 return self.fail("TODO implement x86 ADD/SUB/CMP source symbol at index in linker", .{});
2277 },
2278 .stack_offset => |off| {2281 .stack_offset => |off| {
2279 if (off > math.maxInt(i32)) {2282 if (off > math.maxInt(i32)) {
2280 return self.fail("stack offset too large", .{});2283 return self.fail("stack offset too large", .{});
...@@ -4620,6 +4623,9 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {...@@ -4620,6 +4623,9 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
4620 }4623 }
46214624
4622 switch (typed_value.ty.zigTypeTag()) {4625 switch (typed_value.ty.zigTypeTag()) {
4626 .Array => {
4627 return self.lowerUnnamedConst(typed_value);
4628 },
4623 .Pointer => switch (typed_value.ty.ptrSize()) {4629 .Pointer => switch (typed_value.ty.ptrSize()) {
4624 .Slice => {4630 .Slice => {
4625 return self.lowerUnnamedConst(typed_value);4631 return self.lowerUnnamedConst(typed_value);
test/behavior/slice.zig-3
...@@ -29,7 +29,6 @@ comptime {...@@ -29,7 +29,6 @@ comptime {
29test "slicing" {29test "slicing" {
30 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;30 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
31 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;31 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
32 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
33 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO32 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
3433
35 var array: [20]i32 = undefined;34 var array: [20]i32 = undefined;
...@@ -223,7 +222,6 @@ test "compile time slice of pointer to hard coded address" {...@@ -223,7 +222,6 @@ test "compile time slice of pointer to hard coded address" {
223test "slice string literal has correct type" {222test "slice string literal has correct type" {
224 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;223 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
225 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;224 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
226 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
227225
228 comptime {226 comptime {
229 try expect(@TypeOf("aoeu"[0..]) == *const [4:0]u8);227 try expect(@TypeOf("aoeu"[0..]) == *const [4:0]u8);
...@@ -365,7 +363,6 @@ test "empty array to slice" {...@@ -365,7 +363,6 @@ test "empty array to slice" {
365test "@ptrCast slice to pointer" {363test "@ptrCast slice to pointer" {
366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;364 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
367 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;365 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
368 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
369366
370 const S = struct {367 const S = struct {
371 fn doTheTest() !void {368 fn doTheTest() !void {