diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-02-15 10:37:52 +0100 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-02-25 11:22:10 +0100 |
| commit | 2fcb2f597549edd0b1241cebf98c11efe2f25884 (patch) | |
| tree | ebf6aca8e0c1d5c77874c2c05b0cccd0967d080f /test | |
| parent | 2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c (diff) | |
| download | zig-2fcb2f597549edd0b1241cebf98c11efe2f25884.tar.gz zig-2fcb2f597549edd0b1241cebf98c11efe2f25884.zip | |
Sema: implement vector coercions
These used to be lowered elementwise in air, and now are a single air
instruction that can be lowered elementwise in the backend if necessary.
Diffstat (limited to 'test')
| -rw-r--r-- | test/behavior/cast.zig | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index c591a5a619..19e5ebb3c1 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -601,25 +601,25 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" { test "@intCast on vector" { 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_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; const S = struct { fn doTheTest() !void { // Upcast (implicit, equivalent to @intCast) var up0: @Vector(2, u8) = [_]u8{ 0x55, 0xaa }; _ = &up0; - const up1 = @as(@Vector(2, u16), up0); - const up2 = @as(@Vector(2, u32), up0); - const up3 = @as(@Vector(2, u64), up0); + const up1: @Vector(2, u16) = up0; + const up2: @Vector(2, u32) = up0; + const up3: @Vector(2, u64) = up0; // Downcast (safety-checked) var down0 = up3; _ = &down0; - const down1 = @as(@Vector(2, u32), @intCast(down0)); - const down2 = @as(@Vector(2, u16), @intCast(down0)); - const down3 = @as(@Vector(2, u8), @intCast(down0)); + const down1: @Vector(2, u32) = @intCast(down0); + const down2: @Vector(2, u16) = @intCast(down0); + const down3: @Vector(2, u8) = @intCast(down0); try expect(mem.eql(u16, &@as([2]u16, up1), &[2]u16{ 0x55, 0xaa })); try expect(mem.eql(u32, &@as([2]u32, up2), &[2]u32{ 0x55, 0xaa })); @@ -629,20 +629,10 @@ test "@intCast on vector" { try expect(mem.eql(u16, &@as([2]u16, down2), &[2]u16{ 0x55, 0xaa })); try expect(mem.eql(u8, &@as([2]u8, down3), &[2]u8{ 0x55, 0xaa })); } - - fn doTheTestFloat() !void { - var vec: @Vector(2, f32) = @splat(1234.0); - _ = &vec; - const wider: @Vector(2, f64) = vec; - try expect(wider[0] == 1234.0); - try expect(wider[1] == 1234.0); - } }; try S.doTheTest(); try comptime S.doTheTest(); - try S.doTheTestFloat(); - try comptime S.doTheTestFloat(); } test "@floatCast cast down" { @@ -2340,10 +2330,31 @@ test "@floatCast on vector" { const S = struct { fn doTheTest() !void { - var a: @Vector(3, f64) = .{ 1.5, 2.5, 3.5 }; - _ = &a; - const b: @Vector(3, f32) = @floatCast(a); - try expectEqual(@Vector(3, f32){ 1.5, 2.5, 3.5 }, b); + { + var a: @Vector(2, f64) = .{ 1.5, 2.5 }; + _ = &a; + const b: @Vector(2, f32) = @floatCast(a); + try expectEqual(@Vector(2, f32){ 1.5, 2.5 }, b); + } + { + var a: @Vector(2, f32) = .{ 3.25, 4.25 }; + _ = &a; + const b: @Vector(2, f64) = @floatCast(a); + try expectEqual(@Vector(2, f64){ 3.25, 4.25 }, b); + } + { + var a: @Vector(2, f32) = .{ 5.75, 6.75 }; + _ = &a; + const b: @Vector(2, f64) = a; + try expectEqual(@Vector(2, f64){ 5.75, 6.75 }, b); + } + { + var vec: @Vector(2, f32) = @splat(1234.0); + _ = &vec; + const wider: @Vector(2, f64) = vec; + try expect(wider[0] == 1234.0); + try expect(wider[1] == 1234.0); + } } }; |
