| author | |
| committer | |
| log | 975cb235cce2f713c39c0c0f7040c8ea0eb536a5 |
| tree | 152166f023e13ee3ac3a90bfb0efe5fbcff175ea |
| parent | acc9471915d74fc2cb475ea3220a249d81e3036e |
| parent | ab970094abe674b3cb33fc98db47c0cdef5f247d |
| signature |
wasm: implement more float operations on f80 and f1288 files changed, 152 insertions(+), 82 deletions(-)
src/arch/wasm/CodeGen.zig+152-45| ... | ... | @@ -992,13 +992,12 @@ fn addExtraAssumeCapacity(func: *CodeGen, extra: anytype) error{OutOfMemory}!u32 |
| 992 | 992 | fn typeToValtype(ty: Type, mod: *Module) wasm.Valtype { |
| 993 | 993 | const target = mod.getTarget(); |
| 994 | 994 | return switch (ty.zigTypeTag(mod)) { |
| 995 | .Float => blk: { | |
| 996 | const bits = ty.floatBits(target); | |
| 997 | if (bits == 16) return wasm.Valtype.i32; // stored/loaded as u16 | |
| 998 | if (bits == 32) break :blk wasm.Valtype.f32; | |
| 999 | if (bits == 64) break :blk wasm.Valtype.f64; | |
| 1000 | if (bits == 128) break :blk wasm.Valtype.i64; | |
| 1001 | return wasm.Valtype.i32; // represented as pointer to stack | |
| 995 | .Float => switch (ty.floatBits(target)) { | |
| 996 | 16 => wasm.Valtype.i32, // stored/loaded as u16 | |
| 997 | 32 => wasm.Valtype.f32, | |
| 998 | 64 => wasm.Valtype.f64, | |
| 999 | 80, 128 => wasm.Valtype.i64, | |
| 1000 | else => unreachable, | |
| 1002 | 1001 | }, |
| 1003 | 1002 | .Int, .Enum => blk: { |
| 1004 | 1003 | const info = ty.intInfo(mod); |
| ... | ... | @@ -2559,7 +2558,7 @@ fn airArg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 2559 | 2558 | const result = try func.allocStack(arg_ty); |
| 2560 | 2559 | try func.store(result, arg, Type.u64, 0); |
| 2561 | 2560 | try func.store(result, func.args[arg_index + 1], Type.u64, 8); |
| 2562 | return func.finishAir(inst, arg, &.{}); | |
| 2561 | return func.finishAir(inst, result, &.{}); | |
| 2563 | 2562 | } |
| 2564 | 2563 | } else { |
| 2565 | 2564 | func.arg_index += 1; |
| ... | ... | @@ -2651,12 +2650,18 @@ fn binOp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError! |
| 2651 | 2650 | |
| 2652 | 2651 | fn binOpBigInt(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: Op) InnerError!WValue { |
| 2653 | 2652 | const mod = func.bin_file.base.options.module.?; |
| 2654 | if (ty.intInfo(mod).bits > 128) { | |
| 2653 | const int_info = ty.intInfo(mod); | |
| 2654 | if (int_info.bits > 128) { | |
| 2655 | 2655 | return func.fail("TODO: Implement binary operation for big integers larger than 128 bits", .{}); |
| 2656 | 2656 | } |
| 2657 | 2657 | |
| 2658 | 2658 | switch (op) { |
| 2659 | 2659 | .mul => return func.callIntrinsic("__multi3", &.{ ty.toIntern(), ty.toIntern() }, ty, &.{ lhs, rhs }), |
| 2660 | .div => switch (int_info.signedness) { | |
| 2661 | .signed => return func.callIntrinsic("__udivti3", &.{ ty.toIntern(), ty.toIntern() }, ty, &.{ lhs, rhs }), | |
| 2662 | .unsigned => return func.callIntrinsic("__divti3", &.{ ty.toIntern(), ty.toIntern() }, ty, &.{ lhs, rhs }), | |
| 2663 | }, | |
| 2664 | .rem => return func.callIntrinsic("__umodti3", &.{ ty.toIntern(), ty.toIntern() }, ty, &.{ lhs, rhs }), | |
| 2660 | 2665 | .shr => return func.callIntrinsic("__lshrti3", &.{ ty.toIntern(), .i32_type }, ty, &.{ lhs, rhs }), |
| 2661 | 2666 | .shl => return func.callIntrinsic("__ashlti3", &.{ ty.toIntern(), .i32_type }, ty, &.{ lhs, rhs }), |
| 2662 | 2667 | .xor => { |
| ... | ... | @@ -2795,6 +2800,11 @@ fn floatOp(func: *CodeGen, float_op: FloatOp, ty: Type, args: []const WValue) In |
| 2795 | 2800 | } |
| 2796 | 2801 | |
| 2797 | 2802 | const float_bits = ty.floatBits(func.target); |
| 2803 | ||
| 2804 | if (float_op == .neg) { | |
| 2805 | return func.floatNeg(ty, args[0]); | |
| 2806 | } | |
| 2807 | ||
| 2798 | 2808 | if (float_bits == 32 or float_bits == 64) { |
| 2799 | 2809 | if (float_op.toOp()) |op| { |
| 2800 | 2810 | for (args) |operand| { |
| ... | ... | @@ -2804,13 +2814,6 @@ fn floatOp(func: *CodeGen, float_op: FloatOp, ty: Type, args: []const WValue) In |
| 2804 | 2814 | try func.addTag(Mir.Inst.Tag.fromOpcode(opcode)); |
| 2805 | 2815 | return .stack; |
| 2806 | 2816 | } |
| 2807 | } else if (float_bits == 16 and float_op == .neg) { | |
| 2808 | try func.emitWValue(args[0]); | |
| 2809 | try func.addImm32(std.math.minInt(i16)); | |
| 2810 | try func.addTag(Mir.Inst.Tag.fromOpcode(.i32_xor)); | |
| 2811 | return .stack; | |
| 2812 | } else if (float_bits == 128 and float_op == .neg) { | |
| 2813 | return func.fail("TODO: Implement neg for f128", .{}); | |
| 2814 | 2817 | } |
| 2815 | 2818 | |
| 2816 | 2819 | var fn_name_buf: [64]u8 = undefined; |
| ... | ... | @@ -2853,6 +2856,49 @@ fn floatOp(func: *CodeGen, float_op: FloatOp, ty: Type, args: []const WValue) In |
| 2853 | 2856 | return func.callIntrinsic(fn_name, param_types, ty, args); |
| 2854 | 2857 | } |
| 2855 | 2858 | |
| 2859 | /// NOTE: The result value remains on top of the stack. | |
| 2860 | fn floatNeg(func: *CodeGen, ty: Type, arg: WValue) InnerError!WValue { | |
| 2861 | const float_bits = ty.floatBits(func.target); | |
| 2862 | switch (float_bits) { | |
| 2863 | 16 => { | |
| 2864 | try func.emitWValue(arg); | |
| 2865 | try func.addImm32(std.math.minInt(i16)); | |
| 2866 | try func.addTag(.i32_xor); | |
| 2867 | return .stack; | |
| 2868 | }, | |
| 2869 | 32, 64 => { | |
| 2870 | try func.emitWValue(arg); | |
| 2871 | const val_type: wasm.Valtype = if (float_bits == 32) .f32 else .f64; | |
| 2872 | const opcode = buildOpcode(.{ .op = .neg, .valtype1 = val_type }); | |
| 2873 | try func.addTag(Mir.Inst.Tag.fromOpcode(opcode)); | |
| 2874 | return .stack; | |
| 2875 | }, | |
| 2876 | 80, 128 => { | |
| 2877 | const result = try func.allocStack(ty); | |
| 2878 | try func.emitWValue(result); | |
| 2879 | try func.emitWValue(arg); | |
| 2880 | try func.addMemArg(.i64_load, .{ .offset = 0 + arg.offset(), .alignment = 2 }); | |
| 2881 | try func.addMemArg(.i64_store, .{ .offset = 0 + result.offset(), .alignment = 2 }); | |
| 2882 | ||
| 2883 | try func.emitWValue(result); | |
| 2884 | try func.emitWValue(arg); | |
| 2885 | try func.addMemArg(.i64_load, .{ .offset = 8 + arg.offset(), .alignment = 2 }); | |
| 2886 | ||
| 2887 | if (float_bits == 80) { | |
| 2888 | try func.addImm64(0x8000); | |
| 2889 | try func.addTag(.i64_xor); | |
| 2890 | try func.addMemArg(.i64_store16, .{ .offset = 8 + result.offset(), .alignment = 2 }); | |
| 2891 | } else { | |
| 2892 | try func.addImm64(0x8000000000000000); | |
| 2893 | try func.addTag(.i64_xor); | |
| 2894 | try func.addMemArg(.i64_store, .{ .offset = 8 + result.offset(), .alignment = 2 }); | |
| 2895 | } | |
| 2896 | return result; | |
| 2897 | }, | |
| 2898 | else => unreachable, | |
| 2899 | } | |
| 2900 | } | |
| 2901 | ||
| 2856 | 2902 | fn airWrapBinOp(func: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void { |
| 2857 | 2903 | const mod = func.bin_file.base.options.module.?; |
| 2858 | 2904 | const bin_op = func.air.instructions.items(.data)[inst].bin_op; |
| ... | ... | @@ -3430,10 +3476,10 @@ fn cmp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: std.math.CompareO |
| 3430 | 3476 | // both lhs and rhs, as well as checking the payload are matching of lhs and rhs |
| 3431 | 3477 | return func.cmpOptionals(lhs, rhs, ty, op); |
| 3432 | 3478 | } |
| 3479 | } else if (ty.isAnyFloat()) { | |
| 3480 | return func.cmpFloat(ty, lhs, rhs, op); | |
| 3433 | 3481 | } else if (isByRef(ty, mod)) { |
| 3434 | 3482 | return func.cmpBigInt(lhs, rhs, ty, op); |
| 3435 | } else if (ty.isAnyFloat() and ty.floatBits(func.target) == 16) { | |
| 3436 | return func.cmpFloat16(lhs, rhs, op); | |
| 3437 | 3483 | } |
| 3438 | 3484 | |
| 3439 | 3485 | // ensure that when we compare pointers, we emit |
| ... | ... | @@ -3465,26 +3511,47 @@ fn cmp(func: *CodeGen, lhs: WValue, rhs: WValue, ty: Type, op: std.math.CompareO |
| 3465 | 3511 | return WValue{ .stack = {} }; |
| 3466 | 3512 | } |
| 3467 | 3513 | |
| 3468 | /// Compares 16-bit floats | |
| 3469 | /// NOTE: The result value remains on top of the stack. | |
| 3470 | fn cmpFloat16(func: *CodeGen, lhs: WValue, rhs: WValue, op: std.math.CompareOperator) InnerError!WValue { | |
| 3471 | const opcode: wasm.Opcode = buildOpcode(.{ | |
| 3472 | .op = switch (op) { | |
| 3473 | .lt => .lt, | |
| 3474 | .lte => .le, | |
| 3475 | .eq => .eq, | |
| 3476 | .neq => .ne, | |
| 3477 | .gte => .ge, | |
| 3478 | .gt => .gt, | |
| 3479 | }, | |
| 3480 | .valtype1 = .f32, | |
| 3481 | .signedness = .unsigned, | |
| 3482 | }); | |
| 3483 | _ = try func.fpext(lhs, Type.f16, Type.f32); | |
| 3484 | _ = try func.fpext(rhs, Type.f16, Type.f32); | |
| 3485 | try func.addTag(Mir.Inst.Tag.fromOpcode(opcode)); | |
| 3514 | /// Compares two floats. | |
| 3515 | /// NOTE: Leaves the result of the comparison on top of the stack. | |
| 3516 | fn cmpFloat(func: *CodeGen, ty: Type, lhs: WValue, rhs: WValue, cmp_op: std.math.CompareOperator) InnerError!WValue { | |
| 3517 | const float_bits = ty.floatBits(func.target); | |
| 3486 | 3518 | |
| 3487 | return WValue{ .stack = {} }; | |
| 3519 | const op: Op = switch (cmp_op) { | |
| 3520 | .lt => .lt, | |
| 3521 | .lte => .le, | |
| 3522 | .eq => .eq, | |
| 3523 | .neq => .ne, | |
| 3524 | .gte => .ge, | |
| 3525 | .gt => .gt, | |
| 3526 | }; | |
| 3527 | ||
| 3528 | switch (float_bits) { | |
| 3529 | 16 => { | |
| 3530 | _ = try func.fpext(lhs, Type.f16, Type.f32); | |
| 3531 | _ = try func.fpext(rhs, Type.f16, Type.f32); | |
| 3532 | const opcode = buildOpcode(.{ .op = op, .valtype1 = .f32 }); | |
| 3533 | try func.addTag(Mir.Inst.Tag.fromOpcode(opcode)); | |
| 3534 | return .stack; | |
| 3535 | }, | |
| 3536 | 32, 64 => { | |
| 3537 | try func.emitWValue(lhs); | |
| 3538 | try func.emitWValue(rhs); | |
| 3539 | const val_type: wasm.Valtype = if (float_bits == 32) .f32 else .f64; | |
| 3540 | const opcode = buildOpcode(.{ .op = op, .valtype1 = val_type }); | |
| 3541 | try func.addTag(Mir.Inst.Tag.fromOpcode(opcode)); | |
| 3542 | return .stack; | |
| 3543 | }, | |
| 3544 | 80, 128 => { | |
| 3545 | var fn_name_buf: [32]u8 = undefined; | |
| 3546 | const fn_name = std.fmt.bufPrint(&fn_name_buf, "__{s}{s}f2", .{ | |
| 3547 | @tagName(op), target_util.compilerRtFloatAbbrev(float_bits), | |
| 3548 | }) catch unreachable; | |
| 3549 | ||
| 3550 | const result = try func.callIntrinsic(fn_name, &.{ ty.ip_index, ty.ip_index }, Type.bool, &.{ lhs, rhs }); | |
| 3551 | return func.cmp(result, WValue{ .imm32 = 0 }, Type.i32, cmp_op); | |
| 3552 | }, | |
| 3553 | else => unreachable, | |
| 3554 | } | |
| 3488 | 3555 | } |
| 3489 | 3556 | |
| 3490 | 3557 | fn airCmpVector(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| ... | ... | @@ -4796,11 +4863,31 @@ fn airIntFromFloat(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 4796 | 4863 | const ty_op = func.air.instructions.items(.data)[inst].ty_op; |
| 4797 | 4864 | |
| 4798 | 4865 | const operand = try func.resolveInst(ty_op.operand); |
| 4799 | const dest_ty = func.typeOfIndex(inst); | |
| 4800 | 4866 | const op_ty = func.typeOf(ty_op.operand); |
| 4867 | const op_bits = op_ty.floatBits(func.target); | |
| 4868 | ||
| 4869 | const dest_ty = func.typeOfIndex(inst); | |
| 4870 | const dest_info = dest_ty.intInfo(mod); | |
| 4871 | ||
| 4872 | if (dest_info.bits > 128) { | |
| 4873 | return func.fail("TODO: intFromFloat for integers/floats with bitsize {}", .{dest_info.bits}); | |
| 4874 | } | |
| 4875 | ||
| 4876 | if ((op_bits != 32 and op_bits != 64) or dest_info.bits > 64) { | |
| 4877 | const dest_bitsize = if (dest_info.bits <= 16) 16 else std.math.ceilPowerOfTwoAssert(u16, dest_info.bits); | |
| 4878 | ||
| 4879 | var fn_name_buf: [16]u8 = undefined; | |
| 4880 | const fn_name = std.fmt.bufPrint(&fn_name_buf, "__fix{s}{s}f{s}i", .{ | |
| 4881 | switch (dest_info.signedness) { | |
| 4882 | .signed => "", | |
| 4883 | .unsigned => "uns", | |
| 4884 | }, | |
| 4885 | target_util.compilerRtFloatAbbrev(op_bits), | |
| 4886 | target_util.compilerRtIntAbbrev(dest_bitsize), | |
| 4887 | }) catch unreachable; | |
| 4801 | 4888 | |
| 4802 | if (op_ty.abiSize(mod) > 8) { | |
| 4803 | return func.fail("TODO: intFromFloat for integers/floats with bitsize larger than 64 bits", .{}); | |
| 4889 | const result = try (try func.callIntrinsic(fn_name, &.{op_ty.ip_index}, dest_ty, &.{operand})).toLocal(func, dest_ty); | |
| 4890 | return func.finishAir(inst, result, &.{ty_op.operand}); | |
| 4804 | 4891 | } |
| 4805 | 4892 | |
| 4806 | 4893 | try func.emitWValue(operand); |
| ... | ... | @@ -4808,7 +4895,7 @@ fn airIntFromFloat(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 4808 | 4895 | .op = .trunc, |
| 4809 | 4896 | .valtype1 = typeToValtype(dest_ty, mod), |
| 4810 | 4897 | .valtype2 = typeToValtype(op_ty, mod), |
| 4811 | .signedness = if (dest_ty.isSignedInt(mod)) .signed else .unsigned, | |
| 4898 | .signedness = dest_info.signedness, | |
| 4812 | 4899 | }); |
| 4813 | 4900 | try func.addTag(Mir.Inst.Tag.fromOpcode(op)); |
| 4814 | 4901 | const wrapped = try func.wrapOperand(.{ .stack = {} }, dest_ty); |
| ... | ... | @@ -4821,11 +4908,31 @@ fn airFloatFromInt(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 4821 | 4908 | const ty_op = func.air.instructions.items(.data)[inst].ty_op; |
| 4822 | 4909 | |
| 4823 | 4910 | const operand = try func.resolveInst(ty_op.operand); |
| 4824 | const dest_ty = func.typeOfIndex(inst); | |
| 4825 | 4911 | const op_ty = func.typeOf(ty_op.operand); |
| 4912 | const op_info = op_ty.intInfo(mod); | |
| 4913 | ||
| 4914 | const dest_ty = func.typeOfIndex(inst); | |
| 4915 | const dest_bits = dest_ty.floatBits(func.target); | |
| 4916 | ||
| 4917 | if (op_info.bits > 128) { | |
| 4918 | return func.fail("TODO: floatFromInt for integers/floats with bitsize {d} bits", .{op_info.bits}); | |
| 4919 | } | |
| 4920 | ||
| 4921 | if (op_info.bits > 64 or (dest_bits > 64 or dest_bits < 32)) { | |
| 4922 | const op_bitsize = if (op_info.bits <= 16) 16 else std.math.ceilPowerOfTwoAssert(u16, op_info.bits); | |
| 4923 | ||
| 4924 | var fn_name_buf: [16]u8 = undefined; | |
| 4925 | const fn_name = std.fmt.bufPrint(&fn_name_buf, "__float{s}{s}i{s}f", .{ | |
| 4926 | switch (op_info.signedness) { | |
| 4927 | .signed => "", | |
| 4928 | .unsigned => "un", | |
| 4929 | }, | |
| 4930 | target_util.compilerRtIntAbbrev(op_bitsize), | |
| 4931 | target_util.compilerRtFloatAbbrev(dest_bits), | |
| 4932 | }) catch unreachable; | |
| 4826 | 4933 | |
| 4827 | if (op_ty.abiSize(mod) > 8) { | |
| 4828 | return func.fail("TODO: floatFromInt for integers/floats with bitsize larger than 64 bits", .{}); | |
| 4934 | const result = try (try func.callIntrinsic(fn_name, &.{op_ty.ip_index}, dest_ty, &.{operand})).toLocal(func, dest_ty); | |
| 4935 | return func.finishAir(inst, result, &.{ty_op.operand}); | |
| 4829 | 4936 | } |
| 4830 | 4937 | |
| 4831 | 4938 | try func.emitWValue(operand); |
| ... | ... | @@ -4833,7 +4940,7 @@ fn airFloatFromInt(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 4833 | 4940 | .op = .convert, |
| 4834 | 4941 | .valtype1 = typeToValtype(dest_ty, mod), |
| 4835 | 4942 | .valtype2 = typeToValtype(op_ty, mod), |
| 4836 | .signedness = if (op_ty.isSignedInt(mod)) .signed else .unsigned, | |
| 4943 | .signedness = op_info.signedness, | |
| 4837 | 4944 | }); |
| 4838 | 4945 | try func.addTag(Mir.Inst.Tag.fromOpcode(op)); |
| 4839 | 4946 |
test/behavior/bitcast.zig-1| ... | ... | @@ -416,7 +416,6 @@ test "bitcast nan float does not modify signaling bit" { |
| 416 | 416 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 417 | 417 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 418 | 418 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 419 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 420 | 419 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 421 | 420 | // TODO: https://github.com/ziglang/zig/issues/14366 |
| 422 | 421 | if (builtin.zig_backend == .stage2_llvm and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest; |
test/behavior/cast.zig-5| ... | ... | @@ -120,7 +120,6 @@ test "@floatFromInt(f80)" { |
| 120 | 120 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 121 | 121 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 122 | 122 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 123 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 124 | 123 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 125 | 124 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 126 | 125 | if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest; |
| ... | ... | @@ -1248,7 +1247,6 @@ fn castToOptionalSlice() ?[]const u8 { |
| 1248 | 1247 | test "cast u128 to f128 and back" { |
| 1249 | 1248 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1250 | 1249 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1251 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1252 | 1250 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1253 | 1251 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1254 | 1252 | |
| ... | ... | @@ -1392,7 +1390,6 @@ test "cast f16 to wider types" { |
| 1392 | 1390 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1393 | 1391 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1394 | 1392 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1395 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1396 | 1393 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1397 | 1394 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1398 | 1395 | if (builtin.zig_backend == .stage2_c and comptime builtin.cpu.arch.isArmOrThumb()) return error.SkipZigTest; |
| ... | ... | @@ -1413,7 +1410,6 @@ test "cast f128 to narrower types" { |
| 1413 | 1410 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1414 | 1411 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1415 | 1412 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1416 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1417 | 1413 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1418 | 1414 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1419 | 1415 | |
| ... | ... | @@ -1503,7 +1499,6 @@ test "coerce between pointers of compatible differently-named floats" { |
| 1503 | 1499 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1504 | 1500 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1505 | 1501 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1506 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1507 | 1502 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1508 | 1503 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1509 | 1504 |
test/behavior/floatop.zig-17| ... | ... | @@ -71,7 +71,6 @@ fn testDifferentSizedFloatComparisons() !void { |
| 71 | 71 | } |
| 72 | 72 | |
| 73 | 73 | test "f80 comparisons" { |
| 74 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 75 | 74 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 76 | 75 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 77 | 76 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -571,7 +570,6 @@ fn testFabsWithVectors() !void { |
| 571 | 570 | } |
| 572 | 571 | |
| 573 | 572 | test "another, possibly redundant, @fabs test" { |
| 574 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 575 | 573 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 576 | 574 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 577 | 575 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -594,7 +592,6 @@ test "another, possibly redundant, @fabs test" { |
| 594 | 592 | } |
| 595 | 593 | |
| 596 | 594 | test "@fabs f80" { |
| 597 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 598 | 595 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 599 | 596 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 600 | 597 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -612,7 +609,6 @@ fn testFabsLegacy(comptime T: type, x: T) !void { |
| 612 | 609 | } |
| 613 | 610 | |
| 614 | 611 | test "a third @fabs test, surely there should not be three fabs tests" { |
| 615 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 616 | 612 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 617 | 613 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 618 | 614 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -704,7 +700,6 @@ test "another, possibly redundant, @floor test" { |
| 704 | 700 | } |
| 705 | 701 | |
| 706 | 702 | test "@floor f80" { |
| 707 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 708 | 703 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 709 | 704 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 710 | 705 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -721,7 +716,6 @@ test "@floor f80" { |
| 721 | 716 | } |
| 722 | 717 | |
| 723 | 718 | test "@floor f128" { |
| 724 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 725 | 719 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 726 | 720 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 727 | 721 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -802,7 +796,6 @@ test "another, possibly redundant, @ceil test" { |
| 802 | 796 | } |
| 803 | 797 | |
| 804 | 798 | test "@ceil f80" { |
| 805 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 806 | 799 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 807 | 800 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 808 | 801 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -819,7 +812,6 @@ test "@ceil f80" { |
| 819 | 812 | } |
| 820 | 813 | |
| 821 | 814 | test "@ceil f128" { |
| 822 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 823 | 815 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 824 | 816 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 825 | 817 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -899,7 +891,6 @@ test "another, possibly redundant, @trunc test" { |
| 899 | 891 | } |
| 900 | 892 | |
| 901 | 893 | test "@trunc f80" { |
| 902 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 903 | 894 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 904 | 895 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 905 | 896 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -922,7 +913,6 @@ test "@trunc f80" { |
| 922 | 913 | } |
| 923 | 914 | |
| 924 | 915 | test "@trunc f128" { |
| 925 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 926 | 916 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 927 | 917 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 928 | 918 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1017,7 +1007,6 @@ test "negation f80" { |
| 1017 | 1007 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1018 | 1008 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1019 | 1009 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1020 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1021 | 1010 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1022 | 1011 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1023 | 1012 | |
| ... | ... | @@ -1039,7 +1028,6 @@ test "negation f128" { |
| 1039 | 1028 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1040 | 1029 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1041 | 1030 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1042 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1043 | 1031 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1044 | 1032 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1045 | 1033 | |
| ... | ... | @@ -1081,7 +1069,6 @@ test "f128 at compile time is lossy" { |
| 1081 | 1069 | } |
| 1082 | 1070 | |
| 1083 | 1071 | test "comptime fixed-width float zero divided by zero produces NaN" { |
| 1084 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1085 | 1072 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1086 | 1073 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1087 | 1074 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1094,7 +1081,6 @@ test "comptime fixed-width float zero divided by zero produces NaN" { |
| 1094 | 1081 | } |
| 1095 | 1082 | |
| 1096 | 1083 | test "comptime fixed-width float non-zero divided by zero produces signed Inf" { |
| 1097 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1098 | 1084 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1099 | 1085 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1100 | 1086 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1153,7 +1139,6 @@ test "nan negation f32" { |
| 1153 | 1139 | } |
| 1154 | 1140 | |
| 1155 | 1141 | test "nan negation f64" { |
| 1156 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1157 | 1142 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1158 | 1143 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1159 | 1144 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1173,7 +1158,6 @@ test "nan negation f64" { |
| 1173 | 1158 | } |
| 1174 | 1159 | |
| 1175 | 1160 | test "nan negation f128" { |
| 1176 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1177 | 1161 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1178 | 1162 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1179 | 1163 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1193,7 +1177,6 @@ test "nan negation f128" { |
| 1193 | 1177 | } |
| 1194 | 1178 | |
| 1195 | 1179 | test "nan negation f80" { |
| 1196 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1197 | 1180 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1198 | 1181 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1199 | 1182 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
test/behavior/math.zig-8| ... | ... | @@ -628,7 +628,6 @@ fn testShrTrunc(x: u16) !void { |
| 628 | 628 | } |
| 629 | 629 | |
| 630 | 630 | test "f128" { |
| 631 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 632 | 631 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 633 | 632 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 634 | 633 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1430,7 +1429,6 @@ fn fmodOne(comptime T: type, a: T, b: T, c: T, epsilon: T) !void { |
| 1430 | 1429 | } |
| 1431 | 1430 | |
| 1432 | 1431 | test "@round" { |
| 1433 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1434 | 1432 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1435 | 1433 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1436 | 1434 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1451,7 +1449,6 @@ test "@round" { |
| 1451 | 1449 | } |
| 1452 | 1450 | |
| 1453 | 1451 | test "@round f80" { |
| 1454 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1455 | 1452 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1456 | 1453 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1457 | 1454 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1464,7 +1461,6 @@ test "@round f80" { |
| 1464 | 1461 | } |
| 1465 | 1462 | |
| 1466 | 1463 | test "@round f128" { |
| 1467 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1468 | 1464 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1469 | 1465 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1470 | 1466 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1505,7 +1501,6 @@ test "vector integer addition" { |
| 1505 | 1501 | } |
| 1506 | 1502 | |
| 1507 | 1503 | test "NaN comparison" { |
| 1508 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1509 | 1504 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1510 | 1505 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1511 | 1506 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1523,7 +1518,6 @@ test "NaN comparison" { |
| 1523 | 1518 | } |
| 1524 | 1519 | |
| 1525 | 1520 | test "NaN comparison f80" { |
| 1526 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1527 | 1521 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1528 | 1522 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1529 | 1523 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1577,7 +1571,6 @@ test "compare undefined literal with comptime_int" { |
| 1577 | 1571 | } |
| 1578 | 1572 | |
| 1579 | 1573 | test "signed zeros are represented properly" { |
| 1580 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1581 | 1574 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1582 | 1575 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1583 | 1576 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -1612,7 +1605,6 @@ test "comptime sin and ln" { |
| 1612 | 1605 | } |
| 1613 | 1606 | |
| 1614 | 1607 | test "absFloat" { |
| 1615 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 1616 | 1608 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1617 | 1609 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1618 | 1610 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
test/behavior/maximum_minimum.zig-2| ... | ... | @@ -104,7 +104,6 @@ test "@min for vectors" { |
| 104 | 104 | } |
| 105 | 105 | |
| 106 | 106 | test "@min/max for floats" { |
| 107 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 108 | 107 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 109 | 108 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 110 | 109 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| ... | ... | @@ -198,7 +197,6 @@ test "@min/@max notices vector bounds" { |
| 198 | 197 | } |
| 199 | 198 | |
| 200 | 199 | test "@min/@max on comptime_int" { |
| 201 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 202 | 200 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 203 | 201 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 204 | 202 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
test/behavior/muladd.zig-2| ... | ... | @@ -50,7 +50,6 @@ fn testMulAdd16() !void { |
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | test "@mulAdd f80" { |
| 53 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 54 | 53 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 55 | 54 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 56 | 55 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -70,7 +69,6 @@ fn testMulAdd80() !void { |
| 70 | 69 | } |
| 71 | 70 | |
| 72 | 71 | test "@mulAdd f128" { |
| 73 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 74 | 72 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 75 | 73 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 76 | 74 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
test/behavior/widening.zig-2| ... | ... | @@ -40,7 +40,6 @@ test "implicit unsigned integer to signed integer" { |
| 40 | 40 | } |
| 41 | 41 | |
| 42 | 42 | test "float widening" { |
| 43 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 44 | 43 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 45 | 44 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 46 | 45 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| ... | ... | @@ -61,7 +60,6 @@ test "float widening" { |
| 61 | 60 | } |
| 62 | 61 | |
| 63 | 62 | test "float widening f16 to f128" { |
| 64 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | |
| 65 | 63 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 66 | 64 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 67 | 65 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |