From 9c70315854735ab9ecd572e327f41ea547033f09 Mon Sep 17 00:00:00 2001 From: kcbanner Date: Thu, 29 Dec 2022 13:44:40 -0500 Subject: [PATCH] tests: add more coverage for 128 bit operations - fixup 128-bit atomics test to only run on x86_64 - add truncation test for 128-bit types, including non power of two targets (there was a bug with broken non-power-of-two truncation in the cbe) - add 128-bit binary not test (covers another bug fixed in the cbe) --- test/behavior/atomics.zig | 11 ++++------- test/behavior/int128.zig | 15 +++++++++++++-- test/behavior/math.zig | 17 +++++++++++++++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/test/behavior/atomics.zig b/test/behavior/atomics.zig index 92ed027008..198f3953c2 100644 --- a/test/behavior/atomics.zig +++ b/test/behavior/atomics.zig @@ -308,16 +308,13 @@ fn testAtomicRmwInt(comptime signedness: std.builtin.Signedness, comptime N: usi } test "atomicrmw with 128-bit ints" { - 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_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - if (builtin.zig_backend == .stage2_c and builtin.cpu.arch == .aarch64) { + if (builtin.cpu.arch != .x86_64) { + // TODO: Ideally this could use target.atomicPtrAlignment and check for IntTooBig return error.SkipZigTest; } + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + try testAtomicRmwInt128(.unsigned); comptime try testAtomicRmwInt128(.unsigned); } diff --git a/test/behavior/int128.zig b/test/behavior/int128.zig index 7da6f7954e..6ae4ef51db 100644 --- a/test/behavior/int128.zig +++ b/test/behavior/int128.zig @@ -69,6 +69,17 @@ test "truncate int128" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - var buff: u128 = maxInt(u128); - try expect(@truncate(u64, buff) == maxInt(u64)); + { + var buff: u128 = maxInt(u128); + try expect(@truncate(u64, buff) == maxInt(u64)); + try expect(@truncate(u90, buff) == maxInt(u90)); + try expect(@truncate(u128, buff) == maxInt(u128)); + } + + { + var buff: i128 = maxInt(i128); + try expect(@truncate(i64, buff) == -1); + try expect(@truncate(i90, buff) == -1); + try expect(@truncate(i128, buff) == maxInt(i128)); + } } diff --git a/test/behavior/math.zig b/test/behavior/math.zig index 5252efe2fa..0f2139dcfe 100644 --- a/test/behavior/math.zig +++ b/test/behavior/math.zig @@ -377,6 +377,23 @@ fn testBinaryNot(x: u16) !void { try expect(~x == 0b0101010101010101); } + +test "binary not 128-bit" { + try expect(comptime x: { + break :x ~@as(u128, 0x55555555_55555555_55555555_55555555) == 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa; + }); + try expect(comptime x: { + break :x ~@as(i128, 0x55555555_55555555_55555555_55555555) == @bitCast(i128, @as(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa)); + }); + + try testBinaryNot128(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa); + try testBinaryNot128(i128, @bitCast(i128, @as(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa))); +} + +fn testBinaryNot128(comptime Type: type, x: Type) !void { + try expect(~x == @as(Type, 0x55555555_55555555_55555555_55555555)); +} + test "division" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO