authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2024-01-21 20:38:56+01:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2024-02-04 19:09:32+01:00
log631d1b63a8027c49073995e28aab489534f01efa
tree0813aa7723ce71e83ac00d78a2c371d79af266b1
parent9641d2ebdb74926a56ff3b916082534052dc637f
signaturebadge-check Signed by SSH key SHA256:ZS52FNyUv2WUXvO4njmVaFVO46RHojFuOrxRc4LuKzg

spirv: fix shuffle properly


5 files changed, 13 insertions(+), 27 deletions(-)

src/codegen/spirv.zig+13-19
......@@ -2876,37 +2876,31 @@ const DeclGen = struct {
28762876 fn airShuffle(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
28772877 const mod = self.module;
28782878 if (self.liveness.isUnused(inst)) return null;
2879 const ty = self.typeOfIndex(inst);
28802879 const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
28812880 const extra = self.air.extraData(Air.Shuffle, ty_pl.payload).data;
28822881 const a = try self.resolve(extra.a);
28832882 const b = try self.resolve(extra.b);
28842883 const mask = Value.fromInterned(extra.mask);
2885 const mask_len = extra.mask_len;
2886 const a_len = self.typeOf(extra.a).vectorLen(mod);
28872884
2888 const result_id = self.spv.allocId();
2889 const result_type_id = try self.resolveTypeId(ty);
2890 // Similar to LLVM, SPIR-V uses indices larger than the length of the first vector
2891 // to index into the second vector.
2892 try self.func.body.emitRaw(self.spv.gpa, .OpVectorShuffle, 4 + mask_len);
2893 self.func.body.writeOperand(spec.IdResultType, result_type_id);
2894 self.func.body.writeOperand(spec.IdResult, result_id);
2895 self.func.body.writeOperand(spec.IdRef, a);
2896 self.func.body.writeOperand(spec.IdRef, b);
2885 const ty = self.typeOfIndex(inst);
28972886
2898 var i: usize = 0;
2899 while (i < mask_len) : (i += 1) {
2887 var wip = try self.elementWise(ty);
2888 defer wip.deinit();
2889 for (wip.results, 0..) |*result_id, i| {
29002890 const elem = try mask.elemValue(mod, i);
29012891 if (elem.isUndef(mod)) {
2902 self.func.body.writeOperand(spec.LiteralInteger, 0xFFFF_FFFF);
2892 result_id.* = try self.spv.constUndef(wip.scalar_ty_ref);
2893 continue;
2894 }
2895
2896 const index = elem.toSignedInt(mod);
2897 if (index >= 0) {
2898 result_id.* = try self.extractField(wip.scalar_ty, a, @intCast(index));
29032899 } else {
2904 const int = elem.toSignedInt(mod);
2905 const unsigned = if (int >= 0) @as(u32, @intCast(int)) else @as(u32, @intCast(~int + a_len));
2906 self.func.body.writeOperand(spec.LiteralInteger, unsigned);
2900 result_id.* = try self.extractField(wip.scalar_ty, b, @intCast(~index));
29072901 }
29082902 }
2909 return result_id;
2903 return try wip.finalize();
29102904 }
29112905
29122906 fn indicesToIds(self: *DeclGen, indices: []const u32) ![]IdRef {
test/behavior/abs.zig-1
......@@ -224,7 +224,6 @@ test "@abs unsigned int vectors" {
224224 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
225225 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
226226 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
227 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
228227
229228 try comptime testAbsUnsignedIntVectors(1);
230229 try testAbsUnsignedIntVectors(1);
test/behavior/cast.zig-2
......@@ -605,7 +605,6 @@ test "@intCast on vector" {
605605 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
606606 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
607607 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
608 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
609608
610609 const S = struct {
611610 fn doTheTest() !void {
......@@ -2508,7 +2507,6 @@ test "@intCast vector of signed integer" {
25082507 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25092508 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
25102509 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2511 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
25122510 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
25132511 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
25142512
test/behavior/shuffle.zig-3
......@@ -8,7 +8,6 @@ test "@shuffle int" {
88 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
99 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1010 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1211
1312 const S = struct {
1413 fn doTheTest() !void {
......@@ -54,7 +53,6 @@ test "@shuffle bool 1" {
5453 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5554 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5655 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
57 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
5856
5957 const S = struct {
6058 fn doTheTest() !void {
......@@ -77,7 +75,6 @@ test "@shuffle bool 2" {
7775 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
7876 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
7977 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
80 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
8178
8279 if (builtin.zig_backend == .stage2_llvm) {
8380 // https://github.com/ziglang/zig/issues/3246
test/behavior/vector.zig-2
......@@ -910,7 +910,6 @@ test "mask parameter of @shuffle is comptime scope" {
910910 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
911911 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
912912 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
913 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
914913
915914 const __v4hi = @Vector(4, i16);
916915 var v4_a = __v4hi{ 0, 0, 0, 0 };
......@@ -1322,7 +1321,6 @@ test "array operands to shuffle are coerced to vectors" {
13221321 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13231322 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13241323 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1325 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13261324
13271325 const mask = [5]i32{ -1, 0, 1, 2, 3 };
13281326