| author | |
| committer | |
| log | 4ebf483e0da2f85e00918b7900afaf73e111b727 |
| tree | 53778a17ce99dbda538ebb7880305a69f8da4322 |
| parent | 48f98494fda57c5eca7b4ac899046c1dd285e471 |
| parent | 8ec7723992312790cb9da7ce2f36ecde838c361e |
| signature |
wasm: implement float operations with compiler-rt4 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"); |
| 20 | const TypedValue = @import("../../TypedValue.zig"); | 20 | const TypedValue = @import("../../TypedValue.zig"); |
| 21 | const Air = @import("../../Air.zig"); | 21 | const Air = @import("../../Air.zig"); |
| 22 | const Liveness = @import("../../Liveness.zig"); | 22 | const Liveness = @import("../../Liveness.zig"); |
| 23 | const target_util = @import("../../target.zig"); | ||
| 23 | const Mir = @import("Mir.zig"); | 24 | const Mir = @import("Mir.zig"); |
| 24 | const Emit = @import("Emit.zig"); | 25 | const Emit = @import("Emit.zig"); |
| 25 | const abi = @import("abi.zig"); | 26 | const 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), |
| 1805 | 1803 | ||
| 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, |
| 1941 | 1955 | ||
| 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 value | 2464 | // 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. |
| 2507 | fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue { | 2508 | fn 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 | } |
| 2519 | 2526 | ||
| 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 | } |
| 2536 | 2539 | ||
| 2537 | /// Performs a binary operation for 16-bit floats. | ||
| 2538 | /// NOTE: Leaves the result value on the stack | ||
| 2539 | fn 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 | |||
| 2548 | fn binOpBigInt(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue { | 2540 | fn 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 | } |
| 2582 | 2574 | ||
| 2575 | const 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 | |||
| 2650 | fn 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 | |||
| 2660 | fn 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 | |||
| 2583 | fn airWrapBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void { | 2724 | fn 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 { |
| 3322 | fn bitcast(func: *CodeGen, wanted_ty: Type, given_ty: Type, operand: WValue) InnerError!WValue { | 3463 | fn 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' instruction | 3464 | // 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())); |
| 3326 | 3469 | ||
| 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) f32 | 5002 | // 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); | ||
| 4866 | 5010 | ||
| 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 | } |
| 4880 | 5025 | ||
| 4881 | fn airFptrunc(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { | 5026 | fn 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 |
| 4908 | 5053 | ||
| 4909 | // call __truncsfhf2(f32) f16 | 5054 | // 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 | } |
| 4916 | 5066 | ||
| 4917 | fn airErrUnionPayloadPtrSet(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { | 5067 | fn 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 | } |
| 5875 | 6025 | ||
| 5876 | fn 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 | |||
| 5908 | fn airSatBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void { | 6026 | fn 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 | } |
| 21 | 21 | ||
| 22 | test "floating point comparisons" { | 22 | test "floating point comparisons" { |
| 23 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 24 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 23 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 25 | 24 | ||
| 26 | try testFloatComparisons(); | 25 | try testFloatComparisons(); |
| ... | @@ -53,7 +52,6 @@ fn testFloatComparisons() !void { | ... | @@ -53,7 +52,6 @@ fn testFloatComparisons() !void { |
| 53 | } | 52 | } |
| 54 | 53 | ||
| 55 | test "different sized float comparisons" { | 54 | test "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; // TODO | 55 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 58 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 56 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 59 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 57 | 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 | //} |
| 90 | 88 | ||
| 91 | test "negative f128 floatToInt at compile-time" { | 89 | test "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; // TODO | 90 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 94 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 91 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 95 | 92 | ||
| ... | @@ -99,7 +96,6 @@ test "negative f128 floatToInt at compile-time" { | ... | @@ -99,7 +96,6 @@ test "negative f128 floatToInt at compile-time" { |
| 99 | } | 96 | } |
| 100 | 97 | ||
| 101 | test "@sqrt" { | 98 | test "@sqrt" { |
| 102 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 103 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 99 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 104 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 100 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 105 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 101 | 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 | } |
| 158 | 154 | ||
| 159 | test "more @sqrt f16 tests" { | 155 | test "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; // TODO | 156 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 162 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 157 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 163 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 158 | 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 | } |
| 184 | 179 | ||
| 185 | test "another, possibly redundant @sqrt test" { | 180 | test "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; // TODO | 181 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 188 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 182 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 189 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 183 | 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 | } |
| 210 | 204 | ||
| 211 | test "@sin" { | 205 | test "@sin" { |
| 212 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 213 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 206 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 214 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 207 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 215 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 208 | 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 | } |
| 250 | 243 | ||
| 251 | test "@cos" { | 244 | test "@cos" { |
| 252 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 253 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 245 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 254 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 246 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 255 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 247 | 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 | } |
| 290 | 282 | ||
| 291 | test "@exp" { | 283 | test "@exp" { |
| 292 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 293 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 284 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 294 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 285 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 295 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 286 | 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 | } |
| 329 | 320 | ||
| 330 | test "@exp2" { | 321 | test "@exp2" { |
| 331 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 322 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 332 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 323 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 333 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 324 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 334 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 325 | 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 | } |
| 348 | 339 | ||
| 349 | test "@exp2" { | 340 | test "@exp2 with @vectors" { |
| 350 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 341 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 351 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 342 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 352 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 343 | 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 | } |
| 367 | 358 | ||
| 368 | test "@log" { | 359 | test "@log" { |
| 369 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 370 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 360 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 371 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 361 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 372 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 362 | 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 | } |
| 415 | 405 | ||
| 416 | test "@log2" { | 406 | test "@log2" { |
| 417 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 418 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 407 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 419 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 408 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 420 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 409 | 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 | } |
| 458 | 447 | ||
| 459 | test "@log10" { | 448 | test "@log10" { |
| 460 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 461 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 449 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 462 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 450 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 463 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 451 | 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 | } |
| 497 | 485 | ||
| 498 | test "@fabs" { | 486 | test "@fabs" { |
| 499 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 500 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 487 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 501 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 488 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 502 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 489 | 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 | } |
| 623 | 610 | ||
| 624 | test "@floor" { | 611 | test "@floor" { |
| 625 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 626 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 612 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 627 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 613 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 628 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 614 | 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 | } |
| 665 | 651 | ||
| 666 | test "another, possibly redundant, @floor test" { | 652 | test "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; // TODO | 653 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 669 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 654 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 670 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 655 | 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 | } |
| 715 | 700 | ||
| 716 | test "@ceil" { | 701 | test "@ceil" { |
| 717 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 718 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 702 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 719 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 703 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 720 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 704 | 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 | } |
| 757 | 741 | ||
| 758 | test "another, possibly redundant, @ceil test" { | 742 | test "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; // TODO | 743 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 761 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 744 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 762 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 745 | 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 | } |
| 807 | 790 | ||
| 808 | test "@trunc" { | 791 | test "@trunc" { |
| 809 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 810 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 792 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 811 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 793 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 812 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 794 | 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 | } |
| 849 | 831 | ||
| 850 | test "another, possibly redundant, @trunc test" { | 832 | test "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; // TODO | 833 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 853 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 834 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 854 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 835 | 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 | } |
| 913 | 894 | ||
| 914 | test "negation f16" { | 895 | test "negation f16" { |
| 915 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 916 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 896 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 917 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 897 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 918 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 898 | 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; // TODO | 921 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 942 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 922 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 943 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 923 | 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; // TODO | 924 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 946 | 925 | ||
| 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; // TODO | 941 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 963 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 942 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 964 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 943 | 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; // TODO | 944 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 967 | 945 | ||
| 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 | } |
| 1085 | 1063 | ||
| 1086 | test "nan negation f16" { | 1064 | test "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; // TODO | 1065 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1089 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1066 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1090 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1067 | 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 | } |
| 1105 | 1082 | ||
| 1106 | test "nan negation f32" { | 1083 | test "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; // TODO | 1084 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1109 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1085 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1110 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1086 | 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 | } |
| 28 | 28 | ||
| 29 | test "@mulAdd f16" { | 29 | test "@mulAdd f16" { |
| 30 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 31 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 30 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 32 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 31 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 33 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 32 | 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 |
| 27 | 27 | ||
| 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 resolved | 30 | check.checkNext("name __trunch"); // Ensure it was imported and resolved |
| 31 | 31 | ||
| 32 | test_step.dependOn(&check.step); | 32 | test_step.dependOn(&check.step); |
| 33 | } | 33 | } |