diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-06-30 00:02:00 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-06-30 00:02:00 -0700 |
| commit | 6bc6e47b1582a4538078c8f4e9b3dae386854d07 (patch) | |
| tree | 3919cd49e8cfe2772c4028f0b056f47040651494 /test/behavior/floatop.zig | |
| parent | 54454fd0102af8b25dbc85751d37fd265380d920 (diff) | |
| download | zig-6bc6e47b1582a4538078c8f4e9b3dae386854d07.tar.gz zig-6bc6e47b1582a4538078c8f4e9b3dae386854d07.zip | |
stage2: lower float negation explicitly
Rather than lowering float negation as `0.0 - x`.
* Add AIR instruction for float negation.
* Add compiler-rt functions for f128, f80 negation
closes #11853
Diffstat (limited to 'test/behavior/floatop.zig')
| -rw-r--r-- | test/behavior/floatop.zig | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/test/behavior/floatop.zig b/test/behavior/floatop.zig index ac35834928..c057f7a842 100644 --- a/test/behavior/floatop.zig +++ b/test/behavior/floatop.zig @@ -574,6 +574,7 @@ test "negation f32" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO const S = struct { fn doTheTest() !void { @@ -593,6 +594,8 @@ test "negation f64" { if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO const S = struct { fn doTheTest() !void { @@ -707,3 +710,103 @@ test "comptime_float zero divided by zero produces zero" { try expect((0.0 / 0.0) == 0.0); } + +test "nan negation f16" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + + const nan_comptime = comptime math.nan(f16); + const neg_nan_comptime = -nan_comptime; + + var nan_runtime = math.nan(f16); + const neg_nan_runtime = -nan_runtime; + + try expect(!math.signbit(nan_runtime)); + try expect(math.signbit(neg_nan_runtime)); + + try expect(!math.signbit(nan_comptime)); + try expect(math.signbit(neg_nan_comptime)); +} + +test "nan negation f32" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + + const nan_comptime = comptime math.nan(f32); + const neg_nan_comptime = -nan_comptime; + + var nan_runtime = math.nan(f32); + const neg_nan_runtime = -nan_runtime; + + try expect(!math.signbit(nan_runtime)); + try expect(math.signbit(neg_nan_runtime)); + + try expect(!math.signbit(nan_comptime)); + try expect(math.signbit(neg_nan_comptime)); +} + +test "nan negation f64" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + + const nan_comptime = comptime math.nan(f64); + const neg_nan_comptime = -nan_comptime; + + var nan_runtime = math.nan(f64); + const neg_nan_runtime = -nan_runtime; + + try expect(!math.signbit(nan_runtime)); + try expect(math.signbit(neg_nan_runtime)); + + try expect(!math.signbit(nan_comptime)); + try expect(math.signbit(neg_nan_comptime)); +} + +test "nan negation f128" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + + const nan_comptime = comptime math.nan(f128); + const neg_nan_comptime = -nan_comptime; + + var nan_runtime = math.nan(f128); + const neg_nan_runtime = -nan_runtime; + + try expect(!math.signbit(nan_runtime)); + try expect(math.signbit(neg_nan_runtime)); + + try expect(!math.signbit(nan_comptime)); + try expect(math.signbit(neg_nan_comptime)); +} + +test "nan negation f80" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + + const nan_comptime = comptime math.nan(f80); + const neg_nan_comptime = -nan_comptime; + + var nan_runtime = math.nan(f80); + const neg_nan_runtime = -nan_runtime; + + try expect(!math.signbit(nan_runtime)); + try expect(math.signbit(neg_nan_runtime)); + + try expect(!math.signbit(nan_comptime)); + try expect(math.signbit(neg_nan_comptime)); +} |
