added test for bitcast signaled nan float

This was fixed by MR #14201

closes #10449
This commit is contained in:
Hardy 2023-01-11 23:15:34 +01:00 committed by Veikka Tuominen
parent fe6dcdba14
commit 37fe41792c

View File

@ -2,6 +2,7 @@ const std = @import("std");
const builtin = @import("builtin");
const expect = std.testing.expect;
const expectEqual = std.testing.expectEqual;
const math = std.math;
const maxInt = std.math.maxInt;
const minInt = std.math.minInt;
const native_endian = builtin.target.cpu.arch.endian();
@ -383,10 +384,72 @@ test "comptime bitcast with fields following f80" {
}
test "bitcast vector to integer and back" {
if (true) return error.SkipZigTest; // TODO: https://github.com/ziglang/zig/issues/13220
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
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
const arr: [16]bool = [_]bool{ true, false } ++ [_]bool{true} ** 14;
var x = @splat(16, true);
x[1] = false;
try expect(@bitCast(u16, x) == comptime @bitCast(u16, @as(@Vector(16, bool), arr)));
}
fn bitCastWrapper16(x: f16) u16 {
return @bitCast(u16, x);
}
fn bitCastWrapper32(x: f32) u32 {
return @bitCast(u32, x);
}
fn bitCastWrapper64(x: f64) u64 {
return @bitCast(u64, x);
}
fn bitCastWrapper128(x: f128) u128 {
return @bitCast(u128, x);
}
test "bitcast nan float does modify signaling bit" {
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
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
// TODO: https://github.com/ziglang/zig/issues/14366
if (builtin.cpu.arch == .arm and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
// 16 bit
const snan_f16_const = math.nan_f16;
try expectEqual(math.nan_u16, @bitCast(u16, snan_f16_const));
try expectEqual(math.nan_u16, bitCastWrapper16(snan_f16_const));
var snan_f16_var = math.nan_f16;
try expectEqual(math.nan_u16, @bitCast(u16, snan_f16_var));
try expectEqual(math.nan_u16, bitCastWrapper16(snan_f16_var));
// 32 bit
const snan_f32_const = math.nan_f32;
try expectEqual(math.nan_u32, @bitCast(u32, snan_f32_const));
try expectEqual(math.nan_u32, bitCastWrapper32(snan_f32_const));
var snan_f32_var = math.nan_f32;
try expectEqual(math.nan_u32, @bitCast(u32, snan_f32_var));
try expectEqual(math.nan_u32, bitCastWrapper32(snan_f32_var));
// 64 bit
const snan_f64_const = math.nan_f64;
try expectEqual(math.nan_u64, @bitCast(u64, snan_f64_const));
try expectEqual(math.nan_u64, bitCastWrapper64(snan_f64_const));
var snan_f64_var = math.nan_f64;
try expectEqual(math.nan_u64, @bitCast(u64, snan_f64_var));
try expectEqual(math.nan_u64, bitCastWrapper64(snan_f64_var));
// 128 bit
const snan_f128_const = math.nan_f128;
try expectEqual(math.nan_u128, @bitCast(u128, snan_f128_const));
try expectEqual(math.nan_u128, bitCastWrapper128(snan_f128_const));
var snan_f128_var = math.nan_f128;
try expectEqual(math.nan_u128, @bitCast(u128, snan_f128_var));
try expectEqual(math.nan_u128, bitCastWrapper128(snan_f128_var));
}