authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2023-04-07 18:22:41+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-04-07 18:22:41+02:00
log4ebf483e0da2f85e00918b7900afaf73e111b727
tree53778a17ce99dbda538ebb7880305a69f8da4322
parent48f98494fda57c5eca7b4ac899046c1dd285e471
parent8ec7723992312790cb9da7ce2f36ecde838c361e
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #14668 from Techatrix/wasm-floatops

wasm: implement float operations with compiler-rt

4 files changed, 198 insertions(+), 105 deletions(-)

src/arch/wasm/CodeGen.zig+195-77
...@@ -20,6 +20,7 @@ const link = @import("../../link.zig");...@@ -20,6 +20,7 @@ const link = @import("../../link.zig");
20const TypedValue = @import("../../TypedValue.zig");20const TypedValue = @import("../../TypedValue.zig");
21const Air = @import("../../Air.zig");21const Air = @import("../../Air.zig");
22const Liveness = @import("../../Liveness.zig");22const Liveness = @import("../../Liveness.zig");
23const target_util = @import("../../target.zig");
23const Mir = @import("Mir.zig");24const Mir = @import("Mir.zig");
24const Emit = @import("Emit.zig");25const Emit = @import("Emit.zig");
25const abi = @import("abi.zig");26const abi = @import("abi.zig");
...@@ -1786,9 +1787,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {...@@ -1786,9 +1787,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
1786 .div_trunc,1787 .div_trunc,
1787 => func.airDiv(inst),1788 => func.airDiv(inst),
1788 .div_floor => func.airDivFloor(inst),1789 .div_floor => func.airDivFloor(inst),
1789 .ceil => func.airCeilFloorTrunc(inst, .ceil),
1790 .floor => func.airCeilFloorTrunc(inst, .floor),
1791 .trunc_float => func.airCeilFloorTrunc(inst, .trunc),
1792 .bit_and => func.airBinOp(inst, .@"and"),1790 .bit_and => func.airBinOp(inst, .@"and"),
1793 .bit_or => func.airBinOp(inst, .@"or"),1791 .bit_or => func.airBinOp(inst, .@"or"),
1794 .bool_and => func.airBinOp(inst, .@"and"),1792 .bool_and => func.airBinOp(inst, .@"and"),
...@@ -1803,6 +1801,22 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {...@@ -1803,6 +1801,22 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
1803 .min => func.airMaxMin(inst, .min),1801 .min => func.airMaxMin(inst, .min),
1804 .mul_add => func.airMulAdd(inst),1802 .mul_add => func.airMulAdd(inst),
18051803
1804 .sqrt => func.airUnaryFloatOp(inst, .sqrt),
1805 .sin => func.airUnaryFloatOp(inst, .sin),
1806 .cos => func.airUnaryFloatOp(inst, .cos),
1807 .tan => func.airUnaryFloatOp(inst, .tan),
1808 .exp => func.airUnaryFloatOp(inst, .exp),
1809 .exp2 => func.airUnaryFloatOp(inst, .exp2),
1810 .log => func.airUnaryFloatOp(inst, .log),
1811 .log2 => func.airUnaryFloatOp(inst, .log2),
1812 .log10 => func.airUnaryFloatOp(inst, .log10),
1813 .fabs => func.airUnaryFloatOp(inst, .fabs),
1814 .floor => func.airUnaryFloatOp(inst, .floor),
1815 .ceil => func.airUnaryFloatOp(inst, .ceil),
1816 .round => func.airUnaryFloatOp(inst, .round),
1817 .trunc_float => func.airUnaryFloatOp(inst, .trunc),
1818 .neg => func.airUnaryFloatOp(inst, .neg),
1819
1806 .add_with_overflow => func.airAddSubWithOverflow(inst, .add),1820 .add_with_overflow => func.airAddSubWithOverflow(inst, .add),
1807 .sub_with_overflow => func.airAddSubWithOverflow(inst, .sub),1821 .sub_with_overflow => func.airAddSubWithOverflow(inst, .sub),
1808 .shl_with_overflow => func.airShlWithOverflow(inst),1822 .shl_with_overflow => func.airShlWithOverflow(inst),
...@@ -1939,19 +1953,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {...@@ -1939,19 +1953,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
1939 .is_err_ptr,1953 .is_err_ptr,
1940 .is_non_err_ptr,1954 .is_non_err_ptr,
19411955
1942 .sqrt,
1943 .sin,
1944 .cos,
1945 .tan,
1946 .exp,
1947 .exp2,
1948 .log,
1949 .log2,
1950 .log10,
1951 .fabs,
1952 .round,
1953 .neg,
1954
1955 .cmpxchg_weak,1956 .cmpxchg_weak,
1956 .cmpxchg_strong,1957 .cmpxchg_strong,
1957 .fence,1958 .fence,
...@@ -2462,7 +2463,7 @@ fn airArg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {...@@ -2462,7 +2463,7 @@ fn airArg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
2462 // When we have an argument that's passed using more than a single parameter,2463 // When we have an argument that's passed using more than a single parameter,
2463 // we combine them into a single stack value2464 // we combine them into a single stack value
2464 if (arg_classes[0] == .direct and arg_classes[1] == .direct) {2465 if (arg_classes[0] == .direct and arg_classes[1] == .direct) {
2465 if (arg_ty.zigTypeTag() != .Int) {2466 if (arg_ty.zigTypeTag() != .Int and arg_ty.zigTypeTag() != .Float) {
2466 return func.fail(2467 return func.fail(
2467 "TODO: Implement C-ABI argument for type '{}'",2468 "TODO: Implement C-ABI argument for type '{}'",
2468 .{arg_ty.fmt(func.bin_file.base.options.module.?)},2469 .{arg_ty.fmt(func.bin_file.base.options.module.?)},
...@@ -2506,6 +2507,12 @@ fn airBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {...@@ -2506,6 +2507,12 @@ fn airBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {
2506/// NOTE: THis leaves the value on top of the stack.2507/// NOTE: THis leaves the value on top of the stack.
2507fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue {2508fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue {
2508 assert(!(lhs != .stack and rhs == .stack));2509 assert(!(lhs != .stack and rhs == .stack));
2510
2511 if (ty.isAnyFloat()) {
2512 const float_op = FloatOp.fromOp(op);
2513 return func.floatOp(float_op, ty, &.{ lhs, rhs });
2514 }
2515
2509 if (isByRef(ty, func.target)) {2516 if (isByRef(ty, func.target)) {
2510 if (ty.zigTypeTag() == .Int) {2517 if (ty.zigTypeTag() == .Int) {
2511 return func.binOpBigInt(lhs, rhs, ty, op);2518 return func.binOpBigInt(lhs, rhs, ty, op);
...@@ -2517,10 +2524,6 @@ fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!...@@ -2517,10 +2524,6 @@ fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!
2517 }2524 }
2518 }2525 }
25192526
2520 if (ty.isAnyFloat() and ty.floatBits(func.target) == 16) {
2521 return func.binOpFloat16(lhs, rhs, op);
2522 }
2523
2524 const opcode: wasm.Opcode = buildOpcode(.{2527 const opcode: wasm.Opcode = buildOpcode(.{
2525 .op = op,2528 .op = op,
2526 .valtype1 = typeToValtype(ty, func.target),2529 .valtype1 = typeToValtype(ty, func.target),
...@@ -2534,17 +2537,6 @@ fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!...@@ -2534,17 +2537,6 @@ fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!
2534 return WValue{ .stack = {} };2537 return WValue{ .stack = {} };
2535}2538}
25362539
2537/// Performs a binary operation for 16-bit floats.
2538/// NOTE: Leaves the result value on the stack
2539fn binOpFloat16(func: *CodeGen, lhs: WValue, rhs: WValue, op: Op) InnerError!WValue {
2540 const opcode: wasm.Opcode = buildOpcode(.{ .op = op, .valtype1 = .f32, .signedness = .unsigned });
2541 _ = try func.fpext(lhs, Type.f16, Type.f32);
2542 _ = try func.fpext(rhs, Type.f16, Type.f32);
2543 try func.addTag(Mir.Inst.Tag.fromOpcode(opcode));
2544
2545 return func.fptrunc(.{ .stack = {} }, Type.f32, Type.f16);
2546}
2547
2548fn binOpBigInt(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue {2540fn binOpBigInt(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue {
2549 if (ty.intInfo(func.target).bits > 128) {2541 if (ty.intInfo(func.target).bits > 128) {
2550 return func.fail("TODO: Implement binary operation for big integer", .{});2542 return func.fail("TODO: Implement binary operation for big integer", .{});
...@@ -2580,6 +2572,155 @@ fn binOpBigInt(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) Inner...@@ -2580,6 +2572,155 @@ fn binOpBigInt(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) Inner
2580 return result;2572 return result;
2581}2573}
25822574
2575const FloatOp = enum {
2576 add,
2577 ceil,
2578 cos,
2579 div,
2580 exp,
2581 exp2,
2582 fabs,
2583 floor,
2584 fma,
2585 fmax,
2586 fmin,
2587 fmod,
2588 log,
2589 log10,
2590 log2,
2591 mul,
2592 neg,
2593 round,
2594 sin,
2595 sqrt,
2596 sub,
2597 tan,
2598 trunc,
2599
2600 pub fn fromOp(op: Op) FloatOp {
2601 return switch (op) {
2602 .add => .add,
2603 .ceil => .ceil,
2604 .div => .div,
2605 .abs => .fabs,
2606 .floor => .floor,
2607 .max => .fmax,
2608 .min => .fmin,
2609 .mul => .mul,
2610 .neg => .neg,
2611 .nearest => .round,
2612 .sqrt => .sqrt,
2613 .sub => .sub,
2614 .trunc => .trunc,
2615 else => unreachable,
2616 };
2617 }
2618
2619 pub fn toOp(float_op: FloatOp) ?Op {
2620 return switch (float_op) {
2621 .add => .add,
2622 .ceil => .ceil,
2623 .div => .div,
2624 .fabs => .abs,
2625 .floor => .floor,
2626 .fmax => .max,
2627 .fmin => .min,
2628 .mul => .mul,
2629 .neg => .neg,
2630 .round => .nearest,
2631 .sqrt => .sqrt,
2632 .sub => .sub,
2633 .trunc => .trunc,
2634
2635 .cos,
2636 .exp,
2637 .exp2,
2638 .fma,
2639 .fmod,
2640 .log,
2641 .log10,
2642 .log2,
2643 .sin,
2644 .tan,
2645 => null,
2646 };
2647 }
2648};
2649
2650fn airUnaryFloatOp(func: *CodeGen, inst: Air.Inst.Index, op: FloatOp) InnerError!void {
2651 const un_op = func.air.instructions.items(.data)[inst].un_op;
2652 if (func.liveness.isUnused(inst)) return func.finishAir(inst, .none, &.{un_op});
2653 const operand = try func.resolveInst(un_op);
2654 const ty = func.air.typeOf(un_op);
2655
2656 const result = try (try func.floatOp(op, ty, &.{operand})).toLocal(func, ty);
2657 func.finishAir(inst, result, &.{un_op});
2658}
2659
2660fn floatOp(func: *CodeGen, float_op: FloatOp, ty: Type, args: []const WValue) InnerError!WValue {
2661 if (ty.zigTypeTag() == .Vector) {
2662 return func.fail("TODO: Implement floatOps for vectors", .{});
2663 }
2664
2665 const float_bits = ty.floatBits(func.target);
2666 if (float_bits == 32 or float_bits == 64) {
2667 if (float_op.toOp()) |op| {
2668 for (args) |operand| {
2669 try func.emitWValue(operand);
2670 }
2671 const opcode = buildOpcode(.{ .op = op, .valtype1 = typeToValtype(ty, func.target) });
2672 try func.addTag(Mir.Inst.Tag.fromOpcode(opcode));
2673 return .stack;
2674 }
2675 } else if (float_bits == 16 and float_op == .neg) {
2676 try func.emitWValue(args[0]);
2677 try func.addImm32(std.math.minInt(i16));
2678 try func.addTag(Mir.Inst.Tag.fromOpcode(.i32_xor));
2679 return .stack;
2680 } else if (float_bits == 128 and float_op == .neg) {
2681 return func.fail("TODO: Implement neg for f128", .{});
2682 }
2683
2684 var fn_name_buf: [64]u8 = undefined;
2685 const fn_name = switch (float_op) {
2686 .add,
2687 .sub,
2688 .div,
2689 .mul,
2690 => std.fmt.bufPrint(&fn_name_buf, "__{s}{s}f3", .{
2691 @tagName(float_op), target_util.compilerRtFloatAbbrev(float_bits),
2692 }) catch unreachable,
2693
2694 .ceil,
2695 .cos,
2696 .exp,
2697 .exp2,
2698 .fabs,
2699 .floor,
2700 .fma,
2701 .fmax,
2702 .fmin,
2703 .fmod,
2704 .log,
2705 .log10,
2706 .log2,
2707 .round,
2708 .sin,
2709 .sqrt,
2710 .tan,
2711 .trunc,
2712 => std.fmt.bufPrint(&fn_name_buf, "{s}{s}{s}", .{
2713 target_util.libcFloatPrefix(float_bits), @tagName(float_op), target_util.libcFloatSuffix(float_bits),
2714 }) catch unreachable,
2715 .neg => unreachable, // handled above
2716 };
2717
2718 // fma requires three operands
2719 var param_types_buffer: [3]Type = .{ ty, ty, ty };
2720 const param_types = param_types_buffer[0..args.len];
2721 return func.callIntrinsic(fn_name, param_types, ty, args);
2722}
2723
2583fn airWrapBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {2724fn airWrapBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {
2584 const bin_op = func.air.instructions.items(.data)[inst].bin_op;2725 const bin_op = func.air.instructions.items(.data)[inst].bin_op;
2585 if (func.liveness.isUnused(inst)) return func.finishAir(inst, .none, &.{ bin_op.lhs, bin_op.rhs });2726 if (func.liveness.isUnused(inst)) return func.finishAir(inst, .none, &.{ bin_op.lhs, bin_op.rhs });
...@@ -3322,6 +3463,8 @@ fn airBitcast(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {...@@ -3322,6 +3463,8 @@ fn airBitcast(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
3322fn bitcast(func: *CodeGen, wanted_ty: Type, given_ty: Type, operand: WValue) InnerError!WValue {3463fn bitcast(func: *CodeGen, wanted_ty: Type, given_ty: Type, operand: WValue) InnerError!WValue {
3323 // if we bitcast a float to or from an integer we must use the 'reinterpret' instruction3464 // if we bitcast a float to or from an integer we must use the 'reinterpret' instruction
3324 if (!(wanted_ty.isAnyFloat() or given_ty.isAnyFloat())) return operand;3465 if (!(wanted_ty.isAnyFloat() or given_ty.isAnyFloat())) return operand;
3466 if (wanted_ty.tag() == .f16 or given_ty.tag() == .f16) return operand;
3467 if (wanted_ty.bitSize(func.target) > 64) return operand;
3325 assert((wanted_ty.isInt() and given_ty.isAnyFloat()) or (wanted_ty.isAnyFloat() and given_ty.isInt()));3468 assert((wanted_ty.isInt() and given_ty.isAnyFloat()) or (wanted_ty.isAnyFloat() and given_ty.isInt()));
33263469
3327 const opcode = buildOpcode(.{3470 const opcode = buildOpcode(.{
...@@ -4855,7 +4998,7 @@ fn fpext(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerError!...@@ -4855,7 +4998,7 @@ fn fpext(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerError!
4855 try func.emitWValue(operand);4998 try func.emitWValue(operand);
4856 try func.addTag(.f64_promote_f32);4999 try func.addTag(.f64_promote_f32);
4857 return WValue{ .stack = {} };5000 return WValue{ .stack = {} };
4858 } else if (given_bits == 16) {5001 } else if (given_bits == 16 and wanted_bits <= 64) {
4859 // call __extendhfsf2(f16) f325002 // call __extendhfsf2(f16) f32
4860 const f32_result = try func.callIntrinsic(5003 const f32_result = try func.callIntrinsic(
4861 "__extendhfsf2",5004 "__extendhfsf2",
...@@ -4863,19 +5006,21 @@ fn fpext(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerError!...@@ -4863,19 +5006,21 @@ fn fpext(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerError!
4863 Type.f32,5006 Type.f32,
4864 &.{operand},5007 &.{operand},
4865 );5008 );
5009 std.debug.assert(f32_result == .stack);
48665010
4867 if (wanted_bits == 32) {
4868 return f32_result;
4869 }
4870 if (wanted_bits == 64) {5011 if (wanted_bits == 64) {
4871 try func.addTag(.f64_promote_f32);5012 try func.addTag(.f64_promote_f32);
4872 return WValue{ .stack = {} };
4873 }5013 }
4874 return func.fail("TODO: Implement 'fpext' for floats with bitsize: {d}", .{wanted_bits});5014 return WValue{ .stack = {} };
4875 } else {
4876 // TODO: Emit a call to compiler-rt to extend the float. e.g. __extendhfsf2
4877 return func.fail("TODO: Implement 'fpext' for floats with bitsize: {d}", .{wanted_bits});
4878 }5015 }
5016
5017 var fn_name_buf: [13]u8 = undefined;
5018 const fn_name = std.fmt.bufPrint(&fn_name_buf, "__extend{s}f{s}f2", .{
5019 target_util.compilerRtFloatAbbrev(given_bits),
5020 target_util.compilerRtFloatAbbrev(wanted_bits),
5021 }) catch unreachable;
5022
5023 return func.callIntrinsic(fn_name, &.{given}, wanted, &.{operand});
4879}5024}
48805025
4881fn airFptrunc(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {5026fn airFptrunc(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
...@@ -4899,7 +5044,7 @@ fn fptrunc(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerErro...@@ -4899,7 +5044,7 @@ fn fptrunc(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerErro
4899 try func.emitWValue(operand);5044 try func.emitWValue(operand);
4900 try func.addTag(.f32_demote_f64);5045 try func.addTag(.f32_demote_f64);
4901 return WValue{ .stack = {} };5046 return WValue{ .stack = {} };
4902 } else if (wanted_bits == 16) {5047 } else if (wanted_bits == 16 and given_bits <= 64) {
4903 const op: WValue = if (given_bits == 64) blk: {5048 const op: WValue = if (given_bits == 64) blk: {
4904 try func.emitWValue(operand);5049 try func.emitWValue(operand);
4905 try func.addTag(.f32_demote_f64);5050 try func.addTag(.f32_demote_f64);
...@@ -4908,10 +5053,15 @@ fn fptrunc(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerErro...@@ -4908,10 +5053,15 @@ fn fptrunc(func: *CodeGen, operand: WValue, given: Type, wanted: Type) InnerErro
49085053
4909 // call __truncsfhf2(f32) f165054 // call __truncsfhf2(f32) f16
4910 return func.callIntrinsic("__truncsfhf2", &.{Type.f32}, Type.f16, &.{op});5055 return func.callIntrinsic("__truncsfhf2", &.{Type.f32}, Type.f16, &.{op});
4911 } else {
4912 // TODO: Emit a call to compiler-rt to trunc the float. e.g. __truncdfhf2
4913 return func.fail("TODO: Implement 'fptrunc' for floats with bitsize: {d}", .{wanted_bits});
4914 }5056 }
5057
5058 var fn_name_buf: [12]u8 = undefined;
5059 const fn_name = std.fmt.bufPrint(&fn_name_buf, "__trunc{s}f{s}f2", .{
5060 target_util.compilerRtFloatAbbrev(given_bits),
5061 target_util.compilerRtFloatAbbrev(wanted_bits),
5062 }) catch unreachable;
5063
5064 return func.callIntrinsic(fn_name, &.{given}, wanted, &.{operand});
4915}5065}
49165066
4917fn airErrUnionPayloadPtrSet(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {5067fn airErrUnionPayloadPtrSet(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
...@@ -5873,38 +6023,6 @@ fn signAbsValue(func: *CodeGen, operand: WValue, ty: Type) InnerError!WValue {...@@ -5873,38 +6023,6 @@ fn signAbsValue(func: *CodeGen, operand: WValue, ty: Type) InnerError!WValue {
5873 return WValue{ .stack = {} };6023 return WValue{ .stack = {} };
5874}6024}
58756025
5876fn airCeilFloorTrunc(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {
5877 const un_op = func.air.instructions.items(.data)[inst].un_op;
5878 if (func.liveness.isUnused(inst)) return func.finishAir(inst, .none, &.{un_op});
5879
5880 const ty = func.air.typeOfIndex(inst);
5881 const float_bits = ty.floatBits(func.target);
5882 const is_f16 = float_bits == 16;
5883
5884 if (ty.zigTypeTag() == .Vector) {
5885 return func.fail("TODO: Implement `@ceil` for vectors", .{});
5886 }
5887 if (float_bits > 64) {
5888 return func.fail("TODO: implement `@ceil`, `@trunc`, `@floor` for floats larger than 64bits", .{});
5889 }
5890
5891 const operand = try func.resolveInst(un_op);
5892 const op_to_lower = if (is_f16) blk: {
5893 break :blk try func.fpext(operand, Type.f16, Type.f32);
5894 } else operand;
5895 try func.emitWValue(op_to_lower);
5896 const opcode = buildOpcode(.{ .op = op, .valtype1 = typeToValtype(ty, func.target) });
5897 try func.addTag(Mir.Inst.Tag.fromOpcode(opcode));
5898
5899 if (is_f16) {
5900 _ = try func.fptrunc(.{ .stack = {} }, Type.f32, Type.f16);
5901 }
5902
5903 const result = try func.allocLocal(ty);
5904 try func.addLabel(.local_set, result.local.value);
5905 func.finishAir(inst, result, &.{un_op});
5906}
5907
5908fn airSatBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {6026fn airSatBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void {
5909 assert(op == .add or op == .sub);6027 assert(op == .add or op == .sub);
5910 const bin_op = func.air.instructions.items(.data)[inst].bin_op;6028 const bin_op = func.air.instructions.items(.data)[inst].bin_op;
test/behavior/floatop.zig+2-26
...@@ -20,7 +20,6 @@ fn epsForType(comptime T: type) T {...@@ -20,7 +20,6 @@ fn epsForType(comptime T: type) T {
20}20}
2121
22test "floating point comparisons" {22test "floating point comparisons" {
23 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
24 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO23 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2524
26 try testFloatComparisons();25 try testFloatComparisons();
...@@ -53,7 +52,6 @@ fn testFloatComparisons() !void {...@@ -53,7 +52,6 @@ fn testFloatComparisons() !void {
53}52}
5453
55test "different sized float comparisons" {54test "different sized float comparisons" {
56 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
57 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO55 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
58 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO56 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
59 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO57 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -89,7 +87,6 @@ fn testDifferentSizedFloatComparisons() !void {...@@ -89,7 +87,6 @@ fn testDifferentSizedFloatComparisons() !void {
89//}87//}
9088
91test "negative f128 floatToInt at compile-time" {89test "negative f128 floatToInt at compile-time" {
92 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
93 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO90 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
94 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO91 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
9592
...@@ -99,7 +96,6 @@ test "negative f128 floatToInt at compile-time" {...@@ -99,7 +96,6 @@ test "negative f128 floatToInt at compile-time" {
99}96}
10097
101test "@sqrt" {98test "@sqrt" {
102 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
103 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO99 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
104 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO100 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
105 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO101 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -157,7 +153,6 @@ fn testSqrtWithVectors() !void {...@@ -157,7 +153,6 @@ fn testSqrtWithVectors() !void {
157}153}
158154
159test "more @sqrt f16 tests" {155test "more @sqrt f16 tests" {
160 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
161 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO156 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
162 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO157 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
163 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO158 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -183,7 +178,6 @@ test "more @sqrt f16 tests" {...@@ -183,7 +178,6 @@ test "more @sqrt f16 tests" {
183}178}
184179
185test "another, possibly redundant @sqrt test" {180test "another, possibly redundant @sqrt test" {
186 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
187 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO181 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
188 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO182 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
189 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO183 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -209,7 +203,6 @@ fn testSqrtLegacy(comptime T: type, x: T) !void {...@@ -209,7 +203,6 @@ fn testSqrtLegacy(comptime T: type, x: T) !void {
209}203}
210204
211test "@sin" {205test "@sin" {
212 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
213 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO206 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
214 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO207 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
215 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO208 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -249,7 +242,6 @@ fn testSinWithVectors() !void {...@@ -249,7 +242,6 @@ fn testSinWithVectors() !void {
249}242}
250243
251test "@cos" {244test "@cos" {
252 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
253 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO245 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
254 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO246 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
255 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO247 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -289,7 +281,6 @@ fn testCosWithVectors() !void {...@@ -289,7 +281,6 @@ fn testCosWithVectors() !void {
289}281}
290282
291test "@exp" {283test "@exp" {
292 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
293 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO284 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
294 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO285 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
295 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO286 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -328,7 +319,7 @@ fn testExpWithVectors() !void {...@@ -328,7 +319,7 @@ fn testExpWithVectors() !void {
328}319}
329320
330test "@exp2" {321test "@exp2" {
331 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO322 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
332 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO323 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
333 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO324 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
334 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO325 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -346,7 +337,7 @@ fn testExp2() !void {...@@ -346,7 +337,7 @@ fn testExp2() !void {
346 }337 }
347}338}
348339
349test "@exp2" {340test "@exp2 with @vectors" {
350 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO341 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
351 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO342 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
352 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO343 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -366,7 +357,6 @@ fn testExp2WithVectors() !void {...@@ -366,7 +357,6 @@ fn testExp2WithVectors() !void {
366}357}
367358
368test "@log" {359test "@log" {
369 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
370 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO360 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
371 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO361 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
372 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO362 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -414,7 +404,6 @@ test "@log with @vectors" {...@@ -414,7 +404,6 @@ test "@log with @vectors" {
414}404}
415405
416test "@log2" {406test "@log2" {
417 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
418 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO407 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
419 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO408 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
420 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO409 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -457,7 +446,6 @@ fn testLog2WithVectors() !void {...@@ -457,7 +446,6 @@ fn testLog2WithVectors() !void {
457}446}
458447
459test "@log10" {448test "@log10" {
460 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
461 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO449 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
462 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO450 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
463 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO451 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -496,7 +484,6 @@ fn testLog10WithVectors() !void {...@@ -496,7 +484,6 @@ fn testLog10WithVectors() !void {
496}484}
497485
498test "@fabs" {486test "@fabs" {
499 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
500 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO487 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
501 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO488 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
502 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO489 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -622,7 +609,6 @@ test "a third @fabs test, surely there should not be three fabs tests" {...@@ -622,7 +609,6 @@ test "a third @fabs test, surely there should not be three fabs tests" {
622}609}
623610
624test "@floor" {611test "@floor" {
625 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
626 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO612 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
627 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO613 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
628 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO614 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -664,7 +650,6 @@ fn testFloorWithVectors() !void {...@@ -664,7 +650,6 @@ fn testFloorWithVectors() !void {
664}650}
665651
666test "another, possibly redundant, @floor test" {652test "another, possibly redundant, @floor test" {
667 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
668 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO653 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
669 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO654 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
670 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO655 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -714,7 +699,6 @@ fn testFloorLegacy(comptime T: type, x: T) !void {...@@ -714,7 +699,6 @@ fn testFloorLegacy(comptime T: type, x: T) !void {
714}699}
715700
716test "@ceil" {701test "@ceil" {
717 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
718 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO702 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
719 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO703 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
720 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO704 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -756,7 +740,6 @@ fn testCeilWithVectors() !void {...@@ -756,7 +740,6 @@ fn testCeilWithVectors() !void {
756}740}
757741
758test "another, possibly redundant, @ceil test" {742test "another, possibly redundant, @ceil test" {
759 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
760 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO743 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
761 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO744 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
762 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO745 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -806,7 +789,6 @@ fn testCeilLegacy(comptime T: type, x: T) !void {...@@ -806,7 +789,6 @@ fn testCeilLegacy(comptime T: type, x: T) !void {
806}789}
807790
808test "@trunc" {791test "@trunc" {
809 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
810 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO792 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
811 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO793 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
812 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO794 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -848,7 +830,6 @@ fn testTruncWithVectors() !void {...@@ -848,7 +830,6 @@ fn testTruncWithVectors() !void {
848}830}
849831
850test "another, possibly redundant, @trunc test" {832test "another, possibly redundant, @trunc test" {
851 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
852 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO833 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
853 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO834 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
854 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO835 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -912,7 +893,6 @@ fn testTruncLegacy(comptime T: type, x: T) !void {...@@ -912,7 +893,6 @@ fn testTruncLegacy(comptime T: type, x: T) !void {
912}893}
913894
914test "negation f16" {895test "negation f16" {
915 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
916 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO896 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
917 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO897 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
918 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO898 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -941,7 +921,6 @@ test "negation f32" {...@@ -941,7 +921,6 @@ test "negation f32" {
941 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO921 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
942 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO922 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
943 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO923 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
944 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
945 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO924 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
946925
947 const S = struct {926 const S = struct {
...@@ -962,7 +941,6 @@ test "negation f64" {...@@ -962,7 +941,6 @@ test "negation f64" {
962 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO941 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
963 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO942 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
964 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO943 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
965 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
966 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO944 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
967945
968 const S = struct {946 const S = struct {
...@@ -1084,7 +1062,6 @@ test "comptime_float zero divided by zero produces zero" {...@@ -1084,7 +1062,6 @@ test "comptime_float zero divided by zero produces zero" {
1084}1062}
10851063
1086test "nan negation f16" {1064test "nan negation f16" {
1087 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1088 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1065 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1089 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1066 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1090 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1067 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -1104,7 +1081,6 @@ test "nan negation f16" {...@@ -1104,7 +1081,6 @@ test "nan negation f16" {
1104}1081}
11051082
1106test "nan negation f32" {1083test "nan negation f32" {
1107 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1108 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1084 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1109 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1085 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1110 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1086 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/muladd.zig-1
...@@ -27,7 +27,6 @@ fn testMulAdd() !void {...@@ -27,7 +27,6 @@ fn testMulAdd() !void {
27}27}
2828
29test "@mulAdd f16" {29test "@mulAdd f16" {
30 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
31 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO30 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO31 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
33 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO32 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/link/wasm/archive/build.zig+1-1
...@@ -27,7 +27,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize...@@ -27,7 +27,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize
2727
28 const check = lib.checkObject();28 const check = lib.checkObject();
29 check.checkStart("Section custom");29 check.checkStart("Section custom");
30 check.checkNext("name __truncsfhf2"); // Ensure it was imported and resolved30 check.checkNext("name __trunch"); // Ensure it was imported and resolved
3131
32 test_step.dependOn(&check.step);32 test_step.dependOn(&check.step);
33}33}