authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-09-24 23:32:05-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-01 15:09:52-04:00
log8470652f10a07f03b24746ffd786f6f5f4aabccc
tree80568b00172f68b5d112e1f2eccb848c5daf4f6e
parent6d5cbdb86394d517a3428242a7ab26384843fc0c

x86_64: implement float compare and cast builtins


11 files changed, 384 insertions(+), 239 deletions(-)

lib/compiler_rt/common.zig+2-2
...@@ -82,7 +82,7 @@ pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, _: ?...@@ -82,7 +82,7 @@ pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, _: ?
82/// need for extending them to wider fp types.82/// need for extending them to wider fp types.
83/// TODO remove this; do this type selection in the language rather than83/// TODO remove this; do this type selection in the language rather than
84/// here in compiler-rt.84/// here in compiler-rt.
85pub fn F16T(comptime other_type: type) type {85pub fn F16T(comptime OtherType: type) type {
86 return switch (builtin.cpu.arch) {86 return switch (builtin.cpu.arch) {
87 .arm, .armeb, .thumb, .thumbeb => if (std.Target.arm.featureSetHas(builtin.cpu.features, .has_v8))87 .arm, .armeb, .thumb, .thumbeb => if (std.Target.arm.featureSetHas(builtin.cpu.features, .has_v8))
88 switch (builtin.abi.floatAbi()) {88 switch (builtin.abi.floatAbi()) {
...@@ -93,7 +93,7 @@ pub fn F16T(comptime other_type: type) type {...@@ -93,7 +93,7 @@ pub fn F16T(comptime other_type: type) type {
93 u16,93 u16,
94 .aarch64, .aarch64_be, .aarch64_32 => f16,94 .aarch64, .aarch64_be, .aarch64_32 => f16,
95 .riscv64 => if (builtin.zig_backend == .stage1) u16 else f16,95 .riscv64 => if (builtin.zig_backend == .stage1) u16 else f16,
96 .x86, .x86_64 => if (builtin.target.isDarwin()) switch (other_type) {96 .x86, .x86_64 => if (builtin.target.isDarwin()) switch (OtherType) {
97 // Starting with LLVM 16, Darwin uses different abi for f1697 // Starting with LLVM 16, Darwin uses different abi for f16
98 // depending on the type of the other return/argument..???98 // depending on the type of the other return/argument..???
99 f32, f64 => u16,99 f32, f64 => u16,
src/arch/x86_64/CodeGen.zig+378-200
...@@ -2515,63 +2515,96 @@ fn airFptrunc(self: *Self, inst: Air.Inst.Index) !void {...@@ -2515,63 +2515,96 @@ fn airFptrunc(self: *Self, inst: Air.Inst.Index) !void {
2515 const src_ty = self.typeOf(ty_op.operand);2515 const src_ty = self.typeOf(ty_op.operand);
2516 const src_bits = src_ty.floatBits(self.target.*);2516 const src_bits = src_ty.floatBits(self.target.*);
25172517
2518 const src_mcv = try self.resolveInst(ty_op.operand);2518 const result = result: {
2519 const dst_mcv = if (src_mcv.isRegister() and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))2519 if (switch (dst_bits) {
2520 src_mcv2520 16 => switch (src_bits) {
2521 else2521 32 => !self.hasFeature(.f16c),
2522 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);2522 64, 80, 128 => true,
2523 const dst_reg = dst_mcv.getReg().?.to128();2523 else => unreachable,
2524 const dst_lock = self.register_manager.lockReg(dst_reg);2524 },
2525 defer if (dst_lock) |lock| self.register_manager.unlockReg(lock);2525 32 => switch (src_bits) {
2526 64 => false,
2527 80, 128 => true,
2528 else => unreachable,
2529 },
2530 64 => switch (src_bits) {
2531 80, 128 => true,
2532 else => unreachable,
2533 },
2534 80 => switch (dst_bits) {
2535 128 => true,
2536 else => unreachable,
2537 },
2538 else => unreachable,
2539 }) {
2540 var callee: ["__trunc?f?f2".len]u8 = undefined;
2541 break :result try self.genCall(.{ .lib = .{
2542 .return_type = self.floatCompilerRtAbiType(dst_ty, src_ty).toIntern(),
2543 .param_types = &.{self.floatCompilerRtAbiType(src_ty, dst_ty).toIntern()},
2544 .callee = std.fmt.bufPrint(&callee, "__trunc{c}f{c}f2", .{
2545 floatCompilerRtAbiName(src_bits),
2546 floatCompilerRtAbiName(dst_bits),
2547 }) catch unreachable,
2548 } }, &.{ty_op.operand});
2549 }
2550
2551 const src_mcv = try self.resolveInst(ty_op.operand);
2552 const dst_mcv = if (src_mcv.isRegister() and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
2553 src_mcv
2554 else
2555 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);
2556 const dst_reg = dst_mcv.getReg().?.to128();
2557 const dst_lock = self.register_manager.lockReg(dst_reg);
2558 defer if (dst_lock) |lock| self.register_manager.unlockReg(lock);
25262559
2527 if (dst_bits == 16 and self.hasFeature(.f16c)) {2560 if (dst_bits == 16) {
2528 switch (src_bits) {2561 assert(self.hasFeature(.f16c));
2529 32 => {2562 switch (src_bits) {
2530 const mat_src_reg = if (src_mcv.isRegister())2563 32 => {
2564 const mat_src_reg = if (src_mcv.isRegister())
2565 src_mcv.getReg().?
2566 else
2567 try self.copyToTmpRegister(src_ty, src_mcv);
2568 try self.asmRegisterRegisterImmediate(
2569 .{ .v_, .cvtps2ph },
2570 dst_reg,
2571 mat_src_reg.to128(),
2572 Immediate.u(0b1_00),
2573 );
2574 },
2575 else => unreachable,
2576 }
2577 } else {
2578 assert(src_bits == 64 and dst_bits == 32);
2579 if (self.hasFeature(.avx)) if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory(
2580 .{ .v_ss, .cvtsd2 },
2581 dst_reg,
2582 dst_reg,
2583 src_mcv.mem(.qword),
2584 ) else try self.asmRegisterRegisterRegister(
2585 .{ .v_ss, .cvtsd2 },
2586 dst_reg,
2587 dst_reg,
2588 (if (src_mcv.isRegister())
2531 src_mcv.getReg().?2589 src_mcv.getReg().?
2532 else2590 else
2533 try self.copyToTmpRegister(src_ty, src_mcv);2591 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2534 try self.asmRegisterRegisterImmediate(2592 ) else if (src_mcv.isMemory()) try self.asmRegisterMemory(
2535 .{ .v_, .cvtps2ph },2593 .{ ._ss, .cvtsd2 },
2536 dst_reg,2594 dst_reg,
2537 mat_src_reg.to128(),2595 src_mcv.mem(.qword),
2538 Immediate.u(0b1_00),2596 ) else try self.asmRegisterRegister(
2539 );2597 .{ ._ss, .cvtsd2 },
2540 },2598 dst_reg,
2541 else => return self.fail("TODO implement airFptrunc from {} to {}", .{2599 (if (src_mcv.isRegister())
2542 src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?),2600 src_mcv.getReg().?
2543 }),2601 else
2602 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2603 );
2544 }2604 }
2545 } else if (src_bits == 64 and dst_bits == 32) {2605 break :result dst_mcv;
2546 if (self.hasFeature(.avx)) if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory(2606 };
2547 .{ .v_ss, .cvtsd2 },2607 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
2548 dst_reg,
2549 dst_reg,
2550 src_mcv.mem(.qword),
2551 ) else try self.asmRegisterRegisterRegister(
2552 .{ .v_ss, .cvtsd2 },
2553 dst_reg,
2554 dst_reg,
2555 (if (src_mcv.isRegister())
2556 src_mcv.getReg().?
2557 else
2558 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2559 ) else if (src_mcv.isMemory()) try self.asmRegisterMemory(
2560 .{ ._ss, .cvtsd2 },
2561 dst_reg,
2562 src_mcv.mem(.qword),
2563 ) else try self.asmRegisterRegister(
2564 .{ ._ss, .cvtsd2 },
2565 dst_reg,
2566 (if (src_mcv.isRegister())
2567 src_mcv.getReg().?
2568 else
2569 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2570 );
2571 } else return self.fail("TODO implement airFptrunc from {} to {}", .{
2572 src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?),
2573 });
2574 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });
2575}2608}
25762609
2577fn airFpext(self: *Self, inst: Air.Inst.Index) !void {2610fn airFpext(self: *Self, inst: Air.Inst.Index) !void {
...@@ -2581,58 +2614,96 @@ fn airFpext(self: *Self, inst: Air.Inst.Index) !void {...@@ -2581,58 +2614,96 @@ fn airFpext(self: *Self, inst: Air.Inst.Index) !void {
2581 const src_ty = self.typeOf(ty_op.operand);2614 const src_ty = self.typeOf(ty_op.operand);
2582 const src_bits = src_ty.floatBits(self.target.*);2615 const src_bits = src_ty.floatBits(self.target.*);
25832616
2584 const src_mcv = try self.resolveInst(ty_op.operand);2617 const result = result: {
2585 const dst_mcv = if (src_mcv.isRegister() and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))2618 if (switch (src_bits) {
2586 src_mcv2619 16 => switch (dst_bits) {
2587 else2620 32, 64 => !self.hasFeature(.f16c),
2588 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);2621 80, 128 => true,
2589 const dst_reg = dst_mcv.getReg().?.to128();2622 else => unreachable,
2590 const dst_lock = self.register_manager.lockReg(dst_reg);2623 },
2591 defer if (dst_lock) |lock| self.register_manager.unlockReg(lock);2624 32 => switch (dst_bits) {
2625 64 => false,
2626 80, 128 => true,
2627 else => unreachable,
2628 },
2629 64 => switch (dst_bits) {
2630 80, 128 => true,
2631 else => unreachable,
2632 },
2633 80 => switch (dst_bits) {
2634 128 => true,
2635 else => unreachable,
2636 },
2637 else => unreachable,
2638 }) {
2639 var callee: ["__extend?f?f2".len]u8 = undefined;
2640 break :result try self.genCall(.{ .lib = .{
2641 .return_type = self.floatCompilerRtAbiType(dst_ty, src_ty).toIntern(),
2642 .param_types = &.{self.floatCompilerRtAbiType(src_ty, dst_ty).toIntern()},
2643 .callee = std.fmt.bufPrint(&callee, "__extend{c}f{c}f2", .{
2644 floatCompilerRtAbiName(src_bits),
2645 floatCompilerRtAbiName(dst_bits),
2646 }) catch unreachable,
2647 } }, &.{ty_op.operand});
2648 }
25922649
2593 if (src_bits == 16 and self.hasFeature(.f16c)) {2650 const src_mcv = try self.resolveInst(ty_op.operand);
2594 const mat_src_reg = if (src_mcv.isRegister())2651 const dst_mcv = if (src_mcv.isRegister() and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
2595 src_mcv.getReg().?2652 src_mcv
2596 else2653 else
2597 try self.copyToTmpRegister(src_ty, src_mcv);2654 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);
2598 try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg, mat_src_reg.to128());2655 const dst_reg = dst_mcv.getReg().?.to128();
2599 switch (dst_bits) {2656 const dst_lock = self.register_manager.lockReg(dst_reg);
2600 32 => {},2657 defer if (dst_lock) |lock| self.register_manager.unlockReg(lock);
2601 64 => try self.asmRegisterRegisterRegister(.{ .v_sd, .cvtss2 }, dst_reg, dst_reg, dst_reg),2658
2602 else => return self.fail("TODO implement airFpext from {} to {}", .{2659 if (src_bits == 16) {
2603 src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?),2660 assert(self.hasFeature(.f16c));
2604 }),2661 const mat_src_reg = if (src_mcv.isRegister())
2605 }
2606 } else if (src_bits == 32 and dst_bits == 64) {
2607 if (self.hasFeature(.avx)) if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory(
2608 .{ .v_sd, .cvtss2 },
2609 dst_reg,
2610 dst_reg,
2611 src_mcv.mem(.dword),
2612 ) else try self.asmRegisterRegisterRegister(
2613 .{ .v_sd, .cvtss2 },
2614 dst_reg,
2615 dst_reg,
2616 (if (src_mcv.isRegister())
2617 src_mcv.getReg().?
2618 else
2619 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2620 ) else if (src_mcv.isMemory()) try self.asmRegisterMemory(
2621 .{ ._sd, .cvtss2 },
2622 dst_reg,
2623 src_mcv.mem(.dword),
2624 ) else try self.asmRegisterRegister(
2625 .{ ._sd, .cvtss2 },
2626 dst_reg,
2627 (if (src_mcv.isRegister())
2628 src_mcv.getReg().?2662 src_mcv.getReg().?
2629 else2663 else
2630 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),2664 try self.copyToTmpRegister(src_ty, src_mcv);
2631 );2665 try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, dst_reg, mat_src_reg.to128());
2632 } else return self.fail("TODO implement airFpext from {} to {}", .{2666 switch (dst_bits) {
2633 src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?),2667 32 => {},
2634 });2668 64 => try self.asmRegisterRegisterRegister(
2635 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });2669 .{ .v_sd, .cvtss2 },
2670 dst_reg,
2671 dst_reg,
2672 dst_reg,
2673 ),
2674 else => unreachable,
2675 }
2676 } else {
2677 assert(src_bits == 32 and dst_bits == 64);
2678 if (self.hasFeature(.avx)) if (src_mcv.isMemory()) try self.asmRegisterRegisterMemory(
2679 .{ .v_sd, .cvtss2 },
2680 dst_reg,
2681 dst_reg,
2682 src_mcv.mem(.dword),
2683 ) else try self.asmRegisterRegisterRegister(
2684 .{ .v_sd, .cvtss2 },
2685 dst_reg,
2686 dst_reg,
2687 (if (src_mcv.isRegister())
2688 src_mcv.getReg().?
2689 else
2690 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2691 ) else if (src_mcv.isMemory()) try self.asmRegisterMemory(
2692 .{ ._sd, .cvtss2 },
2693 dst_reg,
2694 src_mcv.mem(.dword),
2695 ) else try self.asmRegisterRegister(
2696 .{ ._sd, .cvtss2 },
2697 dst_reg,
2698 (if (src_mcv.isRegister())
2699 src_mcv.getReg().?
2700 else
2701 try self.copyToTmpRegister(src_ty, src_mcv)).to128(),
2702 );
2703 }
2704 break :result dst_mcv;
2705 };
2706 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
2636}2707}
26372708
2638fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {2709fn airIntCast(self: *Self, inst: Air.Inst.Index) !void {
...@@ -8358,26 +8429,64 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -8358,26 +8429,64 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
8358 const bin_op = self.air.instructions.items(.data)[inst].bin_op;8429 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
8359 const ty = self.typeOf(bin_op.lhs);8430 const ty = self.typeOf(bin_op.lhs);
83608431
8361 try self.spillEflagsIfOccupied();8432 const result: Condition = result: {
8362 self.eflags_inst = inst;8433 switch (ty.zigTypeTag(mod)) {
8434 .Float => {
8435 const float_bits = ty.floatBits(self.target.*);
8436 if (switch (float_bits) {
8437 16 => !self.hasFeature(.f16c),
8438 32, 64 => false,
8439 80, 128 => true,
8440 else => unreachable,
8441 }) {
8442 var callee: ["__???f2".len]u8 = undefined;
8443 const ret = try self.genCall(.{ .lib = .{
8444 .return_type = .i32_type,
8445 .param_types = &.{ ty.toIntern(), ty.toIntern() },
8446 .callee = std.fmt.bufPrint(&callee, "__{s}{c}f2", .{
8447 switch (op) {
8448 .eq => "eq",
8449 .neq => "ne",
8450 .lt => "lt",
8451 .lte => "le",
8452 .gt => "gt",
8453 .gte => "ge",
8454 },
8455 floatCompilerRtAbiName(float_bits),
8456 }) catch unreachable,
8457 } }, &.{ bin_op.lhs, bin_op.rhs });
8458 try self.genBinOpMir(.{ ._, .@"test" }, Type.i32, ret, ret);
8459 break :result switch (op) {
8460 .eq => .e,
8461 .neq => .ne,
8462 .lt => .l,
8463 .lte => .le,
8464 .gt => .g,
8465 .gte => .ge,
8466 };
8467 }
8468 },
8469 else => {},
8470 }
83638471
8364 const lhs_mcv = try self.resolveInst(bin_op.lhs);8472 try self.spillEflagsIfOccupied();
8365 const lhs_lock = switch (lhs_mcv) {
8366 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
8367 else => null,
8368 };
8369 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
83708473
8371 const rhs_mcv = try self.resolveInst(bin_op.rhs);8474 const lhs_mcv = try self.resolveInst(bin_op.lhs);
8372 const rhs_lock = switch (rhs_mcv) {8475 const lhs_lock = switch (lhs_mcv) {
8373 .register => |reg| self.register_manager.lockReg(reg),8476 .register => |reg| self.register_manager.lockRegAssumeUnused(reg),
8374 else => null,8477 else => null,
8375 };8478 };
8376 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);8479 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
83778480
8378 const result = MCValue{8481 const rhs_mcv = try self.resolveInst(bin_op.rhs);
8379 .eflags = switch (ty.zigTypeTag(mod)) {8482 const rhs_lock = switch (rhs_mcv) {
8380 else => result: {8483 .register => |reg| self.register_manager.lockReg(reg),
8484 else => null,
8485 };
8486 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
8487
8488 switch (ty.zigTypeTag(mod)) {
8489 else => {
8381 const abi_size: u16 = @intCast(ty.abiSize(mod));8490 const abi_size: u16 = @intCast(ty.abiSize(mod));
8382 const may_flip: enum {8491 const may_flip: enum {
8383 may_flip,8492 may_flip,
...@@ -8479,7 +8588,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -8479,7 +8588,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
8479 },8588 },
8480 );8589 );
8481 },8590 },
8482 .Float => result: {8591 .Float => {
8483 const flipped = switch (op) {8592 const flipped = switch (op) {
8484 .lt, .lte => true,8593 .lt, .lte => true,
8485 .eq, .gte, .gt, .neq => false,8594 .eq, .gte, .gt, .neq => false,
...@@ -8495,7 +8604,8 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -8495,7 +8604,8 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
8495 const src_mcv = if (flipped) lhs_mcv else rhs_mcv;8604 const src_mcv = if (flipped) lhs_mcv else rhs_mcv;
84968605
8497 switch (ty.floatBits(self.target.*)) {8606 switch (ty.floatBits(self.target.*)) {
8498 16 => if (self.hasFeature(.f16c)) {8607 16 => {
8608 assert(self.hasFeature(.f16c));
8499 const tmp1_reg = (try self.register_manager.allocReg(null, sse)).to128();8609 const tmp1_reg = (try self.register_manager.allocReg(null, sse)).to128();
8500 const tmp1_mcv = MCValue{ .register = tmp1_reg };8610 const tmp1_mcv = MCValue{ .register = tmp1_reg };
8501 const tmp1_lock = self.register_manager.lockRegAssumeUnused(tmp1_reg);8611 const tmp1_lock = self.register_manager.lockRegAssumeUnused(tmp1_reg);
...@@ -8524,9 +8634,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -8524,9 +8634,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
8524 try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, tmp1_reg, tmp1_reg);8634 try self.asmRegisterRegister(.{ .v_ps, .cvtph2 }, tmp1_reg, tmp1_reg);
8525 try self.asmRegisterRegister(.{ .v_, .movshdup }, tmp2_reg, tmp1_reg);8635 try self.asmRegisterRegister(.{ .v_, .movshdup }, tmp2_reg, tmp1_reg);
8526 try self.genBinOpMir(.{ ._ss, .ucomi }, ty, tmp1_mcv, tmp2_mcv);8636 try self.genBinOpMir(.{ ._ss, .ucomi }, ty, tmp1_mcv, tmp2_mcv);
8527 } else return self.fail("TODO implement airCmp for {}", .{8637 },
8528 ty.fmt(mod),
8529 }),
8530 32 => try self.genBinOpMir(8638 32 => try self.genBinOpMir(
8531 .{ ._ss, .ucomi },8639 .{ ._ss, .ucomi },
8532 ty,8640 ty,
...@@ -8539,9 +8647,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -8539,9 +8647,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
8539 .{ .register = dst_reg },8647 .{ .register = dst_reg },
8540 src_mcv,8648 src_mcv,
8541 ),8649 ),
8542 else => return self.fail("TODO implement airCmp for {}", .{8650 else => unreachable,
8543 ty.fmt(mod),
8544 }),
8545 }8651 }
85468652
8547 break :result switch (if (flipped) op.reverse() else op) {8653 break :result switch (if (flipped) op.reverse() else op) {
...@@ -8552,9 +8658,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -8552,9 +8658,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
8552 .neq => .nz_or_p,8658 .neq => .nz_or_p,
8553 };8659 };
8554 },8660 },
8555 },8661 }
8556 };8662 };
8557 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });8663
8664 self.eflags_inst = inst;
8665 return self.finishAir(inst, .{ .eflags = result }, .{ bin_op.lhs, bin_op.rhs, .none });
8558}8666}
85598667
8560fn airCmpVector(self: *Self, inst: Air.Inst.Index) !void {8668fn airCmpVector(self: *Self, inst: Air.Inst.Index) !void {
...@@ -8572,7 +8680,6 @@ fn airCmpLtErrorsLen(self: *Self, inst: Air.Inst.Index) !void {...@@ -8572,7 +8680,6 @@ fn airCmpLtErrorsLen(self: *Self, inst: Air.Inst.Index) !void {
8572 try self.genLazySymbolRef(.lea, addr_reg, link.File.LazySymbol.initDecl(.const_data, null, mod));8680 try self.genLazySymbolRef(.lea, addr_reg, link.File.LazySymbol.initDecl(.const_data, null, mod));
85738681
8574 try self.spillEflagsIfOccupied();8682 try self.spillEflagsIfOccupied();
8575 self.eflags_inst = inst;
85768683
8577 const op_ty = self.typeOf(un_op);8684 const op_ty = self.typeOf(un_op);
8578 const op_abi_size: u32 = @intCast(op_ty.abiSize(mod));8685 const op_abi_size: u32 = @intCast(op_ty.abiSize(mod));
...@@ -8586,8 +8693,9 @@ fn airCmpLtErrorsLen(self: *Self, inst: Air.Inst.Index) !void {...@@ -8586,8 +8693,9 @@ fn airCmpLtErrorsLen(self: *Self, inst: Air.Inst.Index) !void {
8586 registerAlias(dst_reg, op_abi_size),8693 registerAlias(dst_reg, op_abi_size),
8587 Memory.sib(Memory.PtrSize.fromSize(op_abi_size), .{ .base = .{ .reg = addr_reg } }),8694 Memory.sib(Memory.PtrSize.fromSize(op_abi_size), .{ .base = .{ .reg = addr_reg } }),
8588 );8695 );
8589 const result = MCValue{ .eflags = .b };8696
8590 return self.finishAir(inst, result, .{ un_op, .none, .none });8697 self.eflags_inst = inst;
8698 return self.finishAir(inst, .{ .eflags = .b }, .{ un_op, .none, .none });
8591}8699}
85928700
8593fn airTry(self: *Self, inst: Air.Inst.Index) !void {8701fn airTry(self: *Self, inst: Air.Inst.Index) !void {
...@@ -8777,7 +8885,6 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC...@@ -8777,7 +8885,6 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC
8777 }8885 }
87788886
8779 try self.spillEflagsIfOccupied();8887 try self.spillEflagsIfOccupied();
8780 self.eflags_inst = inst;
87818888
8782 const pl_ty = opt_ty.optionalChild(mod);8889 const pl_ty = opt_ty.optionalChild(mod);
87838890
...@@ -8786,6 +8893,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC...@@ -8786,6 +8893,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC
8786 else8893 else
8787 .{ .off = @intCast(pl_ty.abiSize(mod)), .ty = Type.bool };8894 .{ .off = @intCast(pl_ty.abiSize(mod)), .ty = Type.bool };
87888895
8896 self.eflags_inst = inst;
8789 switch (opt_mcv) {8897 switch (opt_mcv) {
8790 .none,8898 .none,
8791 .unreach,8899 .unreach,
...@@ -8867,7 +8975,6 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC...@@ -8867,7 +8975,6 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC
8867fn isNullPtr(self: *Self, inst: Air.Inst.Index, ptr_ty: Type, ptr_mcv: MCValue) !MCValue {8975fn isNullPtr(self: *Self, inst: Air.Inst.Index, ptr_ty: Type, ptr_mcv: MCValue) !MCValue {
8868 const mod = self.bin_file.options.module.?;8976 const mod = self.bin_file.options.module.?;
8869 try self.spillEflagsIfOccupied();8977 try self.spillEflagsIfOccupied();
8870 self.eflags_inst = inst;
88718978
8872 const opt_ty = ptr_ty.childType(mod);8979 const opt_ty = ptr_ty.childType(mod);
8873 const pl_ty = opt_ty.optionalChild(mod);8980 const pl_ty = opt_ty.optionalChild(mod);
...@@ -8893,6 +9000,8 @@ fn isNullPtr(self: *Self, inst: Air.Inst.Index, ptr_ty: Type, ptr_mcv: MCValue)...@@ -8893,6 +9000,8 @@ fn isNullPtr(self: *Self, inst: Air.Inst.Index, ptr_ty: Type, ptr_mcv: MCValue)
8893 }),9000 }),
8894 Immediate.u(0),9001 Immediate.u(0),
8895 );9002 );
9003
9004 self.eflags_inst = inst;
8896 return .{ .eflags = .e };9005 return .{ .eflags = .e };
8897}9006}
88989007
...@@ -8905,9 +9014,6 @@ fn isErr(self: *Self, maybe_inst: ?Air.Inst.Index, ty: Type, operand: MCValue) !...@@ -8905,9 +9014,6 @@ fn isErr(self: *Self, maybe_inst: ?Air.Inst.Index, ty: Type, operand: MCValue) !
8905 }9014 }
89069015
8907 try self.spillEflagsIfOccupied();9016 try self.spillEflagsIfOccupied();
8908 if (maybe_inst) |inst| {
8909 self.eflags_inst = inst;
8910 }
89119017
8912 const err_off = errUnionErrorOffset(ty.errorUnionPayload(mod), mod);9018 const err_off = errUnionErrorOffset(ty.errorUnionPayload(mod), mod);
8913 switch (operand) {9019 switch (operand) {
...@@ -8945,6 +9051,7 @@ fn isErr(self: *Self, maybe_inst: ?Air.Inst.Index, ty: Type, operand: MCValue) !...@@ -8945,6 +9051,7 @@ fn isErr(self: *Self, maybe_inst: ?Air.Inst.Index, ty: Type, operand: MCValue) !
8945 else => return self.fail("TODO implement isErr for {}", .{operand}),9051 else => return self.fail("TODO implement isErr for {}", .{operand}),
8946 }9052 }
89479053
9054 if (maybe_inst) |inst| self.eflags_inst = inst;
8948 return MCValue{ .eflags = .a };9055 return MCValue{ .eflags = .a };
8949}9056}
89509057
...@@ -10526,106 +10633,150 @@ fn airFloatFromInt(self: *Self, inst: Air.Inst.Index) !void {...@@ -10526,106 +10633,150 @@ fn airFloatFromInt(self: *Self, inst: Air.Inst.Index) !void {
10526 const mod = self.bin_file.options.module.?;10633 const mod = self.bin_file.options.module.?;
10527 const ty_op = self.air.instructions.items(.data)[inst].ty_op;10634 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1052810635
10636 const dst_ty = self.typeOfIndex(inst);
10637 const dst_bits = dst_ty.floatBits(self.target.*);
10638
10529 const src_ty = self.typeOf(ty_op.operand);10639 const src_ty = self.typeOf(ty_op.operand);
10530 const src_bits: u32 = @intCast(src_ty.bitSize(mod));10640 const src_bits: u32 = @intCast(src_ty.bitSize(mod));
10531 const src_signedness =10641 const src_signedness =
10532 if (src_ty.isAbiInt(mod)) src_ty.intInfo(mod).signedness else .unsigned;10642 if (src_ty.isAbiInt(mod)) src_ty.intInfo(mod).signedness else .unsigned;
10533 const dst_ty = self.typeOfIndex(inst);
10534
10535 const src_size = math.divCeil(u32, @max(switch (src_signedness) {10643 const src_size = math.divCeil(u32, @max(switch (src_signedness) {
10536 .signed => src_bits,10644 .signed => src_bits,
10537 .unsigned => src_bits + 1,10645 .unsigned => src_bits + 1,
10538 }, 32), 8) catch unreachable;10646 }, 32), 8) catch unreachable;
10539 if (src_size > 8) return self.fail("TODO implement airFloatFromInt from {} to {}", .{
10540 src_ty.fmt(mod), dst_ty.fmt(mod),
10541 });
1054210647
10543 const src_mcv = try self.resolveInst(ty_op.operand);10648 const result = result: {
10544 const src_reg = if (src_mcv.isRegister())10649 if (switch (dst_bits) {
10545 src_mcv.getReg().?10650 16, 80, 128 => true,
10546 else10651 32, 64 => src_size > 8 and src_size < 16,
10547 try self.copyToTmpRegister(src_ty, src_mcv);10652 else => unreachable,
10548 const src_lock = self.register_manager.lockRegAssumeUnused(src_reg);10653 }) {
10549 defer self.register_manager.unlockReg(src_lock);10654 var callee: ["__floatun?i?f".len]u8 = undefined;
10655 break :result try self.genCall(.{ .lib = .{
10656 .return_type = dst_ty.toIntern(),
10657 .param_types = &.{src_ty.toIntern()},
10658 .callee = std.fmt.bufPrint(&callee, "__float{s}{c}i{c}f", .{
10659 switch (src_signedness) {
10660 .signed => "",
10661 .unsigned => "un",
10662 },
10663 intCompilerRtAbiName(src_bits),
10664 floatCompilerRtAbiName(dst_bits),
10665 }) catch unreachable,
10666 } }, &.{ty_op.operand});
10667 }
1055010668
10551 if (src_bits < src_size * 8) try self.truncateRegister(src_ty, src_reg);10669 if (src_size > 8) return self.fail("TODO implement airFloatFromInt from {} to {}", .{
10670 src_ty.fmt(mod), dst_ty.fmt(mod),
10671 });
1055210672
10553 const dst_reg = try self.register_manager.allocReg(inst, regClassForType(dst_ty, mod));10673 const src_mcv = try self.resolveInst(ty_op.operand);
10554 const dst_mcv = MCValue{ .register = dst_reg };10674 const src_reg = if (src_mcv.isRegister())
10555 const dst_lock = self.register_manager.lockRegAssumeUnused(dst_reg);10675 src_mcv.getReg().?
10556 defer self.register_manager.unlockReg(dst_lock);10676 else
10677 try self.copyToTmpRegister(src_ty, src_mcv);
10678 const src_lock = self.register_manager.lockRegAssumeUnused(src_reg);
10679 defer self.register_manager.unlockReg(src_lock);
1055710680
10558 const mir_tag = @as(?Mir.Inst.FixedTag, switch (dst_ty.zigTypeTag(mod)) {10681 if (src_bits < src_size * 8) try self.truncateRegister(src_ty, src_reg);
10559 .Float => switch (dst_ty.floatBits(self.target.*)) {
10560 32 => if (self.hasFeature(.avx)) .{ .v_ss, .cvtsi2 } else .{ ._ss, .cvtsi2 },
10561 64 => if (self.hasFeature(.avx)) .{ .v_sd, .cvtsi2 } else .{ ._sd, .cvtsi2 },
10562 16, 80, 128 => null,
10563 else => unreachable,
10564 },
10565 else => null,
10566 }) orelse return self.fail("TODO implement airFloatFromInt from {} to {}", .{
10567 src_ty.fmt(mod), dst_ty.fmt(mod),
10568 });
10569 const dst_alias = dst_reg.to128();
10570 const src_alias = registerAlias(src_reg, src_size);
10571 switch (mir_tag[0]) {
10572 .v_ss, .v_sd => try self.asmRegisterRegisterRegister(mir_tag, dst_alias, dst_alias, src_alias),
10573 else => try self.asmRegisterRegister(mir_tag, dst_alias, src_alias),
10574 }
1057510682
10576 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });10683 const dst_reg = try self.register_manager.allocReg(inst, regClassForType(dst_ty, mod));
10684 const dst_mcv = MCValue{ .register = dst_reg };
10685 const dst_lock = self.register_manager.lockRegAssumeUnused(dst_reg);
10686 defer self.register_manager.unlockReg(dst_lock);
10687
10688 const mir_tag = @as(?Mir.Inst.FixedTag, switch (dst_ty.zigTypeTag(mod)) {
10689 .Float => switch (dst_ty.floatBits(self.target.*)) {
10690 32 => if (self.hasFeature(.avx)) .{ .v_ss, .cvtsi2 } else .{ ._ss, .cvtsi2 },
10691 64 => if (self.hasFeature(.avx)) .{ .v_sd, .cvtsi2 } else .{ ._sd, .cvtsi2 },
10692 16, 80, 128 => null,
10693 else => unreachable,
10694 },
10695 else => null,
10696 }) orelse return self.fail("TODO implement airFloatFromInt from {} to {}", .{
10697 src_ty.fmt(mod), dst_ty.fmt(mod),
10698 });
10699 const dst_alias = dst_reg.to128();
10700 const src_alias = registerAlias(src_reg, src_size);
10701 switch (mir_tag[0]) {
10702 .v_ss, .v_sd => try self.asmRegisterRegisterRegister(mir_tag, dst_alias, dst_alias, src_alias),
10703 else => try self.asmRegisterRegister(mir_tag, dst_alias, src_alias),
10704 }
10705
10706 break :result dst_mcv;
10707 };
10708 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
10577}10709}
1057810710
10579fn airIntFromFloat(self: *Self, inst: Air.Inst.Index) !void {10711fn airIntFromFloat(self: *Self, inst: Air.Inst.Index) !void {
10580 const mod = self.bin_file.options.module.?;10712 const mod = self.bin_file.options.module.?;
10581 const ty_op = self.air.instructions.items(.data)[inst].ty_op;10713 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1058210714
10583 const src_ty = self.typeOf(ty_op.operand);
10584 const dst_ty = self.typeOfIndex(inst);10715 const dst_ty = self.typeOfIndex(inst);
10585 const dst_bits: u32 = @intCast(dst_ty.bitSize(mod));10716 const dst_bits: u32 = @intCast(dst_ty.bitSize(mod));
10586 const dst_signedness =10717 const dst_signedness =
10587 if (dst_ty.isAbiInt(mod)) dst_ty.intInfo(mod).signedness else .unsigned;10718 if (dst_ty.isAbiInt(mod)) dst_ty.intInfo(mod).signedness else .unsigned;
10588
10589 const dst_size = math.divCeil(u32, @max(switch (dst_signedness) {10719 const dst_size = math.divCeil(u32, @max(switch (dst_signedness) {
10590 .signed => dst_bits,10720 .signed => dst_bits,
10591 .unsigned => dst_bits + 1,10721 .unsigned => dst_bits + 1,
10592 }, 32), 8) catch unreachable;10722 }, 32), 8) catch unreachable;
10593 if (dst_size > 8) return self.fail("TODO implement airIntFromFloat from {} to {}", .{
10594 src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?),
10595 });
1059610723
10597 const src_mcv = try self.resolveInst(ty_op.operand);10724 const src_ty = self.typeOf(ty_op.operand);
10598 const src_reg = if (src_mcv.isRegister())10725 const src_bits = src_ty.floatBits(self.target.*);
10599 src_mcv.getReg().?
10600 else
10601 try self.copyToTmpRegister(src_ty, src_mcv);
10602 const src_lock = self.register_manager.lockRegAssumeUnused(src_reg);
10603 defer self.register_manager.unlockReg(src_lock);
1060410726
10605 const dst_reg = try self.register_manager.allocReg(inst, regClassForType(dst_ty, mod));10727 const result = result: {
10606 const dst_mcv = MCValue{ .register = dst_reg };10728 if (switch (src_bits) {
10607 const dst_lock = self.register_manager.lockRegAssumeUnused(dst_reg);10729 16, 80, 128 => true,
10608 defer self.register_manager.unlockReg(dst_lock);10730 32, 64 => dst_size > 8 and dst_size < 16,
10731 else => unreachable,
10732 }) {
10733 var callee: ["__fixuns?f?i".len]u8 = undefined;
10734 break :result try self.genCall(.{ .lib = .{
10735 .return_type = dst_ty.toIntern(),
10736 .param_types = &.{src_ty.toIntern()},
10737 .callee = std.fmt.bufPrint(&callee, "__fix{s}{c}f{c}i", .{
10738 switch (dst_signedness) {
10739 .signed => "",
10740 .unsigned => "uns",
10741 },
10742 floatCompilerRtAbiName(src_bits),
10743 intCompilerRtAbiName(dst_bits),
10744 }) catch unreachable,
10745 } }, &.{ty_op.operand});
10746 }
1060910747
10610 try self.asmRegisterRegister(10748 if (dst_size > 8) return self.fail("TODO implement airIntFromFloat from {} to {}", .{
10611 @as(?Mir.Inst.FixedTag, switch (src_ty.zigTypeTag(mod)) {10749 src_ty.fmt(mod), dst_ty.fmt(mod),
10612 .Float => switch (src_ty.floatBits(self.target.*)) {10750 });
10751
10752 const src_mcv = try self.resolveInst(ty_op.operand);
10753 const src_reg = if (src_mcv.isRegister())
10754 src_mcv.getReg().?
10755 else
10756 try self.copyToTmpRegister(src_ty, src_mcv);
10757 const src_lock = self.register_manager.lockRegAssumeUnused(src_reg);
10758 defer self.register_manager.unlockReg(src_lock);
10759
10760 const dst_reg = try self.register_manager.allocReg(inst, regClassForType(dst_ty, mod));
10761 const dst_mcv = MCValue{ .register = dst_reg };
10762 const dst_lock = self.register_manager.lockRegAssumeUnused(dst_reg);
10763 defer self.register_manager.unlockReg(dst_lock);
10764
10765 try self.asmRegisterRegister(
10766 switch (src_bits) {
10613 32 => if (self.hasFeature(.avx)) .{ .v_, .cvttss2si } else .{ ._, .cvttss2si },10767 32 => if (self.hasFeature(.avx)) .{ .v_, .cvttss2si } else .{ ._, .cvttss2si },
10614 64 => if (self.hasFeature(.avx)) .{ .v_, .cvttsd2si } else .{ ._, .cvttsd2si },10768 64 => if (self.hasFeature(.avx)) .{ .v_, .cvttsd2si } else .{ ._, .cvttsd2si },
10615 16, 80, 128 => null,
10616 else => unreachable,10769 else => unreachable,
10617 },10770 },
10618 else => null,10771 registerAlias(dst_reg, dst_size),
10619 }) orelse return self.fail("TODO implement airIntFromFloat from {} to {}", .{10772 src_reg.to128(),
10620 src_ty.fmt(self.bin_file.options.module.?), dst_ty.fmt(self.bin_file.options.module.?),10773 );
10621 }),
10622 registerAlias(dst_reg, dst_size),
10623 src_reg.to128(),
10624 );
1062510774
10626 if (dst_bits < dst_size * 8) try self.truncateRegister(dst_ty, dst_reg);10775 if (dst_bits < dst_size * 8) try self.truncateRegister(dst_ty, dst_reg);
1062710776
10628 return self.finishAir(inst, dst_mcv, .{ ty_op.operand, .none, .none });10777 break :result dst_mcv;
10778 };
10779 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
10629}10780}
1063010781
10631fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void {10782fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void {
...@@ -12276,3 +12427,30 @@ fn typeOfIndex(self: *Self, inst: Air.Inst.Index) Type {...@@ -12276,3 +12427,30 @@ fn typeOfIndex(self: *Self, inst: Air.Inst.Index) Type {
12276 const mod = self.bin_file.options.module.?;12427 const mod = self.bin_file.options.module.?;
12277 return self.air.typeOfIndex(inst, &mod.intern_pool);12428 return self.air.typeOfIndex(inst, &mod.intern_pool);
12278}12429}
12430
12431fn intCompilerRtAbiName(int_bits: u32) u8 {
12432 return switch (int_bits) {
12433 1...32 => 's',
12434 33...64 => 'd',
12435 65...128 => 't',
12436 else => unreachable,
12437 };
12438}
12439
12440fn floatCompilerRtAbiName(float_bits: u32) u8 {
12441 return switch (float_bits) {
12442 16 => 'h',
12443 32 => 's',
12444 64 => 'd',
12445 80 => 'x',
12446 128 => 't',
12447 else => unreachable,
12448 };
12449}
12450
12451fn floatCompilerRtAbiType(self: *Self, ty: Type, other_ty: Type) Type {
12452 if (ty.toIntern() == .f16_type and
12453 (other_ty.toIntern() == .f32_type or other_ty.toIntern() == .f64_type) and
12454 self.target.isDarwin()) return Type.u16;
12455 return ty;
12456}
test/behavior/asm.zig-2
...@@ -85,7 +85,6 @@ test "alternative constraints" {...@@ -85,7 +85,6 @@ test "alternative constraints" {
8585
86test "sized integer/float in asm input" {86test "sized integer/float in asm input" {
87 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO87 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
89 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO88 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
90 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO89 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
91 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO90 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -137,7 +136,6 @@ test "sized integer/float in asm input" {...@@ -137,7 +136,6 @@ test "sized integer/float in asm input" {
137136
138test "struct/array/union types as input values" {137test "struct/array/union types as input values" {
139 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO138 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
140 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
141 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO139 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
142 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO140 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
143 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO141 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/bitcast.zig-2
...@@ -470,7 +470,6 @@ test "@bitCast of packed struct of bools all true" {...@@ -470,7 +470,6 @@ test "@bitCast of packed struct of bools all true" {
470 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO470 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
471 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO471 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
472 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO472 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
473 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
474 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO473 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
475 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO474 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
476475
...@@ -492,7 +491,6 @@ test "@bitCast of packed struct of bools all false" {...@@ -492,7 +491,6 @@ test "@bitCast of packed struct of bools all false" {
492 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO491 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
493 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO492 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
494 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO493 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
495 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
496 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO494 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
497 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO495 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
498496
test/behavior/bugs/12680.zig+2-1
...@@ -9,9 +9,10 @@ test "export a function twice" {...@@ -9,9 +9,10 @@ test "export a function twice" {
9 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;9 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
10 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;10 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
11 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;11 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
12 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO12 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;13 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
15
15 if (builtin.os.tag == .macos and builtin.zig_backend == .stage2_c) {16 if (builtin.os.tag == .macos and builtin.zig_backend == .stage2_c) {
16 // TODO: test.c: error: aliases are not supported on darwin17 // TODO: test.c: error: aliases are not supported on darwin
17 return error.SkipZigTest;18 return error.SkipZigTest;
test/behavior/bugs/529.zig+1-1
...@@ -11,11 +11,11 @@ comptime {...@@ -11,11 +11,11 @@ comptime {
11const builtin = @import("builtin");11const builtin = @import("builtin");
1212
13test "issue 529 fixed" {13test "issue 529 fixed" {
14 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
15 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO14 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
16 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO15 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO16 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;17 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
18 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
1919
20 @import("529_other_file.zig").issue529(null);20 @import("529_other_file.zig").issue529(null);
21 issue529(null);21 issue529(null);
test/behavior/cast.zig-23
...@@ -1611,7 +1611,6 @@ test "coercion from single-item pointer to @as to slice" {...@@ -1611,7 +1611,6 @@ test "coercion from single-item pointer to @as to slice" {
1611test "peer type resolution: const sentinel slice and mutable non-sentinel slice" {1611test "peer type resolution: const sentinel slice and mutable non-sentinel slice" {
1612 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1612 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1613 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1613 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1614 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1615 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1614 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1616 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1615 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1617 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1616 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1664,7 +1663,6 @@ test "peer type resolution: float and comptime-known fixed-width integer" {...@@ -1664,7 +1663,6 @@ test "peer type resolution: float and comptime-known fixed-width integer" {
1664test "peer type resolution: same array type with sentinel" {1663test "peer type resolution: same array type with sentinel" {
1665 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1664 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1666 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1665 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1667 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1668 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1666 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1669 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1667 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1670 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1668 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1687,7 +1685,6 @@ test "peer type resolution: same array type with sentinel" {...@@ -1687,7 +1685,6 @@ test "peer type resolution: same array type with sentinel" {
1687test "peer type resolution: array with sentinel and array without sentinel" {1685test "peer type resolution: array with sentinel and array without sentinel" {
1688 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1686 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1689 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1687 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1690 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1691 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1688 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1692 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1689 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1693 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1690 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1710,7 +1707,6 @@ test "peer type resolution: array with sentinel and array without sentinel" {...@@ -1710,7 +1707,6 @@ test "peer type resolution: array with sentinel and array without sentinel" {
1710test "peer type resolution: array and vector with same child type" {1707test "peer type resolution: array and vector with same child type" {
1711 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1708 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1712 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1709 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1713 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1714 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1710 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1715 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1711 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1716 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1712 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1756,7 +1752,6 @@ test "peer type resolution: array with smaller child type and vector with larger...@@ -1756,7 +1752,6 @@ test "peer type resolution: array with smaller child type and vector with larger
1756test "peer type resolution: error union and optional of same type" {1752test "peer type resolution: error union and optional of same type" {
1757 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1753 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1758 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1754 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1759 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1760 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1755 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1761 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1756 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1762 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1757 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1780,7 +1775,6 @@ test "peer type resolution: error union and optional of same type" {...@@ -1780,7 +1775,6 @@ test "peer type resolution: error union and optional of same type" {
1780test "peer type resolution: C pointer and @TypeOf(null)" {1775test "peer type resolution: C pointer and @TypeOf(null)" {
1781 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1776 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1782 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1777 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1783 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1784 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1778 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1785 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1779 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1786 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1780 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1803,7 +1797,6 @@ test "peer type resolution: C pointer and @TypeOf(null)" {...@@ -1803,7 +1797,6 @@ test "peer type resolution: C pointer and @TypeOf(null)" {
1803test "peer type resolution: three-way resolution combines error set and optional" {1797test "peer type resolution: three-way resolution combines error set and optional" {
1804 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1798 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1805 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1799 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1806 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1807 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1800 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1808 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1801 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1809 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1802 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1846,7 +1839,6 @@ test "peer type resolution: three-way resolution combines error set and optional...@@ -1846,7 +1839,6 @@ test "peer type resolution: three-way resolution combines error set and optional
1846test "peer type resolution: vector and optional vector" {1839test "peer type resolution: vector and optional vector" {
1847 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1840 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1848 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1841 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1849 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1850 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1842 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1851 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1843 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1852 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1844 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1869,7 +1861,6 @@ test "peer type resolution: vector and optional vector" {...@@ -1869,7 +1861,6 @@ test "peer type resolution: vector and optional vector" {
1869test "peer type resolution: optional fixed-width int and comptime_int" {1861test "peer type resolution: optional fixed-width int and comptime_int" {
1870 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1862 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1871 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1863 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1872 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1873 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1864 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1874 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1865 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1875 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1866 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1892,7 +1883,6 @@ test "peer type resolution: optional fixed-width int and comptime_int" {...@@ -1892,7 +1883,6 @@ test "peer type resolution: optional fixed-width int and comptime_int" {
1892test "peer type resolution: array and tuple" {1883test "peer type resolution: array and tuple" {
1893 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1884 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1894 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1885 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1895 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1896 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1886 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1897 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1887 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1898 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1888 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1916,7 +1906,6 @@ test "peer type resolution: array and tuple" {...@@ -1916,7 +1906,6 @@ test "peer type resolution: array and tuple" {
1916test "peer type resolution: vector and tuple" {1906test "peer type resolution: vector and tuple" {
1917 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1907 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1918 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1908 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1919 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1920 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1909 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1921 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1910 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1922 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1911 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1940,7 +1929,6 @@ test "peer type resolution: vector and tuple" {...@@ -1940,7 +1929,6 @@ test "peer type resolution: vector and tuple" {
1940test "peer type resolution: vector and array and tuple" {1929test "peer type resolution: vector and array and tuple" {
1941 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1930 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1942 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1931 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1943 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1944 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1932 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1945 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1933 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1946 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1934 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -1983,7 +1971,6 @@ test "peer type resolution: vector and array and tuple" {...@@ -1983,7 +1971,6 @@ test "peer type resolution: vector and array and tuple" {
1983test "peer type resolution: empty tuple pointer and slice" {1971test "peer type resolution: empty tuple pointer and slice" {
1984 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1972 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1985 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1973 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1986 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1987 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1974 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1988 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1975 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1989 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1976 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2005,7 +1992,6 @@ test "peer type resolution: empty tuple pointer and slice" {...@@ -2005,7 +1992,6 @@ test "peer type resolution: empty tuple pointer and slice" {
2005test "peer type resolution: tuple pointer and slice" {1992test "peer type resolution: tuple pointer and slice" {
2006 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1993 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2007 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1994 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2008 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2009 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1995 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2010 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1996 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2011 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1997 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2027,7 +2013,6 @@ test "peer type resolution: tuple pointer and slice" {...@@ -2027,7 +2013,6 @@ test "peer type resolution: tuple pointer and slice" {
2027test "peer type resolution: tuple pointer and optional slice" {2013test "peer type resolution: tuple pointer and optional slice" {
2028 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2014 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2029 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2015 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2030 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2031 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2016 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2032 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2017 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2033 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2018 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2049,7 +2034,6 @@ test "peer type resolution: tuple pointer and optional slice" {...@@ -2049,7 +2034,6 @@ test "peer type resolution: tuple pointer and optional slice" {
2049test "peer type resolution: many compatible pointers" {2034test "peer type resolution: many compatible pointers" {
2050 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2035 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2051 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2036 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2052 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2053 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2037 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2054 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2038 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2055 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2039 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2116,7 +2100,6 @@ test "peer type resolution: many compatible pointers" {...@@ -2116,7 +2100,6 @@ test "peer type resolution: many compatible pointers" {
2116test "peer type resolution: tuples with comptime fields" {2100test "peer type resolution: tuples with comptime fields" {
2117 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2101 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2118 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2102 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2119 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2120 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2103 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2121 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2104 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2122 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2105 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2149,7 +2132,6 @@ test "peer type resolution: tuples with comptime fields" {...@@ -2149,7 +2132,6 @@ test "peer type resolution: tuples with comptime fields" {
2149test "peer type resolution: C pointer and many pointer" {2132test "peer type resolution: C pointer and many pointer" {
2150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2133 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2151 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2134 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2152 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2153 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2135 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2154 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2136 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2155 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2137 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2173,7 +2155,6 @@ test "peer type resolution: C pointer and many pointer" {...@@ -2173,7 +2155,6 @@ test "peer type resolution: C pointer and many pointer" {
2173test "peer type resolution: pointer attributes are combined correctly" {2155test "peer type resolution: pointer attributes are combined correctly" {
2174 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2156 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2175 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2157 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2176 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2177 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2158 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2178 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2159 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2179 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2160 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2218,7 +2199,6 @@ test "peer type resolution: pointer attributes are combined correctly" {...@@ -2218,7 +2199,6 @@ test "peer type resolution: pointer attributes are combined correctly" {
2218test "cast builtins can wrap result in optional" {2199test "cast builtins can wrap result in optional" {
2219 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2200 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2220 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2201 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2221 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2222 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2202 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2223 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2203 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2224 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2204 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2258,7 +2238,6 @@ test "cast builtins can wrap result in optional" {...@@ -2258,7 +2238,6 @@ test "cast builtins can wrap result in optional" {
2258test "cast builtins can wrap result in error union" {2238test "cast builtins can wrap result in error union" {
2259 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2239 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2260 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2240 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2261 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2262 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2241 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2263 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2242 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
22642243
...@@ -2298,7 +2277,6 @@ test "cast builtins can wrap result in error union" {...@@ -2298,7 +2277,6 @@ test "cast builtins can wrap result in error union" {
2298test "cast builtins can wrap result in error union and optional" {2277test "cast builtins can wrap result in error union and optional" {
2299 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2278 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2300 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2279 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2301 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2302 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2280 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2303 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2304 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO2282 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2496,7 +2474,6 @@ test "@as does not corrupt values with incompatible representations" {...@@ -2496,7 +2474,6 @@ test "@as does not corrupt values with incompatible representations" {
24962474
2497test "result information is preserved through many nested structures" {2475test "result information is preserved through many nested structures" {
2498 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2476 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2499 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2500 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2477 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2501 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2478 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2502 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2479 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/defer.zig-1
...@@ -133,7 +133,6 @@ test "errdefer with payload" {...@@ -133,7 +133,6 @@ test "errdefer with payload" {
133}133}
134134
135test "reference to errdefer payload" {135test "reference to errdefer payload" {
136 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
137 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO136 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
138 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO137 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
139 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO138 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
test/behavior/floatop.zig+1-2
...@@ -23,7 +23,6 @@ test "cmp f16" {...@@ -23,7 +23,6 @@ test "cmp f16" {
23 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO23 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
24 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;24 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
25 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;25 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
26 if (no_x86_64_hardware_f16_support) return error.SkipZigTest;
2726
28 try testCmp(f16);27 try testCmp(f16);
29 try comptime testCmp(f16);28 try comptime testCmp(f16);
...@@ -115,7 +114,7 @@ test "different sized float comparisons" {...@@ -115,7 +114,7 @@ test "different sized float comparisons" {
115 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO114 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
116 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO115 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
117 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;116 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
118 if (no_x86_64_hardware_f16_support) return error.SkipZigTest;117 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
119118
120 try testDifferentSizedFloatComparisons();119 try testDifferentSizedFloatComparisons();
121 try comptime testDifferentSizedFloatComparisons();120 try comptime testDifferentSizedFloatComparisons();
test/behavior/struct.zig-2
...@@ -1651,7 +1651,6 @@ test "instantiate struct with comptime field" {...@@ -1651,7 +1651,6 @@ test "instantiate struct with comptime field" {
1651test "struct field pointer has correct alignment" {1651test "struct field pointer has correct alignment" {
1652 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1652 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1653 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1653 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1654 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1655 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1654 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1656 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1655 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1657 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1656 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -1684,7 +1683,6 @@ test "struct field pointer has correct alignment" {...@@ -1684,7 +1683,6 @@ test "struct field pointer has correct alignment" {
1684test "extern struct field pointer has correct alignment" {1683test "extern struct field pointer has correct alignment" {
1685 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1684 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1686 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1685 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1687 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1688 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1686 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1689 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1687 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1690 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1688 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/union.zig-3
...@@ -1534,7 +1534,6 @@ test "coerce enum literal to union in result loc" {...@@ -1534,7 +1534,6 @@ test "coerce enum literal to union in result loc" {
1534test "defined-layout union field pointer has correct alignment" {1534test "defined-layout union field pointer has correct alignment" {
1535 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1535 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1536 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1536 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1537 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1538 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1537 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1539 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1538 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1540 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1539 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -1572,7 +1571,6 @@ test "defined-layout union field pointer has correct alignment" {...@@ -1572,7 +1571,6 @@ test "defined-layout union field pointer has correct alignment" {
1572test "undefined-layout union field pointer has correct alignment" {1571test "undefined-layout union field pointer has correct alignment" {
1573 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1572 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1574 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1573 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1575 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1576 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1574 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1577 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1575 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1578 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1576 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -1610,7 +1608,6 @@ test "undefined-layout union field pointer has correct alignment" {...@@ -1610,7 +1608,6 @@ test "undefined-layout union field pointer has correct alignment" {
1610test "packed union field pointer has correct alignment" {1608test "packed union field pointer has correct alignment" {
1611 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1609 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1612 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1610 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1613 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1614 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1611 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1615 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1612 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1616 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1613 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO