authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-12 11:01:23-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-06-13 02:22:04-07:00
logb67995689df424a0cab9186fcaf7b09bb04ffc1a
treef5a860913a7133af62a18339a3f437c4c5dbb67b
parentb2cb090c3790dd10a784f9e291230cf6052b514c
signaturelock-open Commit is signed but in an unrecognized format.

riscv: add `airAggregateInit` for arrays


13 files changed, 23 insertions(+), 31 deletions(-)

src/arch/riscv64/CodeGen.zig+23-4
......@@ -3207,10 +3207,6 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {
32073207 const offset_reg_lock = self.register_manager.lockRegAssumeUnused(offset_reg);
32083208 defer self.register_manager.unlockReg(offset_reg_lock);
32093209
3210 if (true) return self.fail("TODO: airPtrElemPtr", .{});
3211
3212 // TODO: something is breaking here dunno
3213
32143210 break :result try self.binOp(.ptr_add, base_ptr_mcv, base_ptr_ty, .{ .register = offset_reg }, base_ptr_ty);
32153211 };
32163212 return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none });
......@@ -5864,6 +5860,29 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
58645860 }
58655861 break :result .{ .load_frame = .{ .index = frame_index } };
58665862 },
5863 .Array => {
5864 const elem_ty = result_ty.childType(zcu);
5865 const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, zcu));
5866 const elem_size: u32 = @intCast(elem_ty.abiSize(zcu));
5867
5868 for (elements, 0..) |elem, elem_i| {
5869 const elem_mcv = try self.resolveInst(elem);
5870 const elem_off: i32 = @intCast(elem_size * elem_i);
5871 try self.genSetMem(
5872 .{ .frame = frame_index },
5873 elem_off,
5874 elem_ty,
5875 elem_mcv,
5876 );
5877 }
5878 if (result_ty.sentinel(zcu)) |sentinel| try self.genSetMem(
5879 .{ .frame = frame_index },
5880 @intCast(elem_size * elements.len),
5881 elem_ty,
5882 try self.genTypedValue(sentinel),
5883 );
5884 break :result .{ .load_frame = .{ .index = frame_index } };
5885 },
58675886 else => return self.fail("TODO: airAggregate {}", .{result_ty.fmt(zcu)}),
58685887 }
58695888 };
test/behavior/align.zig-1
......@@ -237,7 +237,6 @@ fn addUnalignedSlice(a: []align(1) const u32, b: []align(1) const u32) u32 {
237237}
238238
239239test "specifying alignment allows pointer cast" {
240 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
241240 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
242241 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
243242
test/behavior/array.zig-3
......@@ -346,7 +346,6 @@ test "read/write through global variable array of struct fields initialized via
346346test "implicit cast single-item pointer" {
347347 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
348348 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
349 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
350349
351350 try testImplicitCastSingleItemPtr();
352351 try comptime testImplicitCastSingleItemPtr();
......@@ -714,7 +713,6 @@ test "array of array agregate init" {
714713 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
715714 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
716715 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
717 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
718716
719717 var a = [1]u32{11} ** 10;
720718 var b = [1][10]u32{a} ** 2;
......@@ -765,7 +763,6 @@ test "slicing array of zero-sized values" {
765763 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
766764 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
767765 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
768 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
769766 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
770767
771768 var arr: [32]u0 = undefined;
test/behavior/basic.zig-6
......@@ -688,7 +688,6 @@ test "string concatenation" {
688688 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
689689 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
690690 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
691 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
692691
693692 const a = "OK" ++ " IT " ++ "WORKED";
694693 const b = "OK IT WORKED";
......@@ -728,7 +727,6 @@ fn maybe(x: bool) anyerror!?u32 {
728727test "auto created variables have correct alignment" {
729728 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
730729 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
731 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
732730
733731 const S = struct {
734732 fn foo(str: [*]const u8) u32 {
......@@ -893,7 +891,6 @@ test "weird array and tuple initializations" {
893891 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
894892 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
895893 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
896 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
897894
898895 const E = enum { a, b };
899896 const S = struct { e: E };
......@@ -1012,7 +1009,6 @@ comptime {
10121009
10131010test "switch inside @as gets correct type" {
10141011 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1015 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
10161012
10171013 var a: u32 = 0;
10181014 _ = &a;
......@@ -1379,8 +1375,6 @@ test "allocation and looping over 3-byte integer" {
13791375}
13801376
13811377test "loading array from struct is not optimized away" {
1382 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1383
13841378 const S = struct {
13851379 arr: [1]u32 = .{0},
13861380 fn doTheTest(self: *@This()) !void {
test/behavior/eval.zig-1
......@@ -547,7 +547,6 @@ test "static eval list init" {
547547 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
548548 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
549549 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
550 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
551550
552551 try expect(static_vec3.data[2] == 1.0);
553552 try expect(vec3(0.0, 0.0, 3.0).data[2] == 3.0);
test/behavior/fn.zig-1
......@@ -493,7 +493,6 @@ test "using @ptrCast on function pointers" {
493493 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
494494 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
495495 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
496 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
497496
498497 const S = struct {
499498 const A = struct { data: [4]u8 };
test/behavior/for.zig-6
......@@ -69,7 +69,6 @@ test "basic for loop" {
6969 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7070 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7171 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
72 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
7372
7473 const expected_result = [_]u8{ 9, 8, 7, 6, 0, 1, 2, 3 } ** 3;
7574
......@@ -134,7 +133,6 @@ test "for with null and T peer types and inferred result location type" {
134133test "2 break statements and an else" {
135134 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
136135 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
137 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
138136
139137 const S = struct {
140138 fn entry(t: bool, f: bool) !void {
......@@ -183,7 +181,6 @@ fn mangleString(s: []u8) void {
183181test "for copies its payload" {
184182 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
185183 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
186 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
187184
188185 const S = struct {
189186 fn doTheTest() !void {
......@@ -283,7 +280,6 @@ test "two counters" {
283280test "1-based counter and ptr to array" {
284281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
285282 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
286 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
287283
288284 var ok: usize = 0;
289285
......@@ -367,7 +363,6 @@ test "raw pointer and slice" {
367363 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
368364 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
369365 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
370 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
371366
372367 var buf: [10]u8 = undefined;
373368 const slice: []const u8 = "blah";
......@@ -387,7 +382,6 @@ test "raw pointer and counter" {
387382 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
388383 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
389384 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
390 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
391385
392386 var buf: [10]u8 = undefined;
393387 const ptr: [*]u8 = &buf;
test/behavior/lower_strlit_to_vector.zig-1
......@@ -6,7 +6,6 @@ test "strlit to vector" {
66 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
109
1110 const strlit = "0123456789abcdef0123456789ABCDEF";
1211 const vec_from_strlit: @Vector(32, u8) = strlit.*;
test/behavior/pointers.zig-1
......@@ -541,7 +541,6 @@ test "pointer alignment and element type include call expression" {
541541
542542test "pointer to array has explicit alignment" {
543543 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
544 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
545544
546545 const S = struct {
547546 const Base = extern struct { a: u8 };
test/behavior/prefetch.zig-1
......@@ -3,7 +3,6 @@ const std = @import("std");
33
44test "@prefetch()" {
55 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
76
87 var a: [2]u32 = .{ 42, 42 };
98 var a_len = a.len;
test/behavior/sizeof_and_typeof.zig-1
......@@ -272,7 +272,6 @@ test "runtime instructions inside typeof in comptime only scope" {
272272 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
273273 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
274274 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
275 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
276275
277276 {
278277 var y: i8 = 2;
test/behavior/slice.zig-4
......@@ -185,8 +185,6 @@ test "slicing zero length array" {
185185}
186186
187187test "slicing pointer by length" {
188 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
189
190188 const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 };
191189 const ptr: [*]const u8 = @as([*]const u8, @ptrCast(&array));
192190 const slice = ptr[1..][0..5];
......@@ -306,7 +304,6 @@ test "slice type with custom alignment" {
306304
307305test "obtaining a null terminated slice" {
308306 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
309 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
310307
311308 // here we have a normal array
312309 var buf: [50]u8 = undefined;
......@@ -772,7 +769,6 @@ test "slice sentinel access at comptime" {
772769test "slicing array with sentinel as end index" {
773770 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
774771 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
775 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
776772
777773 const S = struct {
778774 fn do() !void {
test/behavior/struct.zig-1
......@@ -348,7 +348,6 @@ test "self-referencing struct via array member" {
348348 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
349349 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
350350 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
351 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
352351
353352 const T = struct {
354353 children: [1]*@This(),