| ... | @@ -1826,10 +1826,10 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -1826,10 +1826,10 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void { |
| 1826 | try self.register_manager.getReg(reg, null); | 1826 | try self.register_manager.getReg(reg, null); |
| 1827 | try self.genSetReg(arg_ty, reg, arg_mcv); | 1827 | try self.genSetReg(arg_ty, reg, arg_mcv); |
| 1828 | }, | 1828 | }, |
| 1829 | .stack_offset => { | 1829 | .stack_offset => |off| { |
| 1830 | // Here we need to emit instructions like this: | 1830 | // Here we need to emit instructions like this: |
| 1831 | // mov qword ptr [rsp + stack_offset], x | 1831 | // mov qword ptr [rsp + stack_offset], x |
| 1832 | return self.fail("TODO implement calling with parameters in memory", .{}); | 1832 | try self.genSetStack(arg_ty, off, arg_mcv); |
| 1833 | }, | 1833 | }, |
| 1834 | .ptr_stack_offset => { | 1834 | .ptr_stack_offset => { |
| 1835 | return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{}); | 1835 | return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{}); |
| ... | @@ -1987,9 +1987,10 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -1987,9 +1987,10 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void { |
| 1987 | fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { | 1987 | fn airRetLoad(self: *Self, inst: Air.Inst.Index) !void { |
| 1988 | const un_op = self.air.instructions.items(.data)[inst].un_op; | 1988 | const un_op = self.air.instructions.items(.data)[inst].un_op; |
| 1989 | const ptr = try self.resolveInst(un_op); | 1989 | const ptr = try self.resolveInst(un_op); |
| 1990 | _ = ptr; | 1990 | // we can reuse self.ret_mcv because it just gets returned |
| 1991 | return self.fail("TODO implement airRetLoad for {}", .{self.target.cpu.arch}); | 1991 | try self.load(self.ret_mcv, ptr, self.air.typeOf(un_op)); |
| 1992 | //return self.finishAir(inst, .dead, .{ un_op, .none, .none }); | 1992 | try self.ret(self.ret_mcv); |
| | 1993 | return self.finishAir(inst, .dead, .{ un_op, .none, .none }); |
| 1993 | } | 1994 | } |
| 1994 | | 1995 | |
| 1995 | fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { | 1996 | fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| ... | @@ -2487,8 +2488,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2487,8 +2488,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { |
| 2487 | const clobbers_len = @truncate(u5, extended.small >> 10); | 2488 | const clobbers_len = @truncate(u5, extended.small >> 10); |
| 2488 | _ = clobbers_len; // TODO honor these | 2489 | _ = clobbers_len; // TODO honor these |
| 2489 | const is_volatile = @truncate(u1, extended.small >> 15) != 0; | 2490 | const is_volatile = @truncate(u1, extended.small >> 15) != 0; |
| 2490 | const outputs = @bitCast([]const Air.Inst.Ref, self.air.extra[air_extra.end..][0..outputs_len]); | 2491 | const args = @bitCast([]const Air.Inst.Ref, self.air.extra[air_extra.end..][0..args_len]); |
| 2491 | const args = @bitCast([]const Air.Inst.Ref, self.air.extra[air_extra.end + outputs.len ..][0..args_len]); | | |
| 2492 | | 2492 | |
| 2493 | if (outputs_len > 1) { | 2493 | if (outputs_len > 1) { |
| 2494 | return self.fail("TODO implement codegen for asm with more than 1 output", .{}); | 2494 | return self.fail("TODO implement codegen for asm with more than 1 output", .{}); |
| ... | @@ -2591,16 +2591,12 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2591,16 +2591,12 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { |
| 2591 | break :result MCValue{ .none = {} }; | 2591 | break :result MCValue{ .none = {} }; |
| 2592 | } | 2592 | } |
| 2593 | }; | 2593 | }; |
| 2594 | if (outputs.len + args.len <= Liveness.bpi - 1) { | 2594 | if (args.len <= Liveness.bpi - 1) { |
| 2595 | var buf = [1]Air.Inst.Ref{.none} ** (Liveness.bpi - 1); | 2595 | var buf = [1]Air.Inst.Ref{.none} ** (Liveness.bpi - 1); |
| 2596 | std.mem.copy(Air.Inst.Ref, &buf, outputs); | 2596 | std.mem.copy(Air.Inst.Ref, &buf, args); |
| 2597 | std.mem.copy(Air.Inst.Ref, buf[outputs.len..], args); | | |
| 2598 | return self.finishAir(inst, result, buf); | 2597 | return self.finishAir(inst, result, buf); |
| 2599 | } | 2598 | } |
| 2600 | var bt = try self.iterateBigTomb(inst, outputs.len + args.len); | 2599 | var bt = try self.iterateBigTomb(inst, args.len); |
| 2601 | for (outputs) |output| { | | |
| 2602 | bt.feed(output); | | |
| 2603 | } | | |
| 2604 | for (args) |arg| { | 2600 | for (args) |arg| { |
| 2605 | bt.feed(arg); | 2601 | bt.feed(arg); |
| 2606 | } | 2602 | } |
| ... | @@ -3297,7 +3293,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { | ... | @@ -3297,7 +3293,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues { |
| 3297 | const param_size = @intCast(u32, ty.abiSize(self.target.*)); | 3293 | const param_size = @intCast(u32, ty.abiSize(self.target.*)); |
| 3298 | const pass_in_reg = switch (ty.zigTypeTag()) { | 3294 | const pass_in_reg = switch (ty.zigTypeTag()) { |
| 3299 | .Bool => true, | 3295 | .Bool => true, |
| 3300 | .Int => param_size <= 8, | 3296 | .Int, .Enum => param_size <= 8, |
| 3301 | .Pointer => ty.ptrSize() != .Slice, | 3297 | .Pointer => ty.ptrSize() != .Slice, |
| 3302 | .Optional => ty.isPtrLikeOptional(), | 3298 | .Optional => ty.isPtrLikeOptional(), |
| 3303 | else => false, | 3299 | else => false, |