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)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user