| author | |
| committer | |
| log | 8470652f10a07f03b24746ffd786f6f5f4aabccc |
| tree | 80568b00172f68b5d112e1f2eccb848c5daf4f6e |
| parent | 6d5cbdb86394d517a3428242a7ab26384843fc0c |
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 than | 83 | /// TODO remove this; do this type selection in the language rather than |
| 84 | /// here in compiler-rt. | 84 | /// here in compiler-rt. |
| 85 | pub fn F16T(comptime other_type: type) type { | 85 | pub 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 f16 | 97 | // 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.*); |
| 2517 | 2517 | ||
| 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_mcv | 2520 | 16 => switch (src_bits) { |
| 2521 | else | 2521 | 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); | ||
| 2526 | 2559 | ||
| 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 | else | 2590 | 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 | } |
| 2576 | 2609 | ||
| 2577 | fn airFpext(self: *Self, inst: Air.Inst.Index) !void { | 2610 | fn 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.*); |
| 2583 | 2616 | ||
| 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_mcv | 2619 | 16 => switch (dst_bits) { |
| 2587 | else | 2620 | 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 | } | ||
| 2592 | 2649 | ||
| 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 | else | 2653 | 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 | else | 2663 | 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 | } |
| 2637 | 2708 | ||
| 2638 | fn airIntCast(self: *Self, inst: Air.Inst.Index) !void { | 2709 | fn 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); |
| 8360 | 8431 | ||
| 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 | } | ||
| 8363 | 8471 | ||
| 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); | ||
| 8370 | 8473 | ||
| 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); |
| 8377 | 8480 | ||
| 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; |
| 8496 | 8605 | ||
| 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 | } |
| 8546 | 8652 | ||
| 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 | } |
| 8559 | 8667 | ||
| 8560 | fn airCmpVector(self: *Self, inst: Air.Inst.Index) !void { | 8668 | fn 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)); |
| 8573 | 8681 | ||
| 8574 | try self.spillEflagsIfOccupied(); | 8682 | try self.spillEflagsIfOccupied(); |
| 8575 | self.eflags_inst = inst; | ||
| 8576 | 8683 | ||
| 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 | } |
| 8592 | 8700 | ||
| 8593 | fn airTry(self: *Self, inst: Air.Inst.Index) !void { | 8701 | fn 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 | } |
| 8778 | 8886 | ||
| 8779 | try self.spillEflagsIfOccupied(); | 8887 | try self.spillEflagsIfOccupied(); |
| 8780 | self.eflags_inst = inst; | ||
| 8781 | 8888 | ||
| 8782 | const pl_ty = opt_ty.optionalChild(mod); | 8889 | const pl_ty = opt_ty.optionalChild(mod); |
| 8783 | 8890 | ||
| ... | @@ -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 | else | 8893 | else |
| 8787 | .{ .off = @intCast(pl_ty.abiSize(mod)), .ty = Type.bool }; | 8894 | .{ .off = @intCast(pl_ty.abiSize(mod)), .ty = Type.bool }; |
| 8788 | 8895 | ||
| 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 |
| 8867 | fn isNullPtr(self: *Self, inst: Air.Inst.Index, ptr_ty: Type, ptr_mcv: MCValue) !MCValue { | 8975 | fn 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; | ||
| 8871 | 8978 | ||
| 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 | } |
| 8898 | 9007 | ||
| ... | @@ -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 | } |
| 8906 | 9015 | ||
| 8907 | try self.spillEflagsIfOccupied(); | 9016 | try self.spillEflagsIfOccupied(); |
| 8908 | if (maybe_inst) |inst| { | ||
| 8909 | self.eflags_inst = inst; | ||
| 8910 | } | ||
| 8911 | 9017 | ||
| 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 | } |
| 8947 | 9053 | ||
| 9054 | if (maybe_inst) |inst| self.eflags_inst = inst; | ||
| 8948 | return MCValue{ .eflags = .a }; | 9055 | return MCValue{ .eflags = .a }; |
| 8949 | } | 9056 | } |
| 8950 | 9057 | ||
| ... | @@ -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; |
| 10528 | 10635 | ||
| 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 | }); | ||
| 10542 | 10647 | ||
| 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 | else | 10651 | 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 | } | ||
| 10550 | 10668 | ||
| 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 | }); | ||
| 10552 | 10672 | ||
| 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); | ||
| 10557 | 10680 | ||
| 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 | } | ||
| 10575 | 10682 | ||
| 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 | } |
| 10578 | 10710 | ||
| 10579 | fn airIntFromFloat(self: *Self, inst: Air.Inst.Index) !void { | 10711 | fn 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; |
| 10582 | 10714 | ||
| 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 | }); | ||
| 10596 | 10723 | ||
| 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); | ||
| 10604 | 10726 | ||
| 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 | } | ||
| 10609 | 10747 | ||
| 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 | ); | ||
| 10625 | 10774 | ||
| 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); |
| 10627 | 10776 | ||
| 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 | } |
| 10630 | 10781 | ||
| 10631 | fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void { | 10782 | fn 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 | |||
| 12431 | fn 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 | |||
| 12440 | fn 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 | |||
| 12451 | fn 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" { |
| 85 | 85 | ||
| 86 | test "sized integer/float in asm input" { | 86 | test "sized integer/float in asm input" { |
| 87 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 87 | 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; // TODO | 88 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 90 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 89 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 91 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 90 | 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" { |
| 137 | 136 | ||
| 138 | test "struct/array/union types as input values" { | 137 | test "struct/array/union types as input values" { |
| 139 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 138 | 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; // TODO | 139 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 142 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 140 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 143 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 141 | 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; // TODO | 470 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 471 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 471 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 472 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 472 | 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; // TODO | 473 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 475 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 474 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| 476 | 475 | ||
| ... | @@ -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; // TODO | 491 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 493 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 492 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 494 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 493 | 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; // TODO | 494 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 497 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 495 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO |
| 498 | 496 |
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; // TODO | 12 | 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 darwin | 17 | // 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 { |
| 11 | const builtin = @import("builtin"); | 11 | const builtin = @import("builtin"); |
| 12 | 12 | ||
| 13 | test "issue 529 fixed" { | 13 | test "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; // TODO | 14 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 16 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 15 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 17 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 16 | 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; | ||
| 19 | 19 | ||
| 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" { |
| 1611 | test "peer type resolution: const sentinel slice and mutable non-sentinel slice" { | 1611 | test "peer type resolution: const sentinel slice and mutable non-sentinel slice" { |
| 1612 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1612 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1613 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1613 | 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; // TODO | 1614 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1616 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1615 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1617 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1616 | 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" { |
| 1664 | test "peer type resolution: same array type with sentinel" { | 1663 | test "peer type resolution: same array type with sentinel" { |
| 1665 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1664 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1666 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1665 | 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; // TODO | 1666 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1669 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1667 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1670 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1668 | 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" { |
| 1687 | test "peer type resolution: array with sentinel and array without sentinel" { | 1685 | test "peer type resolution: array with sentinel and array without sentinel" { |
| 1688 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1686 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1689 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1687 | 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; // TODO | 1688 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1692 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1689 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1693 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1690 | 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" { |
| 1710 | test "peer type resolution: array and vector with same child type" { | 1707 | test "peer type resolution: array and vector with same child type" { |
| 1711 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1708 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1712 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1709 | 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; // TODO | 1710 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1715 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1711 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1716 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1712 | 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 |
| 1756 | test "peer type resolution: error union and optional of same type" { | 1752 | test "peer type resolution: error union and optional of same type" { |
| 1757 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1753 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1758 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1754 | 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; // TODO | 1755 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1761 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1756 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1762 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1757 | 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" { |
| 1780 | test "peer type resolution: C pointer and @TypeOf(null)" { | 1775 | test "peer type resolution: C pointer and @TypeOf(null)" { |
| 1781 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1776 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1782 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1777 | 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; // TODO | 1778 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1785 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1779 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1786 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1780 | 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)" { |
| 1803 | test "peer type resolution: three-way resolution combines error set and optional" { | 1797 | test "peer type resolution: three-way resolution combines error set and optional" { |
| 1804 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1798 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1805 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1799 | 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; // TODO | 1800 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1808 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1801 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1809 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1802 | 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 |
| 1846 | test "peer type resolution: vector and optional vector" { | 1839 | test "peer type resolution: vector and optional vector" { |
| 1847 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1840 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1848 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1841 | 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; // TODO | 1842 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1851 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1843 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1852 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1844 | 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" { |
| 1869 | test "peer type resolution: optional fixed-width int and comptime_int" { | 1861 | test "peer type resolution: optional fixed-width int and comptime_int" { |
| 1870 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1862 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1871 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1863 | 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; // TODO | 1864 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1874 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1865 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1875 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1866 | 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" { |
| 1892 | test "peer type resolution: array and tuple" { | 1883 | test "peer type resolution: array and tuple" { |
| 1893 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1884 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1894 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1885 | 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; // TODO | 1886 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1897 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1887 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1898 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1888 | 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" { |
| 1916 | test "peer type resolution: vector and tuple" { | 1906 | test "peer type resolution: vector and tuple" { |
| 1917 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1907 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1918 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1908 | 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; // TODO | 1909 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1921 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1910 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1922 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1911 | 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" { |
| 1940 | test "peer type resolution: vector and array and tuple" { | 1929 | test "peer type resolution: vector and array and tuple" { |
| 1941 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1930 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1942 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1931 | 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; // TODO | 1932 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1945 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1933 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1946 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1934 | 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" { |
| 1983 | test "peer type resolution: empty tuple pointer and slice" { | 1971 | test "peer type resolution: empty tuple pointer and slice" { |
| 1984 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1972 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1985 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1973 | 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; // TODO | 1974 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1988 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1975 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1989 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1976 | 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" { |
| 2005 | test "peer type resolution: tuple pointer and slice" { | 1992 | test "peer type resolution: tuple pointer and slice" { |
| 2006 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1993 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2007 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1994 | 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; // TODO | 1995 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2010 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1996 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2011 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 1997 | 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" { |
| 2027 | test "peer type resolution: tuple pointer and optional slice" { | 2013 | test "peer type resolution: tuple pointer and optional slice" { |
| 2028 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2014 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2029 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2015 | 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; // TODO | 2016 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2032 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2017 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2033 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2018 | 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" { |
| 2049 | test "peer type resolution: many compatible pointers" { | 2034 | test "peer type resolution: many compatible pointers" { |
| 2050 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2035 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2051 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2036 | 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; // TODO | 2037 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2054 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2038 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2055 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2039 | 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" { |
| 2116 | test "peer type resolution: tuples with comptime fields" { | 2100 | test "peer type resolution: tuples with comptime fields" { |
| 2117 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2101 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2118 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2102 | 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; // TODO | 2103 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2121 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2104 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2122 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2105 | 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" { |
| 2149 | test "peer type resolution: C pointer and many pointer" { | 2132 | test "peer type resolution: C pointer and many pointer" { |
| 2150 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2133 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2151 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2134 | 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; // TODO | 2135 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2154 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2136 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2155 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2137 | 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" { |
| 2173 | test "peer type resolution: pointer attributes are combined correctly" { | 2155 | test "peer type resolution: pointer attributes are combined correctly" { |
| 2174 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2156 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2175 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2157 | 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; // TODO | 2158 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2178 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2159 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2179 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2160 | 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" { |
| 2218 | test "cast builtins can wrap result in optional" { | 2199 | test "cast builtins can wrap result in optional" { |
| 2219 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2200 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2220 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2201 | 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; // TODO | 2202 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2223 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2203 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2224 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2204 | 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" { |
| 2258 | test "cast builtins can wrap result in error union" { | 2238 | test "cast builtins can wrap result in error union" { |
| 2259 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2239 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2260 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2240 | 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; // TODO | 2241 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2263 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2242 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2264 | 2243 | ||
| ... | @@ -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" { |
| 2298 | test "cast builtins can wrap result in error union and optional" { | 2277 | test "cast builtins can wrap result in error union and optional" { |
| 2299 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2278 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2300 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2279 | 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; // TODO | 2280 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 2303 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2281 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2304 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO | 2282 | 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" { |
| 2496 | 2474 | ||
| 2497 | test "result information is preserved through many nested structures" { | 2475 | test "result information is preserved through many nested structures" { |
| 2498 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 2476 | 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; // TODO | 2477 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2501 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2478 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2502 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2479 | 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 | } |
| 134 | 134 | ||
| 135 | test "reference to errdefer payload" { | 135 | test "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; // TODO | 136 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 138 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 137 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 139 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 138 | 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; // TODO | 23 | 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; | ||
| 27 | 26 | ||
| 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; // TODO | 114 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 116 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 115 | 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; |
| 119 | 118 | ||
| 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" { |
| 1651 | test "struct field pointer has correct alignment" { | 1651 | test "struct field pointer has correct alignment" { |
| 1652 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1652 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1653 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1653 | 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; // TODO | 1654 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1656 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1655 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1657 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1656 | 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" { |
| 1684 | test "extern struct field pointer has correct alignment" { | 1683 | test "extern struct field pointer has correct alignment" { |
| 1685 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1684 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1686 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1685 | 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; // TODO | 1686 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1689 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1687 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1690 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1688 | 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" { |
| 1534 | test "defined-layout union field pointer has correct alignment" { | 1534 | test "defined-layout union field pointer has correct alignment" { |
| 1535 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1535 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1536 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1536 | 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; // TODO | 1537 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1539 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1538 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1540 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1539 | 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" { |
| 1572 | test "undefined-layout union field pointer has correct alignment" { | 1571 | test "undefined-layout union field pointer has correct alignment" { |
| 1573 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1572 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1574 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1573 | 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; // TODO | 1574 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1577 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1575 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1578 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1576 | 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" { |
| 1610 | test "packed union field pointer has correct alignment" { | 1608 | test "packed union field pointer has correct alignment" { |
| 1611 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1609 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1612 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1610 | 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; // TODO | 1611 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1615 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1612 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1616 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1613 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |