mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-01 00:25:01 +00:00
More fixes for win64:
- Do not clobber al during variadic calls, this is AMD64 ABI-only feature - Emit wincall64, where necessary Patch by Cameron Esfahani! llvm-svn: 111289
This commit is contained in:
parent
f1f88db4fd
commit
f0600e9e8a
@ -776,7 +776,8 @@ void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI,
|
||||
}
|
||||
|
||||
assert(MO.isImm() && "Unknown RawFrm operand!");
|
||||
if (Opcode == X86::CALLpcrel32 || Opcode == X86::CALL64pcrel32) {
|
||||
if (Opcode == X86::CALLpcrel32 || Opcode == X86::CALL64pcrel32 ||
|
||||
Opcode == X86::WINCALL64pcrel32) {
|
||||
// Fix up immediate operand for pc relative calls.
|
||||
intptr_t Imm = (intptr_t)MO.getImm();
|
||||
Imm = Imm - MCE.getCurrentPCValue() - 4;
|
||||
|
@ -2230,8 +2230,8 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
|
||||
if (!isTailCall && Subtarget->isPICStyleGOT())
|
||||
Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy()));
|
||||
|
||||
// Add an implicit use of AL for x86 vararg functions.
|
||||
if (Is64Bit && isVarArg)
|
||||
// Add an implicit use of AL for non-Windows x86 64-bit vararg functions.
|
||||
if (Is64Bit && isVarArg && !Subtarget->isTargetWin64())
|
||||
Ops.push_back(DAG.getRegister(X86::AL, MVT::i8));
|
||||
|
||||
if (InFlag.getNode())
|
||||
@ -8832,6 +8832,7 @@ X86TargetLowering::EmitLoweredTLSCall(MachineInstr *MI,
|
||||
= static_cast<const X86InstrInfo*>(getTargetMachine().getInstrInfo());
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
MachineFunction *F = BB->getParent();
|
||||
bool IsWin64 = Subtarget->isTargetWin64();
|
||||
|
||||
assert(MI->getOperand(3).isGlobal() && "This should be a global");
|
||||
|
||||
@ -8843,7 +8844,7 @@ X86TargetLowering::EmitLoweredTLSCall(MachineInstr *MI,
|
||||
.addGlobalAddress(MI->getOperand(3).getGlobal(), 0,
|
||||
MI->getOperand(3).getTargetFlags())
|
||||
.addReg(0);
|
||||
MIB = BuildMI(*BB, MI, DL, TII->get(X86::CALL64m));
|
||||
MIB = BuildMI(*BB, MI, DL, TII->get(IsWin64 ? X86::WINCALL64m : X86::CALL64m));
|
||||
addDirectMem(MIB, X86::RDI);
|
||||
} else if (getTargetMachine().getRelocationModel() != Reloc::PIC_) {
|
||||
MachineInstrBuilder MIB = BuildMI(*BB, MI, DL,
|
||||
|
@ -401,12 +401,14 @@ void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
|
||||
LowerUnaryToTwoAddr(OutMI, X86::XOR32rr); // MOV32r0 -> XOR32rr
|
||||
break;
|
||||
|
||||
// TAILJMPr64, CALL64r, CALL64pcrel32 - These instructions have
|
||||
// TAILJMPr64, [WIN]CALL64r, [WIN]CALL64pcrel32 - These instructions have
|
||||
// register inputs modeled as normal uses instead of implicit uses. As such,
|
||||
// truncate off all but the first operand (the callee). FIXME: Change isel.
|
||||
case X86::TAILJMPr64:
|
||||
case X86::CALL64r:
|
||||
case X86::CALL64pcrel32: {
|
||||
case X86::CALL64pcrel32:
|
||||
case X86::WINCALL64r:
|
||||
case X86::WINCALL64pcrel32: {
|
||||
unsigned Opcode = OutMI.getOpcode();
|
||||
MCOperand Saved = OutMI.getOperand(0);
|
||||
OutMI = MCInst();
|
||||
|
Loading…
Reference in New Issue
Block a user