From 8d036d1d78bd6db5fd39b30c6182196c1e49a3db Mon Sep 17 00:00:00 2001 From: mlugg Date: Sun, 27 Aug 2023 17:03:42 +0100 Subject: Sema: allow cast builtins on vectors The following cast builtins did not previously work on vectors, and have been made to: * `@floatCast` * `@ptrFromInt` * `@intFromPtr` * `@floatFromInt` * `@intFromFloat` * `@intFromBool` Resolves: #16267 --- test/behavior/cast.zig | 130 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) (limited to 'test/behavior') diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 742f6b5af5..85d1b28a5a 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -609,7 +609,7 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" { try expect(mem.eql(u8, std.mem.sliceTo(@as([*:0]const u8, @ptrCast(x[0].?)), 0), "window name")); } -test "vector casts" { +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 @@ -2366,3 +2366,131 @@ test "cast builtins can wrap result in error union and optional" { try S.doTheTest(); try comptime S.doTheTest(); } + +test "@floatCast 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_spirv64) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var a: @Vector(3, f64) = .{ 1.5, 2.5, 3.5 }; + const b: @Vector(3, f32) = @floatCast(a); + try expectEqual(@Vector(3, f32){ 1.5, 2.5, 3.5 }, b); + } + }; + + try S.doTheTest(); + try comptime S.doTheTest(); +} + +test "@ptrFromInt 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_spirv64) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var a: @Vector(3, usize) = .{ 0x1000, 0x2000, 0x3000 }; + const b: @Vector(3, *anyopaque) = @ptrFromInt(a); + try expectEqual(@Vector(3, *anyopaque){ + @ptrFromInt(0x1000), + @ptrFromInt(0x2000), + @ptrFromInt(0x3000), + }, b); + } + }; + + try S.doTheTest(); + try comptime S.doTheTest(); +} + +test "@intFromPtr 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_spirv64) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var a: @Vector(3, *anyopaque) = .{ + @ptrFromInt(0x1000), + @ptrFromInt(0x2000), + @ptrFromInt(0x3000), + }; + const b: @Vector(3, usize) = @intFromPtr(a); + try expectEqual(@Vector(3, usize){ 0x1000, 0x2000, 0x3000 }, b); + } + }; + + try S.doTheTest(); + try comptime S.doTheTest(); +} + +test "@floatFromInt 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_spirv64) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var a: @Vector(3, u32) = .{ 10, 20, 30 }; + const b: @Vector(3, f32) = @floatFromInt(a); + try expectEqual(@Vector(3, f32){ 10.0, 20.0, 30.0 }, b); + } + }; + + try S.doTheTest(); + try comptime S.doTheTest(); +} + +test "@intFromFloat 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_spirv64) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var a: @Vector(3, f32) = .{ 10.3, 20.5, 30.7 }; + const b: @Vector(3, u32) = @intFromFloat(a); + try expectEqual(@Vector(3, u32){ 10, 20, 30 }, b); + } + }; + + try S.doTheTest(); + try comptime S.doTheTest(); +} + +test "@intFromBool 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_spirv64) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var a: @Vector(3, bool) = .{ false, true, false }; + const b: @Vector(3, u1) = @intFromBool(a); + try expectEqual(@Vector(3, u1){ 0, 1, 0 }, b); + } + }; + + try S.doTheTest(); + try comptime S.doTheTest(); +} -- cgit v1.2.3