authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-07-23 21:46:39+07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-09-14 16:58:13-07:00
log86dc982e74dd17633d2bdc0f5ba8e36c55f78053
tree7523ab6cb09ccc1d171c5014eeb324809261bde2
parented546a7aada0b7f54ea37693c47a39064e1cc1b2

stage2: sparc64: Implement airSlicePtr


1 files changed, 20 insertions(+), 1 deletions(-)

src/arch/sparc64/CodeGen.zig+20-1
......@@ -652,7 +652,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
652652 .field_parent_ptr => @panic("TODO try self.airFieldParentPtr(inst)"),
653653
654654 .switch_br => try self.airSwitch(inst),
655 .slice_ptr => @panic("TODO try self.airSlicePtr(inst)"),
655 .slice_ptr => try self.airSlicePtr(inst),
656656 .slice_len => try self.airSliceLen(inst),
657657
658658 .ptr_slice_len_ptr => @panic("TODO try self.airPtrSliceLenPtr(inst)"),
......@@ -2249,6 +2249,25 @@ fn airSliceLen(self: *Self, inst: Air.Inst.Index) !void {
22492249 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
22502250}
22512251
2252fn airSlicePtr(self: *Self, inst: Air.Inst.Index) !void {
2253 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2254 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
2255 const mcv = try self.resolveInst(ty_op.operand);
2256 switch (mcv) {
2257 .dead, .unreach, .none => unreachable,
2258 .register => unreachable, // a slice doesn't fit in one register
2259 .stack_offset => |off| {
2260 break :result MCValue{ .stack_offset = off };
2261 },
2262 .memory => |addr| {
2263 break :result MCValue{ .memory = addr };
2264 },
2265 else => return self.fail("TODO implement slice_len for {}", .{mcv}),
2266 }
2267 };
2268 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
2269}
2270
22522271fn airStore(self: *Self, inst: Air.Inst.Index) !void {
22532272 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
22542273 const ptr = try self.resolveInst(bin_op.lhs);