| ... | @@ -667,8 +667,8 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -667,8 +667,8 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { |
| 667 | .slice_ptr => try self.airSlicePtr(inst), | 667 | .slice_ptr => try self.airSlicePtr(inst), |
| 668 | .slice_len => try self.airSliceLen(inst), | 668 | .slice_len => try self.airSliceLen(inst), |
| 669 | | 669 | |
| 670 | .ptr_slice_len_ptr => @panic("TODO try self.airPtrSliceLenPtr(inst)"), | 670 | .ptr_slice_len_ptr => try self.airPtrSliceLenPtr(inst), |
| 671 | .ptr_slice_ptr_ptr => @panic("TODO try self.airPtrSlicePtrPtr(inst)"), | 671 | .ptr_slice_ptr_ptr => try self.airPtrSlicePtrPtr(inst), |
| 672 | | 672 | |
| 673 | .array_elem_val => try self.airArrayElemVal(inst), | 673 | .array_elem_val => try self.airArrayElemVal(inst), |
| 674 | .slice_elem_val => try self.airSliceElemVal(inst), | 674 | .slice_elem_val => try self.airSliceElemVal(inst), |
| ... | @@ -2238,6 +2238,38 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2238,6 +2238,38 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void { |
| 2238 | return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none }); | 2238 | return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none }); |
| 2239 | } | 2239 | } |
| 2240 | | 2240 | |
| | 2241 | fn 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 | |
| | 2258 | fn 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 | |
| 2241 | fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void { | 2273 | fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void { |
| 2242 | const un_op = self.air.instructions.items(.data)[inst].un_op; | 2274 | const un_op = self.air.instructions.items(.data)[inst].un_op; |
| 2243 | const result = try self.resolveInst(un_op); | 2275 | const result = try self.resolveInst(un_op); |