mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 14:17:59 +00:00
[x32] Emit callq for CALLpcrel32
Summary: In AT&T annotation for both x86_64 and x32 calls should be printed as callq in assembly. It's only a matter of correct mnemonic, object output is ok. Test Plan: trivial test added Reviewers: nadav, dschuff, craig.topper Subscribers: llvm-commits, zinovy.nis Differential Revision: http://reviews.llvm.org/D5213 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217435 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9242b13a4a
commit
586994a74e
@ -53,8 +53,19 @@ void X86ATTInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
|
||||
if (TSFlags & X86II::LOCK)
|
||||
OS << "\tlock\n";
|
||||
|
||||
// Output CALLpcrel32 as "callq" in 64-bit mode.
|
||||
// In Intel annotation it's always emitted as "call".
|
||||
//
|
||||
// TODO: Probably this hack should be redesigned via InstAlias in
|
||||
// InstrInfo.td as soon as Requires clause is supported properly
|
||||
// for InstAlias.
|
||||
if (MI->getOpcode() == X86::CALLpcrel32 &&
|
||||
(getAvailableFeatures() & X86::Mode64Bit) != 0) {
|
||||
OS << "\tcallq\t";
|
||||
printPCRelImm(MI, 0, OS);
|
||||
}
|
||||
// Try to print any aliases first.
|
||||
if (!printAliasInstr(MI, OS))
|
||||
else if (!printAliasInstr(MI, OS))
|
||||
printInstruction(MI, OS);
|
||||
|
||||
// Next always print the annotation.
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define LLVM_LIB_TARGET_X86_INSTPRINTER_X86ATTINSTPRINTER_H
|
||||
|
||||
#include "llvm/MC/MCInstPrinter.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -23,8 +24,11 @@ class MCOperand;
|
||||
class X86ATTInstPrinter final : public MCInstPrinter {
|
||||
public:
|
||||
X86ATTInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
|
||||
const MCRegisterInfo &MRI)
|
||||
: MCInstPrinter(MAI, MII, MRI) {}
|
||||
const MCRegisterInfo &MRI, const MCSubtargetInfo &STI)
|
||||
: MCInstPrinter(MAI, MII, MRI) {
|
||||
// Initialize the set of available features.
|
||||
setAvailableFeatures(STI.getFeatureBits());
|
||||
}
|
||||
|
||||
void printRegName(raw_ostream &OS, unsigned RegNo) const override;
|
||||
void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot) override;
|
||||
|
@ -377,7 +377,7 @@ static MCInstPrinter *createX86MCInstPrinter(const Target &T,
|
||||
const MCRegisterInfo &MRI,
|
||||
const MCSubtargetInfo &STI) {
|
||||
if (SyntaxVariant == 0)
|
||||
return new X86ATTInstPrinter(MAI, MII, MRI);
|
||||
return new X86ATTInstPrinter(MAI, MII, MRI, STI);
|
||||
if (SyntaxVariant == 1)
|
||||
return new X86IntelInstPrinter(MAI, MII, MRI);
|
||||
return nullptr;
|
||||
|
15
test/CodeGen/X86/x86-64-call.ll
Normal file
15
test/CodeGen/X86/x86-64-call.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux -verify-machineinstrs | FileCheck %s
|
||||
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -verify-machineinstrs | FileCheck %s
|
||||
; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux -verify-machineinstrs | FileCheck %s -check-prefix=IA32
|
||||
|
||||
; trivial test for correct call suffix
|
||||
|
||||
define i32 @far() nounwind uwtable {
|
||||
entry:
|
||||
; CHECK: callq
|
||||
; IA32: calll
|
||||
tail call void @foo() nounwind
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare void @foo()
|
Loading…
Reference in New Issue
Block a user