diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 80a3e7b07f..a499f3d8ed 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -2236,6 +2236,8 @@ const DeclGen = struct { .ptr_elem_val => try self.airPtrElemVal(inst), .array_elem_val => try self.airArrayElemVal(inst), + .vector_store_elem => return self.airVectorStoreElem(inst), + .set_union_tag => return self.airSetUnionTag(inst), .get_union_tag => try self.airGetUnionTag(inst), .union_init => try self.airUnionInit(inst), @@ -3824,6 +3826,28 @@ const DeclGen = struct { return try self.load(elem_ty, elem_ptr_id, .{ .is_volatile = ptr_ty.isVolatilePtr(mod) }); } + fn airVectorStoreElem(self: *DeclGen, inst: Air.Inst.Index) !void { + const mod = self.module; + const data = self.air.instructions.items(.data)[@intFromEnum(inst)].vector_store_elem; + const extra = self.air.extraData(Air.Bin, data.payload).data; + + const vector_ptr_ty = self.typeOf(data.vector_ptr); + const vector_ty = vector_ptr_ty.childType(mod); + const scalar_ty = vector_ty.scalarType(mod); + + const storage_class = spvStorageClass(vector_ptr_ty.ptrAddressSpace(mod)); + const scalar_ptr_ty_ref = try self.ptrType(scalar_ty, storage_class); + + const vector_ptr = try self.resolve(data.vector_ptr); + const index = try self.resolve(extra.lhs); + const operand = try self.resolve(extra.rhs); + + const elem_ptr_id = try self.accessChainId(scalar_ptr_ty_ref, vector_ptr, &.{index}); + try self.store(scalar_ty, elem_ptr_id, operand, .{ + .is_volatile = vector_ptr_ty.isVolatilePtr(mod), + }); + } + fn airSetUnionTag(self: *DeclGen, inst: Air.Inst.Index) !void { const mod = self.module; const bin_op = self.air.instructions.items(.data)[@intFromEnum(inst)].bin_op; diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index 07a695d61d..99cfe90317 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -1344,7 +1344,6 @@ test "store packed vector element" { 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; 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_c) return error.SkipZigTest; // TODO