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 {...@@ -1681,6 +1681,8 @@ pub const DeclGen = struct {
1681 .int_from_float => try self.airIntFromFloat(inst),1681 .int_from_float => try self.airIntFromFloat(inst),
1682 .not => try self.airNot(inst),1682 .not => try self.airNot(inst),
16831683
1684 .array_to_slice => try self.airArrayToSlice(inst),
1685
1684 .slice_ptr => try self.airSliceField(inst, 0),1686 .slice_ptr => try self.airSliceField(inst, 0),
1685 .slice_len => try self.airSliceField(inst, 1),1687 .slice_len => try self.airSliceField(inst, 1),
1686 .slice_elem_ptr => try self.airSliceElemPtr(inst),1688 .slice_elem_ptr => try self.airSliceElemPtr(inst),
...@@ -2427,6 +2429,30 @@ pub const DeclGen = struct {...@@ -2427,6 +2429,30 @@ pub const DeclGen = struct {
2427 return result_id;2429 return result_id;
2428 }2430 }
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
2430 fn airSliceField(self: *DeclGen, inst: Air.Inst.Index, field: u32) !?IdRef {2456 fn airSliceField(self: *DeclGen, inst: Air.Inst.Index, field: u32) !?IdRef {
2431 if (self.liveness.isUnused(inst)) return null;2457 if (self.liveness.isUnused(inst)) return null;
2432 const ty_op = self.air.instructions.items(.data)[inst].ty_op;2458 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
test/behavior/slice.zig-7
...@@ -29,7 +29,6 @@ comptime {...@@ -29,7 +29,6 @@ comptime {
2929
30test "slicing" {30test "slicing" {
31 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO31 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
3332
34 var array: [20]i32 = undefined;33 var array: [20]i32 = undefined;
3534
...@@ -346,7 +345,6 @@ test "empty array to slice" {...@@ -346,7 +345,6 @@ test "empty array to slice" {
346test "@ptrCast slice to pointer" {345test "@ptrCast slice to pointer" {
347 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;346 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
348 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO347 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
349 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
350348
351 const S = struct {349 const S = struct {
352 fn doTheTest() !void {350 fn doTheTest() !void {
...@@ -572,7 +570,6 @@ test "slice syntax resulting in pointer-to-array" {...@@ -572,7 +570,6 @@ test "slice syntax resulting in pointer-to-array" {
572test "slice pointer-to-array null terminated" {570test "slice pointer-to-array null terminated" {
573 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO571 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
574 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO572 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
575 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
576573
577 comptime {574 comptime {
578 var array = [5:0]u8{ 1, 2, 3, 4, 5 };575 var array = [5:0]u8{ 1, 2, 3, 4, 5 };
...@@ -714,7 +711,6 @@ test "slice sentinel access at comptime" {...@@ -714,7 +711,6 @@ test "slice sentinel access at comptime" {
714test "slicing array with sentinel as end index" {711test "slicing array with sentinel as end index" {
715 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;712 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
716 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO713 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
717 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
718714
719 const S = struct {715 const S = struct {
720 fn do() !void {716 fn do() !void {
...@@ -733,7 +729,6 @@ test "slicing array with sentinel as end index" {...@@ -733,7 +729,6 @@ test "slicing array with sentinel as end index" {
733test "slicing slice with sentinel as end index" {729test "slicing slice with sentinel as end index" {
734 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;730 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
735 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO731 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
736 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
737732
738 const S = struct {733 const S = struct {
739 fn do() !void {734 fn do() !void {
...@@ -762,7 +757,6 @@ test "slice len modification at comptime" {...@@ -762,7 +757,6 @@ test "slice len modification at comptime" {
762}757}
763758
764test "slice field ptr const" {759test "slice field ptr const" {
765 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
766760
767 const const_slice: []const u8 = "string";761 const const_slice: []const u8 = "string";
768762
...@@ -777,7 +771,6 @@ test "slice field ptr const" {...@@ -777,7 +771,6 @@ test "slice field ptr const" {
777771
778test "slice field ptr var" {772test "slice field ptr var" {
779 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO773 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
780 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
781774
782 var var_slice: []const u8 = "string";775 var var_slice: []const u8 = "string";
783776