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(...@@ -12566,7 +12566,7 @@ fn resolveCallingConventionValues(
12566 abi.getCAbiIntReturnRegs(resolved_cc)[0..classes.len],12566 abi.getCAbiIntReturnRegs(resolved_cc)[0..classes.len],
12567 0..,12567 0..,
12568 ) |class, ret_reg, ret_reg_i| {12568 ) |class, ret_reg, ret_reg_i| {
12569 result.return_value = switch (classes[0]) {12569 result.return_value = switch (class) {
12570 .integer => switch (ret_reg_i) {12570 .integer => switch (ret_reg_i) {
12571 0 => InstTracking.init(.{ .register = registerAlias(12571 0 => InstTracking.init(.{ .register = registerAlias(
12572 ret_reg,12572 ret_reg,
...@@ -12582,6 +12582,7 @@ fn resolveCallingConventionValues(...@@ -12582,6 +12582,7 @@ fn resolveCallingConventionValues(
12582 0 => InstTracking.init(.{ .register = .xmm0 }),12582 0 => InstTracking.init(.{ .register = .xmm0 }),
12583 else => return self.fail("TODO handle multiple classes per type", .{}),12583 else => return self.fail("TODO handle multiple classes per type", .{}),
12584 },12584 },
12585 .sseup => continue,
12585 .memory => switch (ret_reg_i) {12586 .memory => switch (ret_reg_i) {
12586 0 => ret: {12587 0 => ret: {
12587 const ret_indirect_reg =12588 const ret_indirect_reg =
...@@ -12602,7 +12603,7 @@ fn resolveCallingConventionValues(...@@ -12602,7 +12603,7 @@ fn resolveCallingConventionValues(
12602 }12603 }
1260312604
12604 // Input params12605 // Input params
12605 next_param: for (param_types, result.args) |ty, *arg| {12606 for (param_types, result.args) |ty, *arg| {
12606 assert(ty.hasRuntimeBitsIgnoreComptime(mod));12607 assert(ty.hasRuntimeBitsIgnoreComptime(mod));
1260712608
12608 const classes = switch (self.target.os.tag) {12609 const classes = switch (self.target.os.tag) {
...@@ -12620,7 +12621,6 @@ fn resolveCallingConventionValues(...@@ -12620,7 +12621,6 @@ fn resolveCallingConventionValues(
12620 1 => .{ .register_pair = .{ arg.register, param_reg } },12621 1 => .{ .register_pair = .{ arg.register, param_reg } },
12621 else => return self.fail("TODO handle multiple classes per type", .{}),12622 else => return self.fail("TODO handle multiple classes per type", .{}),
12622 };12623 };
12623 continue;
12624 } else break,12624 } else break,
12625 .float, .sse => switch (self.target.os.tag) {12625 .float, .sse => switch (self.target.os.tag) {
12626 .windows => if (param_reg_i < 4) {12626 .windows => if (param_reg_i < 4) {
...@@ -12630,7 +12630,6 @@ fn resolveCallingConventionValues(...@@ -12630,7 +12630,6 @@ fn resolveCallingConventionValues(
12630 .register = @enumFromInt(@intFromEnum(Register.xmm0) + param_reg_i),12630 .register = @enumFromInt(@intFromEnum(Register.xmm0) + param_reg_i),
12631 };12631 };
12632 param_reg_i += 1;12632 param_reg_i += 1;
12633 continue;
12634 } else break,12633 } else break,
12635 else => if (param_sse_reg_i < 8) {12634 else => if (param_sse_reg_i < 8) {
12636 if (class_i > 0)12635 if (class_i > 0)
...@@ -12639,15 +12638,15 @@ fn resolveCallingConventionValues(...@@ -12639,15 +12638,15 @@ fn resolveCallingConventionValues(
12639 @intFromEnum(Register.xmm0) + param_sse_reg_i,12638 @intFromEnum(Register.xmm0) + param_sse_reg_i,
12640 ) };12639 ) };
12641 param_sse_reg_i += 1;12640 param_sse_reg_i += 1;
12642 continue;
12643 } else break,12641 } else break,
12644 },12642 },
12643 .sseup => {},
12645 .memory => break,12644 .memory => break,
12646 else => return self.fail("TODO handle calling convention class {s}", .{12645 else => return self.fail("TODO handle calling convention class {s}", .{
12647 @tagName(class),12646 @tagName(class),
12648 }),12647 }),
12649 }12648 }
12650 } else continue :next_param;12649 } else continue;
1265112650
12652 const param_size: u31 = @intCast(ty.abiSize(mod));12651 const param_size: u31 = @intCast(ty.abiSize(mod));
12653 const param_align: u31 = @intCast(ty.abiAlignment(mod).toByteUnitsOptional().?);12652 const param_align: u31 = @intCast(ty.abiAlignment(mod).toByteUnitsOptional().?);
test/behavior/abs.zig+1-1
...@@ -97,7 +97,7 @@ test "@abs floats" {...@@ -97,7 +97,7 @@ test "@abs floats" {
97 try comptime testAbsFloats(f80);97 try comptime testAbsFloats(f80);
98 if (builtin.zig_backend != .stage2_x86_64 and builtin.zig_backend != .stage2_wasm) try testAbsFloats(f80);98 if (builtin.zig_backend != .stage2_x86_64 and builtin.zig_backend != .stage2_wasm) try testAbsFloats(f80);
99 try comptime testAbsFloats(f128);99 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);
101}101}
102102
103fn testAbsFloats(comptime T: type) !void {103fn 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...@@ -297,11 +297,11 @@ test "triple level result location with bitcast sandwich passed as tuple element
297test "@bitCast packed struct of floats" {297test "@bitCast packed struct of floats" {
298 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;298 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
299 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;299 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
300 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
301 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;300 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
302 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;301 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
303 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO302 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
304 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;303 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
306 const Foo = packed struct {306 const Foo = packed struct {
307 a: f16 = 0,307 a: f16 = 0,
test/behavior/cast.zig+2-2
...@@ -1369,10 +1369,10 @@ fn boolToStr(b: bool) []const u8 {...@@ -1369,10 +1369,10 @@ fn boolToStr(b: bool) []const u8 {
1369test "cast f16 to wider types" {1369test "cast f16 to wider types" {
1370 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1370 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1371 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1371 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1372 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1373 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1372 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1374 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1373 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1375 if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;1374 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
1377 const S = struct {1377 const S = struct {
1378 fn doTheTest() !void {1378 fn doTheTest() !void {
...@@ -1389,9 +1389,9 @@ test "cast f16 to wider types" {...@@ -1389,9 +1389,9 @@ test "cast f16 to wider types" {
1389test "cast f128 to narrower types" {1389test "cast f128 to narrower types" {
1390 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1390 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1391 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1391 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1392 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1393 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1392 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1394 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1393 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
1396 const S = struct {1396 const S = struct {
1397 fn doTheTest() !void {1397 fn doTheTest() !void {
test/behavior/floatop.zig+1-1
...@@ -130,7 +130,7 @@ test "cmp f128" {...@@ -130,7 +130,7 @@ test "cmp f128" {
130 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO130 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
131 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;131 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
132 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;132 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
135 try testCmp(f128);135 try testCmp(f128);
136 try comptime testCmp(f128);136 try comptime testCmp(f128);
test/behavior/math.zig+2-3
...@@ -637,11 +637,11 @@ fn testShrTrunc(x: u16) !void {...@@ -637,11 +637,11 @@ fn testShrTrunc(x: u16) !void {
637}637}
638638
639test "f128" {639test "f128" {
640 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
641 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO640 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
642 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO641 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
643 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO642 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
644 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;643 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
646 try test_f128();646 try test_f128();
647 try comptime test_f128();647 try comptime test_f128();
...@@ -1481,7 +1481,6 @@ test "@round f80" {...@@ -1481,7 +1481,6 @@ test "@round f80" {
1481test "@round f128" {1481test "@round f128" {
1482 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1482 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1483 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1483 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1484 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1485 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1484 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1486 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1485 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1487 if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;1486 if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest;
...@@ -1522,9 +1521,9 @@ test "vector integer addition" {...@@ -1522,9 +1521,9 @@ test "vector integer addition" {
1522test "NaN comparison" {1521test "NaN comparison" {
1523 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1522 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1524 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1523 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1525 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1526 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1524 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1527 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1525 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
1529 try testNanEqNan(f16);1528 try testNanEqNan(f16);
1530 try testNanEqNan(f32);1529 try testNanEqNan(f32);
test/behavior/widening.zig+1-1
...@@ -60,11 +60,11 @@ test "float widening" {...@@ -60,11 +60,11 @@ test "float widening" {
60}60}
6161
62test "float widening f16 to f128" {62test "float widening f16 to f128" {
63 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
64 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO63 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
65 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO64 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO65 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
67 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;66 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
69 var x: f16 = 12.34;69 var x: f16 = 12.34;
70 var y: f128 = x;70 var y: f128 = x;