| ... | ... | @@ -2114,23 +2114,39 @@ fn store(self: *Self, pointer: MCValue, value: MCValue, ptr_ty: Type, value_ty: |
| 2114 | 2114 | fn airStructFieldPtr(self: *Self, inst: Air.Inst.Index) !void { |
| 2115 | 2115 | const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl; |
| 2116 | 2116 | const extra = self.air.extraData(Air.StructField, ty_pl.payload).data; |
| 2117 | | const result = try self.structFieldPtr(inst, extra.struct_operand, ty_pl.ty, extra.field_index); |
| 2117 | const result = try self.structFieldPtr(inst, extra.struct_operand, extra.field_index); |
| 2118 | 2118 | return self.finishAir(inst, result, .{ extra.struct_operand, .none, .none }); |
| 2119 | 2119 | } |
| 2120 | 2120 | |
| 2121 | 2121 | fn airStructFieldPtrIndex(self: *Self, inst: Air.Inst.Index, index: u8) !void { |
| 2122 | 2122 | const ty_op = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_op; |
| 2123 | | const result = try self.structFieldPtr(inst, ty_op.operand, ty_op.ty, index); |
| 2123 | const result = try self.structFieldPtr(inst, ty_op.operand, index); |
| 2124 | 2124 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 2125 | 2125 | } |
| 2126 | 2126 | |
| 2127 | | fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, ty: Air.Inst.Ref, index: u32) !MCValue { |
| 2128 | | _ = inst; |
| 2129 | | _ = operand; |
| 2130 | | _ = ty; |
| 2131 | | _ = index; |
| 2127 | fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, index: u32) !MCValue { |
| 2128 | const mod = self.bin_file.comp.module.?; |
| 2129 | const ptr_field_ty = self.typeOfIndex(inst); |
| 2130 | const ptr_container_ty = self.typeOf(operand); |
| 2131 | const ptr_container_ty_info = ptr_container_ty.ptrInfo(mod); |
| 2132 | const container_ty = ptr_container_ty.childType(mod); |
| 2133 | |
| 2134 | const field_offset: i32 = if (mod.typeToPackedStruct(container_ty)) |struct_obj| |
| 2135 | if (ptr_field_ty.ptrInfo(mod).packed_offset.host_size == 0) |
| 2136 | @divExact(mod.structPackedFieldBitOffset(struct_obj, index) + |
| 2137 | ptr_container_ty_info.packed_offset.bit_offset, 8) |
| 2138 | else |
| 2139 | 0 |
| 2140 | else |
| 2141 | @intCast(container_ty.structFieldOffset(index, mod)); |
| 2132 | 2142 | |
| 2133 | | return self.fail("TODO: structFieldPtr", .{}); |
| 2143 | const src_mcv = try self.resolveInst(operand); |
| 2144 | const dst_mcv = if (switch (src_mcv) { |
| 2145 | .immediate, .ptr_stack_offset => true, |
| 2146 | .register, .register_offset => self.reuseOperand(inst, operand, 0, src_mcv), |
| 2147 | else => false, |
| 2148 | }) src_mcv else try self.copyToNewRegister(inst, src_mcv); |
| 2149 | return dst_mcv.offset(field_offset); |
| 2134 | 2150 | } |
| 2135 | 2151 | |
| 2136 | 2152 | fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { |
| ... | ... | @@ -2402,6 +2418,8 @@ fn genCall( |
| 2402 | 2418 | } |
| 2403 | 2419 | |
| 2404 | 2420 | fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void { |
| 2421 | const mod = self.bin_file.comp.module.?; |
| 2422 | |
| 2405 | 2423 | if (safety) { |
| 2406 | 2424 | // safe |
| 2407 | 2425 | } else { |
| ... | ... | @@ -2416,17 +2434,15 @@ fn airRet(self: *Self, inst: Air.Inst.Index, safety: bool) !void { |
| 2416 | 2434 | .data = .{ .nop = {} }, |
| 2417 | 2435 | }); |
| 2418 | 2436 | |
| 2419 | | try self.ret(operand); |
| 2437 | const ret_ty = self.fn_type.fnReturnType(mod); |
| 2438 | try self.genCopy(ret_ty, self.ret_mcv, operand); |
| 2439 | |
| 2440 | try self.ret(); |
| 2420 | 2441 | |
| 2421 | 2442 | return self.finishAir(inst, .dead, .{ un_op, .none, .none }); |
| 2422 | 2443 | } |
| 2423 | 2444 | |
| 2424 | | fn ret(self: *Self, mcv: MCValue) !void { |
| 2425 | | const mod = self.bin_file.comp.module.?; |
| 2426 | | |
| 2427 | | const ret_ty = self.fn_type.fnReturnType(mod); |
| 2428 | | try self.genCopy(ret_ty, self.ret_mcv, mcv); |
| 2429 | | |
| 2445 | fn ret(self: *Self) !void { |
| 2430 | 2446 | _ = try self.addInst(.{ |
| 2431 | 2447 | .tag = .psuedo_epilogue, |
| 2432 | 2448 | .data = .{ .nop = {} }, |
| ... | ... | @@ -2444,9 +2460,13 @@ fn ret(self: *Self, mcv: MCValue) !void { |
| 2444 | 2460 | fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { |
| 2445 | 2461 | const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op; |
| 2446 | 2462 | const ptr = try self.resolveInst(un_op); |
| 2447 | | _ = ptr; |
| 2448 | | return self.fail("TODO implement airRetLoad for {}", .{self.target.cpu.arch}); |
| 2449 | | //return self.finishAir(inst, .dead, .{ un_op, .none, .none }); |
| 2463 | const ptr_ty = self.typeOf(un_op); |
| 2464 | |
| 2465 | try self.load(self.ret_mcv, ptr, ptr_ty); |
| 2466 | |
| 2467 | try self.ret(); |
| 2468 | |
| 2469 | return self.finishAir(inst, .dead, .{ un_op, .none, .none }); |
| 2450 | 2470 | } |
| 2451 | 2471 | |
| 2452 | 2472 | fn airCmp(self: *Self, inst: Air.Inst.Index) !void { |
| ... | ... | @@ -3790,7 +3810,6 @@ fn resolveInst(self: *Self, inst: Air.Inst.Ref) InnerError!MCValue { |
| 3790 | 3810 | return MCValue{ .none = {} }; |
| 3791 | 3811 | |
| 3792 | 3812 | const inst_index = inst.toIndex() orelse return self.genTypedValue((try self.air.value(inst, mod)).?); |
| 3793 | | |
| 3794 | 3813 | return self.getResolvedInstValue(inst_index); |
| 3795 | 3814 | } |
| 3796 | 3815 | |