LLVM  6.0.0svn
Macros | Functions
X86MCInstLower.cpp File Reference
#include "InstPrinter/X86ATTInstPrinter.h"
#include "InstPrinter/X86InstComments.h"
#include "MCTargetDesc/X86BaseInfo.h"
#include "MCTargetDesc/X86TargetStreamer.h"
#include "Utils/X86ShuffleDecode.h"
#include "X86AsmPrinter.h"
#include "X86RegisterInfo.h"
#include "X86ShuffleDecodeConstantPool.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/StackMaps.h"
#include "llvm/CodeGen/TargetLoweringObjectFile.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/Mangler.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCFixup.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCInstBuilder.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCSymbolELF.h"
#include "llvm/Support/TargetRegistry.h"
Include dependency graph for X86MCInstLower.cpp:

Go to the source code of this file.

Macros

#define MOV_CASE(Prefix, Suffix)
 
#define MOV_AVX512_CASE(Suffix)
 
#define CASE_ALL_MOV_RM()
 

Functions

static void EmitNops (MCStreamer &OS, unsigned NumBytes, bool Is64Bit, const MCSubtargetInfo &STI)
 Emit the optimal amount of multi-byte nops on X86. More...
 
static void SimplifyShortImmForm (MCInst &Inst, unsigned Opcode)
 Simplify FOO $imm, %{al,ax,eax,rax} to FOO $imm, for instruction with a short fixed-register form. More...
 
static void SimplifyMOVSX (MCInst &Inst)
 If a movsx instruction has a shorter encoding for the used register simplify the instruction to use it instead. More...
 
static void SimplifyShortMoveForm (X86AsmPrinter &Printer, MCInst &Inst, unsigned Opcode)
 Simplify things like MOV32rm to MOV32o32a. More...
 
static unsigned getRetOpcode (const X86Subtarget &Subtarget)
 
static unsigned EmitNop (MCStreamer &OS, unsigned NumBytes, bool Is64Bit, const MCSubtargetInfo &STI)
 Emit the largest nop instruction smaller than or equal to NumBytes bytes. More...
 
static MachineBasicBlock::const_iterator PrevCrossBBInst (MachineBasicBlock::const_iterator MBBI)
 
static const ConstantgetConstantFromPool (const MachineInstr &MI, const MachineOperand &Op)
 
static std::string getShuffleComment (const MachineInstr *MI, unsigned SrcOp1Idx, unsigned SrcOp2Idx, ArrayRef< int > Mask)
 
static void printConstant (const Constant *COp, raw_ostream &CS)
 

Macro Definition Documentation

◆ CASE_ALL_MOV_RM

#define CASE_ALL_MOV_RM ( )
Value:
MOV_CASE(, ) /* SSE */ \
MOV_CASE(V, ) /* AVX-128 */ \
MOV_CASE(V, Y) /* AVX-256 */ \
MOV_AVX512_CASE(Z) \
MOV_AVX512_CASE(Z256) \
MOV_AVX512_CASE(Z128)
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define MOV_CASE(Prefix, Suffix)

Referenced by llvm::X86AsmPrinter::EmitInstruction().

◆ MOV_AVX512_CASE

#define MOV_AVX512_CASE (   Suffix)
Value:
case X86::VMOVDQA64##Suffix##rm: \
case X86::VMOVDQA32##Suffix##rm: \
case X86::VMOVDQU64##Suffix##rm: \
case X86::VMOVDQU32##Suffix##rm: \
case X86::VMOVDQU16##Suffix##rm: \
case X86::VMOVDQU8##Suffix##rm: \
case X86::VMOVAPS##Suffix##rm: \
case X86::VMOVAPD##Suffix##rm: \
case X86::VMOVUPS##Suffix##rm: \
case X86::VMOVUPD##Suffix##rm:

◆ MOV_CASE

#define MOV_CASE (   Prefix,
  Suffix 
)
Value:
case X86::Prefix##MOVAPD##Suffix##rm: \
case X86::Prefix##MOVAPS##Suffix##rm: \
case X86::Prefix##MOVUPD##Suffix##rm: \
case X86::Prefix##MOVUPS##Suffix##rm: \
case X86::Prefix##MOVDQA##Suffix##rm: \
case X86::Prefix##MOVDQU##Suffix##rm:

Function Documentation

◆ EmitNop()

static unsigned EmitNop ( MCStreamer OS,
unsigned  NumBytes,
bool  Is64Bit,
const MCSubtargetInfo STI 
)
static

Emit the largest nop instruction smaller than or equal to NumBytes bytes.

Return the size of nop emitted.

Definition at line 774 of file X86MCInstLower.cpp.

References assert(), llvm::MCStreamer::EmitBytes(), llvm::MCStreamer::EmitInstruction(), and llvm_unreachable.

Referenced by EmitNops().

◆ EmitNops()

static void EmitNops ( MCStreamer OS,
unsigned  NumBytes,
bool  Is64Bit,
const MCSubtargetInfo STI 
)
static

Emit the optimal amount of multi-byte nops on X86.

Definition at line 835 of file X86MCInstLower.cpp.

References llvm::MCStreamer::AddComment(), addOperand(), llvm::MCInst::addOperand(), assert(), llvm::MCSymbolRefExpr::create(), llvm::MCOperand::createImm(), llvm::MachineOperand::CreateMCSymbol(), llvm::MCOperand::createReg(), llvm::MCContext::createTempSymbol(), llvm::AsmPrinter::CUSTOM_EVENT, E, llvm::MCStreamer::EmitBinaryData(), llvm::MCStreamer::EmitBytes(), llvm::MCStreamer::EmitCodeAlignment(), llvm::MCStreamer::EmitInstruction(), llvm::MCStreamer::EmitLabel(), EmitNop(), llvm::MCCodeEmitter::encodeInstruction(), llvm::FaultMaps::FaultKindMax, llvm::AsmPrinter::FUNCTION_ENTER, llvm::AsmPrinter::FUNCTION_EXIT, llvm::PatchPointOpers::getCallTarget(), llvm::MCStreamer::getContext(), llvm::MachineOperand::getImm(), llvm::MachineOperand::getMBB(), llvm::PatchPointOpers::getNextScratchIdx(), llvm::MachineInstr::getNumOperands(), llvm::PatchPointOpers::getNumPatchBytes(), llvm::MachineInstr::getOperand(), llvm::MCContext::getOrCreateSymbol(), llvm::MachineOperand::getReg(), llvm::AsmPrinter::getSubtargetInfo(), llvm::MachineBasicBlock::getSymbol(), llvm::MachineOperand::getType(), I, llvm::X86Subtarget::is64Bit(), llvm::MachineOperand::isImm(), llvm::AsmPrinter::isPositionIndependent(), llvm::X86II::isX86_64ExtendedReg(), llvm_unreachable, llvm::make_range(), MI, llvm::MachineOperand::MO_ExternalSymbol, llvm::MachineOperand::MO_GlobalAddress, llvm::MachineOperand::MO_Immediate, llvm::X86II::MO_PLT, llvm::MachineOperand::MO_Register, llvm::MachineInstr::operands_begin(), llvm::MachineInstr::operands_end(), llvm::AsmPrinter::OutContext, llvm::FaultMaps::recordFaultingOp(), llvm::StackMaps::recordPatchPoint(), llvm::AsmPrinter::recordSled(), llvm::StackMaps::recordStackMap(), llvm::StackMaps::recordStatepoint(), llvm::MipsISD::Ret, llvm::MCInst::setOpcode(), llvm::MachineOperand::setTargetFlags(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::AsmPrinter::TAIL_CALL, and llvm::MCSymbolRefExpr::VK_None.

Referenced by llvm::MCAlignFragment::hasEmitNops(), and llvm::MCAlignFragment::setEmitNops().

◆ getConstantFromPool()

static const Constant* getConstantFromPool ( const MachineInstr MI,
const MachineOperand Op 
)
static

◆ getRetOpcode()

static unsigned getRetOpcode ( const X86Subtarget Subtarget)
static

Definition at line 353 of file X86MCInstLower.cpp.

References llvm::MCInst::addOperand(), llvm::X86::AddrNumOperands, llvm::X86::AddrSegmentReg, assert(), llvm::ISD::CATCHRET, llvm::ISD::CLEANUPRET, llvm::MCSymbolRefExpr::create(), llvm::MCOperand::createExpr(), llvm::MCOperand::createImm(), llvm::MCOperand::createReg(), llvm::N86::EAX, llvm::N86::EBX, llvm::ISD::EH_RETURN, llvm::errs(), llvm::MachineOperand::getBlockAddress(), llvm::AsmPrinter::GetBlockAddressSymbol(), llvm::X86::GetCondBranchFromCond(), llvm::MCStreamer::getContext(), llvm::AsmPrinter::GetCPISymbol(), llvm::MachineOperand::getImm(), llvm::MachineOperand::getIndex(), llvm::AsmPrinter::GetJTISymbol(), llvm::MachineOperand::getMCSymbol(), llvm::MCInst::getNumOperands(), llvm::MCInst::getOpcode(), llvm::MachineInstr::getOpcode(), llvm::MCInst::getOperand(), llvm::MachineInstr::getOperand(), llvm::MCContext::getOrCreateSymbol(), llvm::MCOperand::getReg(), llvm::MachineOperand::getReg(), GetSymbolFromOperand(), llvm::MachineOperand::getType(), llvm::X86Subtarget::is64Bit(), llvm::MachineOperand::isImplicit(), llvm::X86II::isX86_64ExtendedReg(), llvm_unreachable, llvm::Lower, LowerSymbolOperand(), MI, llvm::MachineOperand::MO_BlockAddress, llvm::MachineOperand::MO_ConstantPoolIndex, llvm::MachineOperand::MO_ExternalSymbol, llvm::MachineOperand::MO_GlobalAddress, llvm::MachineOperand::MO_Immediate, llvm::MachineOperand::MO_JumpTableIndex, llvm::MachineOperand::MO_MachineBasicBlock, llvm::MachineOperand::MO_MCSymbol, llvm::MachineOperand::MO_Register, llvm::MachineOperand::MO_RegisterMask, name, llvm::None, llvm::MachineInstr::operands(), llvm::MachineInstr::print(), llvm::MCInst::setOpcode(), SimplifyMOVSX(), SimplifyShortImmForm(), SimplifyShortMoveForm(), llvm::MCSymbolRefExpr::VK_PLT, llvm::MCSymbolRefExpr::VK_TLSGD, llvm::MCSymbolRefExpr::VK_TLSLD, and llvm::MCSymbolRefExpr::VK_TLSLDM.

Referenced by llvm::X86AsmPrinter::EmitInstruction().

◆ getShuffleComment()

static std::string getShuffleComment ( const MachineInstr MI,
unsigned  SrcOp1Idx,
unsigned  SrcOp2Idx,
ArrayRef< int >  Mask 
)
static

◆ PrevCrossBBInst()

◆ printConstant()

static void printConstant ( const Constant COp,
raw_ostream CS 
)
static

◆ SimplifyMOVSX()

static void SimplifyMOVSX ( MCInst Inst)
static

If a movsx instruction has a shorter encoding for the used register simplify the instruction to use it instead.

Definition at line 275 of file X86MCInstLower.cpp.

References llvm::AArch64CC::AL, llvm::N86::EAX, llvm::MCInst::getOpcode(), llvm::MCInst::getOperand(), llvm::MCOperand::getReg(), llvm_unreachable, and llvm::MCInst::setOpcode().

Referenced by getRetOpcode().

◆ SimplifyShortImmForm()

static void SimplifyShortImmForm ( MCInst Inst,
unsigned  Opcode 
)
static

◆ SimplifyShortMoveForm()

static void SimplifyShortMoveForm ( X86AsmPrinter Printer,
MCInst Inst,
unsigned  Opcode 
)
static