From b67995689df424a0cab9186fcaf7b09bb04ffc1a Mon Sep 17 00:00:00 2001 From: David Rubin Date: Sun, 12 May 2024 11:01:23 -0700 Subject: riscv: add `airAggregateInit` for arrays --- src/arch/riscv64/CodeGen.zig | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig index 7b44bcfc7c..71489c0eb6 100644 --- a/src/arch/riscv64/CodeGen.zig +++ b/src/arch/riscv64/CodeGen.zig @@ -3207,10 +3207,6 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void { const offset_reg_lock = self.register_manager.lockRegAssumeUnused(offset_reg); defer self.register_manager.unlockReg(offset_reg_lock); - if (true) return self.fail("TODO: airPtrElemPtr", .{}); - - // TODO: something is breaking here dunno - break :result try self.binOp(.ptr_add, base_ptr_mcv, base_ptr_ty, .{ .register = offset_reg }, base_ptr_ty); }; return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none }); @@ -5864,6 +5860,29 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void { } break :result .{ .load_frame = .{ .index = frame_index } }; }, + .Array => { + const elem_ty = result_ty.childType(zcu); + const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, zcu)); + const elem_size: u32 = @intCast(elem_ty.abiSize(zcu)); + + for (elements, 0..) |elem, elem_i| { + const elem_mcv = try self.resolveInst(elem); + const elem_off: i32 = @intCast(elem_size * elem_i); + try self.genSetMem( + .{ .frame = frame_index }, + elem_off, + elem_ty, + elem_mcv, + ); + } + if (result_ty.sentinel(zcu)) |sentinel| try self.genSetMem( + .{ .frame = frame_index }, + @intCast(elem_size * elements.len), + elem_ty, + try self.genTypedValue(sentinel), + ); + break :result .{ .load_frame = .{ .index = frame_index } }; + }, else => return self.fail("TODO: airAggregate {}", .{result_ty.fmt(zcu)}), } }; -- cgit v1.2.3