authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-09-17 23:18:06+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-23 12:36:56-07:00
log8d49b2ef4ef0682d1c258a5270f0646f85d7fe63
treeef40c3325bbd9ad84026a294d22eb72f0e3cb64e
parent66b1f6c163e5fa3fddd3361a1ff4b64b3cbfc6bf

spirv: air array_to_slice


2 files changed, 26 insertions(+), 7 deletions(-)

src/codegen/spirv.zig+26
......@@ -1681,6 +1681,8 @@ pub const DeclGen = struct {
16811681 .int_from_float => try self.airIntFromFloat(inst),
16821682 .not => try self.airNot(inst),
16831683
1684 .array_to_slice => try self.airArrayToSlice(inst),
1685
16841686 .slice_ptr => try self.airSliceField(inst, 0),
16851687 .slice_len => try self.airSliceField(inst, 1),
16861688 .slice_elem_ptr => try self.airSliceElemPtr(inst),
......@@ -2427,6 +2429,30 @@ pub const DeclGen = struct {
24272429 return result_id;
24282430 }
24292431
2432 fn airArrayToSlice(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
2433 const mod = self.module;
2434 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2435 const array_ptr_ty = self.typeOf(ty_op.operand);
2436 const array_ty = array_ptr_ty.childType(mod);
2437 const elem_ty = array_ptr_ty.elemType2(mod); // use elemType() so that we get T for *[N]T.
2438 const elem_ty_ref = try self.resolveType(elem_ty, .indirect);
2439 const elem_ptr_ty_ref = try self.spv.ptrType(elem_ty_ref, spvStorageClass(array_ptr_ty.ptrAddressSpace(mod)));
2440 const slice_ty = self.typeOfIndex(inst);
2441 const slice_ty_ref = try self.resolveType(slice_ty, .direct);
2442 const size_ty_ref = try self.sizeType();
2443
2444 const array_ptr_id = try self.resolve(ty_op.operand);
2445 const len_id = try self.constInt(size_ty_ref, array_ty.arrayLen(mod));
2446
2447 if (!array_ty.hasRuntimeBitsIgnoreComptime(mod)) {
2448 unreachable; // TODO
2449 }
2450
2451 // Convert the pointer-to-array to a pointer to the first element.
2452 const elem_ptr_id = try self.accessChain(elem_ptr_ty_ref, array_ptr_id, &.{0});
2453 return try self.constructStruct(slice_ty_ref, &.{ elem_ptr_id, len_id });
2454 }
2455
24302456 fn airSliceField(self: *DeclGen, inst: Air.Inst.Index, field: u32) !?IdRef {
24312457 if (self.liveness.isUnused(inst)) return null;
24322458 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
test/behavior/slice.zig-7
......@@ -29,7 +29,6 @@ comptime {
2929
3030test "slicing" {
3131 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3332
3433 var array: [20]i32 = undefined;
3534
......@@ -346,7 +345,6 @@ test "empty array to slice" {
346345test "@ptrCast slice to pointer" {
347346 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
348347 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
349 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
350348
351349 const S = struct {
352350 fn doTheTest() !void {
......@@ -572,7 +570,6 @@ test "slice syntax resulting in pointer-to-array" {
572570test "slice pointer-to-array null terminated" {
573571 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
574572 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
575 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
576573
577574 comptime {
578575 var array = [5:0]u8{ 1, 2, 3, 4, 5 };
......@@ -714,7 +711,6 @@ test "slice sentinel access at comptime" {
714711test "slicing array with sentinel as end index" {
715712 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
716713 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
717 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
718714
719715 const S = struct {
720716 fn do() !void {
......@@ -733,7 +729,6 @@ test "slicing array with sentinel as end index" {
733729test "slicing slice with sentinel as end index" {
734730 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
735731 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
736 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
737732
738733 const S = struct {
739734 fn do() !void {
......@@ -762,7 +757,6 @@ test "slice len modification at comptime" {
762757}
763758
764759test "slice field ptr const" {
765 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
766760
767761 const const_slice: []const u8 = "string";
768762
......@@ -777,7 +771,6 @@ test "slice field ptr const" {
777771
778772test "slice field ptr var" {
779773 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
780 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
781774
782775 var var_slice: []const u8 = "string";
783776