| ... | ... | @@ -652,7 +652,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { |
| 652 | 652 | .field_parent_ptr => @panic("TODO try self.airFieldParentPtr(inst)"), |
| 653 | 653 | |
| 654 | 654 | .switch_br => try self.airSwitch(inst), |
| 655 | | .slice_ptr => @panic("TODO try self.airSlicePtr(inst)"), |
| 655 | .slice_ptr => try self.airSlicePtr(inst), |
| 656 | 656 | .slice_len => try self.airSliceLen(inst), |
| 657 | 657 | |
| 658 | 658 | .ptr_slice_len_ptr => @panic("TODO try self.airPtrSliceLenPtr(inst)"), |
| ... | ... | @@ -2249,6 +2249,25 @@ fn airSliceLen(self: *Self, inst: Air.Inst.Index) !void { |
| 2249 | 2249 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 2250 | 2250 | } |
| 2251 | 2251 | |
| 2252 | fn 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 | |
| 2252 | 2271 | fn airStore(self: *Self, inst: Air.Inst.Index) !void { |
| 2253 | 2272 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 2254 | 2273 | const ptr = try self.resolveInst(bin_op.lhs); |