| ... | @@ -2,6 +2,7 @@ const std = @import("std"); | ... | @@ -2,6 +2,7 @@ const std = @import("std"); |
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | const expect = std.testing.expect; | 3 | const expect = std.testing.expect; |
| 4 | const expectEqual = std.testing.expectEqual; | 4 | const expectEqual = std.testing.expectEqual; |
| | 5 | const math = std.math; |
| 5 | const maxInt = std.math.maxInt; | 6 | const maxInt = std.math.maxInt; |
| 6 | const minInt = std.math.minInt; | 7 | const minInt = std.math.minInt; |
| 7 | const native_endian = builtin.target.cpu.arch.endian(); | 8 | const native_endian = builtin.target.cpu.arch.endian(); |
| ... | @@ -383,10 +384,72 @@ test "comptime bitcast with fields following f80" { | ... | @@ -383,10 +384,72 @@ test "comptime bitcast with fields following f80" { |
| 383 | } | 384 | } |
| 384 | | 385 | |
| 385 | test "bitcast vector to integer and back" { | 386 | test "bitcast vector to integer and back" { |
| 386 | if (true) return error.SkipZigTest; // TODO: https://github.com/ziglang/zig/issues/13220 | 387 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| | 388 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 389 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 390 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 391 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 387 | | 392 | |
| 388 | const arr: [16]bool = [_]bool{ true, false } ++ [_]bool{true} ** 14; | 393 | const arr: [16]bool = [_]bool{ true, false } ++ [_]bool{true} ** 14; |
| 389 | var x = @splat(16, true); | 394 | var x = @splat(16, true); |
| 390 | x[1] = false; | 395 | x[1] = false; |
| 391 | try expect(@bitCast(u16, x) == comptime @bitCast(u16, @as(@Vector(16, bool), arr))); | 396 | try expect(@bitCast(u16, x) == comptime @bitCast(u16, @as(@Vector(16, bool), arr))); |
| 392 | } | 397 | } |
| | 398 | |
| | 399 | fn bitCastWrapper16(x: f16) u16 { |
| | 400 | return @bitCast(u16, x); |
| | 401 | } |
| | 402 | fn bitCastWrapper32(x: f32) u32 { |
| | 403 | return @bitCast(u32, x); |
| | 404 | } |
| | 405 | fn bitCastWrapper64(x: f64) u64 { |
| | 406 | return @bitCast(u64, x); |
| | 407 | } |
| | 408 | fn bitCastWrapper128(x: f128) u128 { |
| | 409 | return @bitCast(u128, x); |
| | 410 | } |
| | 411 | test "bitcast nan float does modify signaling bit" { |
| | 412 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| | 413 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 414 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 415 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 416 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| | 417 | // TODO: https://github.com/ziglang/zig/issues/14366 |
| | 418 | if (builtin.cpu.arch == .arm and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; |
| | 419 | |
| | 420 | // 16 bit |
| | 421 | const snan_f16_const = math.nan_f16; |
| | 422 | try expectEqual(math.nan_u16, @bitCast(u16, snan_f16_const)); |
| | 423 | try expectEqual(math.nan_u16, bitCastWrapper16(snan_f16_const)); |
| | 424 | |
| | 425 | var snan_f16_var = math.nan_f16; |
| | 426 | try expectEqual(math.nan_u16, @bitCast(u16, snan_f16_var)); |
| | 427 | try expectEqual(math.nan_u16, bitCastWrapper16(snan_f16_var)); |
| | 428 | |
| | 429 | // 32 bit |
| | 430 | const snan_f32_const = math.nan_f32; |
| | 431 | try expectEqual(math.nan_u32, @bitCast(u32, snan_f32_const)); |
| | 432 | try expectEqual(math.nan_u32, bitCastWrapper32(snan_f32_const)); |
| | 433 | |
| | 434 | var snan_f32_var = math.nan_f32; |
| | 435 | try expectEqual(math.nan_u32, @bitCast(u32, snan_f32_var)); |
| | 436 | try expectEqual(math.nan_u32, bitCastWrapper32(snan_f32_var)); |
| | 437 | |
| | 438 | // 64 bit |
| | 439 | const snan_f64_const = math.nan_f64; |
| | 440 | try expectEqual(math.nan_u64, @bitCast(u64, snan_f64_const)); |
| | 441 | try expectEqual(math.nan_u64, bitCastWrapper64(snan_f64_const)); |
| | 442 | |
| | 443 | var snan_f64_var = math.nan_f64; |
| | 444 | try expectEqual(math.nan_u64, @bitCast(u64, snan_f64_var)); |
| | 445 | try expectEqual(math.nan_u64, bitCastWrapper64(snan_f64_var)); |
| | 446 | |
| | 447 | // 128 bit |
| | 448 | const snan_f128_const = math.nan_f128; |
| | 449 | try expectEqual(math.nan_u128, @bitCast(u128, snan_f128_const)); |
| | 450 | try expectEqual(math.nan_u128, bitCastWrapper128(snan_f128_const)); |
| | 451 | |
| | 452 | var snan_f128_var = math.nan_f128; |
| | 453 | try expectEqual(math.nan_u128, @bitCast(u128, snan_f128_var)); |
| | 454 | try expectEqual(math.nan_u128, bitCastWrapper128(snan_f128_var)); |
| | 455 | } |