authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-05 04:10:38-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-05 04:10:38-04:00
logcc6694a323950d53e79afc76ba5a8000386f555b
treecd2b3ab83fa10e402dd53533e40156fad50120e0
parentc2ec518fe2704422017b09c0808ec1a40c0ec0ed

x86_64: implement C abi for f128


7 files changed, 13 insertions(+), 15 deletions(-)

src/arch/x86_64/CodeGen.zig+5-6
......@@ -12566,7 +12566,7 @@ fn resolveCallingConventionValues(
1256612566 abi.getCAbiIntReturnRegs(resolved_cc)[0..classes.len],
1256712567 0..,
1256812568 ) |class, ret_reg, ret_reg_i| {
12569 result.return_value = switch (classes[0]) {
12569 result.return_value = switch (class) {
1257012570 .integer => switch (ret_reg_i) {
1257112571 0 => InstTracking.init(.{ .register = registerAlias(
1257212572 ret_reg,
......@@ -12582,6 +12582,7 @@ fn resolveCallingConventionValues(
1258212582 0 => InstTracking.init(.{ .register = .xmm0 }),
1258312583 else => return self.fail("TODO handle multiple classes per type", .{}),
1258412584 },
12585 .sseup => continue,
1258512586 .memory => switch (ret_reg_i) {
1258612587 0 => ret: {
1258712588 const ret_indirect_reg =
......@@ -12602,7 +12603,7 @@ fn resolveCallingConventionValues(
1260212603 }
1260312604
1260412605 // Input params
12605 next_param: for (param_types, result.args) |ty, *arg| {
12606 for (param_types, result.args) |ty, *arg| {
1260612607 assert(ty.hasRuntimeBitsIgnoreComptime(mod));
1260712608
1260812609 const classes = switch (self.target.os.tag) {
......@@ -12620,7 +12621,6 @@ fn resolveCallingConventionValues(
1262012621 1 => .{ .register_pair = .{ arg.register, param_reg } },
1262112622 else => return self.fail("TODO handle multiple classes per type", .{}),
1262212623 };
12623 continue;
1262412624 } else break,
1262512625 .float, .sse => switch (self.target.os.tag) {
1262612626 .windows => if (param_reg_i < 4) {
......@@ -12630,7 +12630,6 @@ fn resolveCallingConventionValues(
1263012630 .register = @enumFromInt(@intFromEnum(Register.xmm0) + param_reg_i),
1263112631 };
1263212632 param_reg_i += 1;
12633 continue;
1263412633 } else break,
1263512634 else => if (param_sse_reg_i < 8) {
1263612635 if (class_i > 0)
......@@ -12639,15 +12638,15 @@ fn resolveCallingConventionValues(
1263912638 @intFromEnum(Register.xmm0) + param_sse_reg_i,
1264012639 ) };
1264112640 param_sse_reg_i += 1;
12642 continue;
1264312641 } else break,
1264412642 },
12643 .sseup => {},
1264512644 .memory => break,
1264612645 else => return self.fail("TODO handle calling convention class {s}", .{
1264712646 @tagName(class),
1264812647 }),
1264912648 }
12650 } else continue :next_param;
12649 } else continue;
1265112650
1265212651 const param_size: u31 = @intCast(ty.abiSize(mod));
1265312652 const param_align: u31 = @intCast(ty.abiAlignment(mod).toByteUnitsOptional().?);
test/behavior/abs.zig+1-1
......@@ -97,7 +97,7 @@ test "@abs floats" {
9797 try comptime testAbsFloats(f80);
9898 if (builtin.zig_backend != .stage2_x86_64 and builtin.zig_backend != .stage2_wasm) try testAbsFloats(f80);
9999 try comptime testAbsFloats(f128);
100 if (builtin.zig_backend != .stage2_x86_64 and builtin.zig_backend != .stage2_wasm) try testAbsFloats(f128);
100 if (builtin.zig_backend != .stage2_wasm) try testAbsFloats(f128);
101101}
102102
103103fn testAbsFloats(comptime T: type) !void {
test/behavior/bitcast.zig+1-1
......@@ -297,11 +297,11 @@ test "triple level result location with bitcast sandwich passed as tuple element
297297test "@bitCast packed struct of floats" {
298298 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
299299 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
300 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
301300 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
302301 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
303302 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
304303 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
304 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
305305
306306 const Foo = packed struct {
307307 a: f16 = 0,
test/behavior/cast.zig+2-2
......@@ -1369,10 +1369,10 @@ fn boolToStr(b: bool) []const u8 {
13691369test "cast f16 to wider types" {
13701370 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13711371 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1372 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
13731372 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13741373 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13751374 if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
1375 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
13761376
13771377 const S = struct {
13781378 fn doTheTest() !void {
......@@ -1389,9 +1389,9 @@ test "cast f16 to wider types" {
13891389test "cast f128 to narrower types" {
13901390 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13911391 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1392 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
13931392 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13941393 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1394 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
13951395
13961396 const S = struct {
13971397 fn doTheTest() !void {
test/behavior/floatop.zig+1-1
......@@ -130,7 +130,7 @@ test "cmp f128" {
130130 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
131131 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
132132 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
133 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
133 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
134134
135135 try testCmp(f128);
136136 try comptime testCmp(f128);
test/behavior/math.zig+2-3
......@@ -637,11 +637,11 @@ fn testShrTrunc(x: u16) !void {
637637}
638638
639639test "f128" {
640 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
641640 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
642641 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
643642 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
644643 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
644 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
645645
646646 try test_f128();
647647 try comptime test_f128();
......@@ -1481,7 +1481,6 @@ test "@round f80" {
14811481test "@round f128" {
14821482 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14831483 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1484 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
14851484 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14861485 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14871486 if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
......@@ -1522,9 +1521,9 @@ test "vector integer addition" {
15221521test "NaN comparison" {
15231522 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15241523 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1525 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
15261524 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
15271525 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1526 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
15281527
15291528 try testNanEqNan(f16);
15301529 try testNanEqNan(f32);
test/behavior/widening.zig+1-1
......@@ -60,11 +60,11 @@ test "float widening" {
6060}
6161
6262test "float widening f16 to f128" {
63 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
6463 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6564 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6665 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
6766 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
67 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
6868
6969 var x: f16 = 12.34;
7070 var y: f128 = x;