diff options
| author | David Rubin <daviru007@icloud.com> | 2024-05-12 11:01:23 -0700 |
|---|---|---|
| committer | David Rubin <daviru007@icloud.com> | 2024-06-13 02:22:04 -0700 |
| commit | b67995689df424a0cab9186fcaf7b09bb04ffc1a (patch) | |
| tree | f5a860913a7133af62a18339a3f437c4c5dbb67b /src | |
| parent | b2cb090c3790dd10a784f9e291230cf6052b514c (diff) | |
| download | zig-b67995689df424a0cab9186fcaf7b09bb04ffc1a.tar.gz zig-b67995689df424a0cab9186fcaf7b09bb04ffc1a.zip | |
riscv: add `airAggregateInit` for arrays
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/riscv64/CodeGen.zig | 27 |
1 files changed, 23 insertions, 4 deletions
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)}), } }; |
