| ... | @@ -2568,7 +2568,7 @@ fn airFptrunc(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2568,7 +2568,7 @@ fn airFptrunc(self: *Self, inst: Air.Inst.Index) !void { |
| 2568 | 80, 128 => true, | 2568 | 80, 128 => true, |
| 2569 | else => unreachable, | 2569 | else => unreachable, |
| 2570 | }, | 2570 | }, |
| 2571 | 80 => switch (dst_bits) { | 2571 | 80 => switch (src_bits) { |
| 2572 | 128 => true, | 2572 | 128 => true, |
| 2573 | else => unreachable, | 2573 | else => unreachable, |
| 2574 | }, | 2574 | }, |
| ... | @@ -10278,6 +10278,8 @@ fn moveStrategy(self: *Self, ty: Type, aligned: bool) !MoveStrategy { | ... | @@ -10278,6 +10278,8 @@ fn moveStrategy(self: *Self, ty: Type, aligned: bool) !MoveStrategy { |
| 10278 | } | 10278 | } |
| 10279 | | 10279 | |
| 10280 | fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError!void { | 10280 | fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError!void { |
| | 10281 | const mod = self.bin_file.options.module.?; |
| | 10282 | |
| 10281 | const src_lock = if (src_mcv.getReg()) |reg| self.register_manager.lockReg(reg) else null; | 10283 | const src_lock = if (src_mcv.getReg()) |reg| self.register_manager.lockReg(reg) else null; |
| 10282 | defer if (src_lock) |lock| self.register_manager.unlockReg(lock); | 10284 | defer if (src_lock) |lock| self.register_manager.unlockReg(lock); |
| 10283 | | 10285 | |
| ... | @@ -10315,18 +10317,31 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError | ... | @@ -10315,18 +10317,31 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError |
| 10315 | .off = -dst_reg_off.off, | 10317 | .off = -dst_reg_off.off, |
| 10316 | } }, | 10318 | } }, |
| 10317 | }), | 10319 | }), |
| 10318 | .register_pair => |dst_regs| for (dst_regs, 0..) |dst_reg, dst_reg_i| switch (src_mcv) { | 10320 | .register_pair => |dst_regs| { |
| 10319 | .register_pair => |src_regs| try self.genSetReg( | 10321 | switch (src_mcv) { |
| 10320 | dst_reg, | 10322 | .air_ref => |src_ref| return self.genCopy(ty, dst_mcv, try self.resolveInst(src_ref)), |
| 10321 | Type.usize, | 10323 | else => {}, |
| 10322 | .{ .register = src_regs[dst_reg_i] }, | 10324 | } |
| 10323 | ), | 10325 | const classes = mem.sliceTo(&abi.classifySystemV(ty, mod, .other), .none); |
| 10324 | else => try self.genSetReg( | 10326 | for (dst_regs, classes, 0..) |dst_reg, class, dst_reg_i| { |
| 10325 | dst_reg, | 10327 | const class_ty = switch (class) { |
| 10326 | Type.usize, | 10328 | .integer => Type.usize, |
| 10327 | src_mcv.address().offset(@intCast(dst_reg_i * 8)).deref(), | 10329 | .sse => Type.f64, |
| 10328 | ), | 10330 | else => unreachable, |
| 10329 | .air_ref => |src_ref| return self.genCopy(ty, dst_mcv, try self.resolveInst(src_ref)), | 10331 | }; |
| | 10332 | switch (src_mcv) { |
| | 10333 | .register_pair => |src_regs| try self.genSetReg( |
| | 10334 | dst_reg, |
| | 10335 | class_ty, |
| | 10336 | .{ .register = src_regs[dst_reg_i] }, |
| | 10337 | ), |
| | 10338 | else => try self.genSetReg( |
| | 10339 | dst_reg, |
| | 10340 | class_ty, |
| | 10341 | src_mcv.address().offset(@intCast(dst_reg_i * 8)).deref(), |
| | 10342 | ), |
| | 10343 | } |
| | 10344 | } |
| 10330 | }, | 10345 | }, |
| 10331 | .indirect => |reg_off| try self.genSetMem(.{ .reg = reg_off.reg }, reg_off.off, ty, src_mcv), | 10346 | .indirect => |reg_off| try self.genSetMem(.{ .reg = reg_off.reg }, reg_off.off, ty, src_mcv), |
| 10332 | .memory, .load_direct, .load_got, .load_tlv => { | 10347 | .memory, .load_direct, .load_got, .load_tlv => { |
| ... | @@ -12566,7 +12581,7 @@ fn resolveCallingConventionValues( | ... | @@ -12566,7 +12581,7 @@ fn resolveCallingConventionValues( |
| 12566 | | 12581 | |
| 12567 | const classes = switch (resolved_cc) { | 12582 | const classes = switch (resolved_cc) { |
| 12568 | .SysV => mem.sliceTo(&abi.classifySystemV(ret_ty, mod, .ret), .none), | 12583 | .SysV => mem.sliceTo(&abi.classifySystemV(ret_ty, mod, .ret), .none), |
| 12569 | .Win64 => &[1]abi.Class{abi.classifyWindows(ret_ty, mod)}, | 12584 | .Win64 => &.{abi.classifyWindows(ret_ty, mod)}, |
| 12570 | else => unreachable, | 12585 | else => unreachable, |
| 12571 | }; | 12586 | }; |
| 12572 | for (classes) |class| switch (class) { | 12587 | for (classes) |class| switch (class) { |
| ... | @@ -12639,9 +12654,10 @@ fn resolveCallingConventionValues( | ... | @@ -12639,9 +12654,10 @@ fn resolveCallingConventionValues( |
| 12639 | var arg_mcv: [2]MCValue = undefined; | 12654 | var arg_mcv: [2]MCValue = undefined; |
| 12640 | var arg_mcv_i: usize = 0; | 12655 | var arg_mcv_i: usize = 0; |
| 12641 | | 12656 | |
| 12642 | const classes = switch (self.target.os.tag) { | 12657 | const classes = switch (resolved_cc) { |
| 12643 | .windows => &[1]abi.Class{abi.classifyWindows(ty, mod)}, | 12658 | .SysV => mem.sliceTo(&abi.classifySystemV(ty, mod, .arg), .none), |
| 12644 | else => mem.sliceTo(&abi.classifySystemV(ty, mod, .arg), .none), | 12659 | .Win64 => &.{abi.classifyWindows(ty, mod)}, |
| | 12660 | else => unreachable, |
| 12645 | }; | 12661 | }; |
| 12646 | for (classes) |class| switch (class) { | 12662 | for (classes) |class| switch (class) { |
| 12647 | .integer => { | 12663 | .integer => { |