Skip to content

Commit 26116ab

Browse files
committed
Merge 80370 from mainline.
Short-term workaround for frame-related weirdness on win64. Some other minor win64 fixes as well. llvm-svn: 81690
1 parent 520e9ab commit 26116ab

File tree

3 files changed

+6
-4
lines changed

3 files changed

+6
-4
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,6 +2037,7 @@ bool X86InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
20372037
if (MI != MBB.end()) DL = MI->getDebugLoc();
20382038

20392039
bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
2040+
bool isWin64 = TM.getSubtarget<X86Subtarget>().isTargetWin64();
20402041
unsigned SlotSize = is64Bit ? 8 : 4;
20412042

20422043
MachineFunction &MF = *MBB.getParent();
@@ -2053,7 +2054,7 @@ bool X86InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
20532054
if (Reg == FPReg)
20542055
// X86RegisterInfo::emitPrologue will handle spilling of frame register.
20552056
continue;
2056-
if (RegClass != &X86::VR128RegClass) {
2057+
if (RegClass != &X86::VR128RegClass && !isWin64) {
20572058
CalleeFrameSize += SlotSize;
20582059
BuildMI(MBB, MI, DL, get(Opc)).addReg(Reg, RegState::Kill);
20592060
} else {
@@ -2077,14 +2078,15 @@ bool X86InstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
20772078
MachineFunction &MF = *MBB.getParent();
20782079
unsigned FPReg = RI.getFrameRegister(MF);
20792080
bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
2081+
bool isWin64 = TM.getSubtarget<X86Subtarget>().isTargetWin64();
20802082
unsigned Opc = is64Bit ? X86::POP64r : X86::POP32r;
20812083
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
20822084
unsigned Reg = CSI[i].getReg();
20832085
if (Reg == FPReg)
20842086
// X86RegisterInfo::emitEpilogue will handle restoring of frame register.
20852087
continue;
20862088
const TargetRegisterClass *RegClass = CSI[i].getRegClass();
2087-
if (RegClass != &X86::VR128RegClass) {
2089+
if (RegClass != &X86::VR128RegClass && !isWin64) {
20882090
BuildMI(MBB, MI, DL, get(Opc), Reg);
20892091
} else {
20902092
loadRegFromStackSlot(MBB, MI, Reg, CSI[i].getFrameIdx(), RegClass);

llvm/lib/Target/X86/X86JITInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
using namespace llvm;
2525

2626
// Determine the platform we're running on
27-
#if defined (__x86_64__) || defined (_M_AMD64)
27+
#if defined (__x86_64__) || defined (_M_AMD64) || defined (_M_X64)
2828
# define X86_64_JIT
2929
#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
3030
# define X86_32_JIT

llvm/lib/Target/X86/X86Subtarget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ unsigned X86Subtarget::getSpecialAddressLatency() const {
160160
/// specified arguments. If we can't run cpuid on the host, return true.
161161
bool X86::GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,
162162
unsigned *rECX, unsigned *rEDX) {
163-
#if defined(__x86_64__) || defined(_M_AMD64)
163+
#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
164164
#if defined(__GNUC__)
165165
// gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
166166
asm ("movq\t%%rbx, %%rsi\n\t"

0 commit comments

Comments
 (0)