aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/spirv.zig
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2024-01-23 22:46:06 +0100
committerRobin Voetter <robin@voetter.nl>2024-02-04 19:09:34 +0100
commit25111061504a652bfed45b26252349f363b109af (patch)
tree524c1ed9f702847d6e61cf678d2b30416e88fb24 /src/codegen/spirv.zig
parent9fbba0e01a5e89ce4b4be940539b6b05a7fb3931 (diff)
downloadzig-25111061504a652bfed45b26252349f363b109af.tar.gz
zig-25111061504a652bfed45b26252349f363b109af.zip
spirv: air vector_store_element
Diffstat (limited to 'src/codegen/spirv.zig')
-rw-r--r--src/codegen/spirv.zig24
1 files changed, 24 insertions, 0 deletions
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;