authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2023-04-24 13:23:17+07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-28 16:46:04-07:00
logccc9b8caf632bf97f7765c1b1d7821118cf34008
treed6897bbdce139b6718174ef8665620e9952c1a02
parent75a1360cdd1745ac267c9a25b84ec7ee765d9262

stage2: sparc64: Implement airPtrSliceLenPtr/airPtrSlicePtrPtr stubs


1 files changed, 34 insertions(+), 2 deletions(-)

src/arch/sparc64/CodeGen.zig+34-2
......@@ -667,8 +667,8 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
667667 .slice_ptr => try self.airSlicePtr(inst),
668668 .slice_len => try self.airSliceLen(inst),
669669
670 .ptr_slice_len_ptr => @panic("TODO try self.airPtrSliceLenPtr(inst)"),
671 .ptr_slice_ptr_ptr => @panic("TODO try self.airPtrSlicePtrPtr(inst)"),
670 .ptr_slice_len_ptr => try self.airPtrSliceLenPtr(inst),
671 .ptr_slice_ptr_ptr => try self.airPtrSlicePtrPtr(inst),
672672
673673 .array_elem_val => try self.airArrayElemVal(inst),
674674 .slice_elem_val => try self.airSliceElemVal(inst),
......@@ -2238,6 +2238,38 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {
22382238 return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none });
22392239}
22402240
2241fn airPtrSliceLenPtr(self: *Self, inst: Air.Inst.Index) !void {
2242 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2243 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
2244 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
2245 const ptr_bytes = @divExact(ptr_bits, 8);
2246 const mcv = try self.resolveInst(ty_op.operand);
2247 switch (mcv) {
2248 .dead, .unreach, .none => unreachable,
2249 .ptr_stack_offset => |off| {
2250 break :result MCValue{ .ptr_stack_offset = off - ptr_bytes };
2251 },
2252 else => return self.fail("TODO implement ptr_slice_len_ptr for {}", .{mcv}),
2253 }
2254 };
2255 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
2256}
2257
2258fn airPtrSlicePtrPtr(self: *Self, inst: Air.Inst.Index) !void {
2259 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2260 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
2261 const mcv = try self.resolveInst(ty_op.operand);
2262 switch (mcv) {
2263 .dead, .unreach, .none => unreachable,
2264 .ptr_stack_offset => |off| {
2265 break :result MCValue{ .ptr_stack_offset = off };
2266 },
2267 else => return self.fail("TODO implement ptr_slice_len_ptr for {}", .{mcv}),
2268 }
2269 };
2270 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
2271}
2272
22412273fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void {
22422274 const un_op = self.air.instructions.items(.data)[inst].un_op;
22432275 const result = try self.resolveInst(un_op);