LLVM 20.0.0git
|
#include "X86SelectionDAGInfo.h"
#include "X86ISelLowering.h"
#include "X86InstrInfo.h"
#include "X86RegisterInfo.h"
#include "X86Subtarget.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/TargetLowering.h"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "x86-selectiondag-info" |
Functions | |
static MVT | getOptimalRepType (const X86Subtarget &Subtarget, Align Alignment) |
Returns the best type to use with repmovs/repstos depending on alignment. | |
static SDValue | emitRepstos (const X86Subtarget &Subtarget, SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Val, SDValue Size, MVT AVT) |
Emit a single REP STOSB instruction for a particular constant size. | |
static SDValue | emitRepstosB (const X86Subtarget &Subtarget, SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Val, uint64_t Size) |
Emit a single REP STOSB instruction for a particular constant size. | |
static SDValue | emitConstantSizeRepstos (SelectionDAG &DAG, const X86Subtarget &Subtarget, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Val, uint64_t Size, EVT SizeVT, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo) |
Returns a REP STOS instruction, possibly with a few load/stores to implement a constant size memory set. | |
static SDValue | emitRepmovs (const X86Subtarget &Subtarget, SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, MVT AVT) |
Emit a single REP MOVS{B,W,D,Q} instruction. | |
static SDValue | emitRepmovsB (const X86Subtarget &Subtarget, SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size) |
Emit a single REP MOVSB instruction for a particular constant size. | |
static SDValue | emitConstantSizeRepmov (SelectionDAG &DAG, const X86Subtarget &Subtarget, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, EVT SizeVT, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) |
Returns a REP MOVS instruction, possibly with a few load/stores to implement a constant size memory copy. | |
Variables | |
static cl::opt< bool > | UseFSRMForMemcpy ("x86-use-fsrm-for-memcpy", cl::Hidden, cl::init(false), cl::desc("Use fast short rep mov in memcpy lowering")) |
#define DEBUG_TYPE "x86-selectiondag-info" |
Definition at line 24 of file X86SelectionDAGInfo.cpp.
|
static |
Returns a REP MOVS instruction, possibly with a few load/stores to implement a constant size memory copy.
In some cases where we know REP MOVS is inefficient we return an empty SDValue so the calling code can either generate a load/store sequence or call the runtime memcpy function.
In case we optimize for size, we use repmovsb even if it's less efficient so we can save the loads/stores of the leftover.
TODO: Revisit next line: big copy with ERMSB on march >= haswell are very efficient.
If we have enhanced repmovs we use it.
We assume runtime memcpy will do a better job for unaligned copies when ERMS is not present.
RepMov can process the whole length.
Definition at line 257 of file X86SelectionDAGInfo.cpp.
References llvm::ISD::ADD, assert(), emitRepmovs(), emitRepmovsB(), llvm::SelectionDAG::getConstant(), llvm::MachineFunction::getFunction(), llvm::SelectionDAG::getIntPtrConstant(), llvm::SelectionDAG::getMachineFunction(), llvm::X86Subtarget::getMaxInlineSizeThreshold(), llvm::SelectionDAG::getMemcpy(), llvm::SelectionDAG::getNode(), getOptimalRepType(), llvm::MachinePointerInfo::getWithOffset(), llvm::Function::hasMinSize(), llvm::Offset, Results, Size, and llvm::ISD::TokenFactor.
Referenced by llvm::X86SelectionDAGInfo::EmitTargetCodeForMemcpy().
|
static |
Returns a REP STOS instruction, possibly with a few load/stores to implement a constant size memory set.
In some cases where we know REP MOVS is inefficient we return an empty SDValue so the calling code can either generate a store sequence or call the runtime memset function.
In case we optimize for size, we use repstosb even if it's less efficient so we can save the loads/stores of the leftover.
RepStos can process the whole length.
Definition at line 112 of file X86SelectionDAGInfo.cpp.
References llvm::ISD::ADD, emitRepstos(), emitRepstosB(), llvm::SelectionDAG::getConstant(), llvm::MachineFunction::getFunction(), llvm::SelectionDAG::getIntPtrConstant(), llvm::SelectionDAG::getMachineFunction(), llvm::X86Subtarget::getMaxInlineSizeThreshold(), llvm::SelectionDAG::getMemset(), llvm::SelectionDAG::getNode(), getOptimalRepType(), llvm::MachinePointerInfo::getWithOffset(), llvm::Function::hasMinSize(), llvm::Offset, Results, Size, and llvm::ISD::TokenFactor.
Referenced by llvm::X86SelectionDAGInfo::EmitTargetCodeForMemset().
|
static |
Emit a single REP MOVS{B,W,D,Q} instruction.
Definition at line 224 of file X86SelectionDAGInfo.cpp.
References llvm::SelectionDAG::getCopyToReg(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValue(), llvm::SelectionDAG::getValueType(), llvm::SelectionDAG::getVTList(), llvm::X86Subtarget::isTarget64BitLP64(), llvm::X86ISD::REP_MOVS, and Size.
Referenced by emitConstantSizeRepmov(), emitRepmovsB(), and llvm::X86SelectionDAGInfo::EmitTargetCodeForMemcpy().
|
static |
Emit a single REP MOVSB instruction for a particular constant size.
Definition at line 246 of file X86SelectionDAGInfo.cpp.
References emitRepmovs(), llvm::SelectionDAG::getIntPtrConstant(), and Size.
Referenced by emitConstantSizeRepmov().
|
static |
Emit a single REP STOSB instruction for a particular constant size.
Definition at line 64 of file X86SelectionDAGInfo.cpp.
References llvm::SelectionDAG::getCopyToReg(), llvm::SelectionDAG::getNode(), llvm::MVT::getSizeInBits(), llvm::SDValue::getValue(), llvm::SelectionDAG::getValueType(), llvm::SelectionDAG::getVTList(), llvm::X86Subtarget::isTarget64BitLP64(), llvm::X86ISD::REP_STOS, and Size.
Referenced by emitConstantSizeRepstos(), and emitRepstosB().
|
static |
Emit a single REP STOSB instruction for a particular constant size.
Definition at line 101 of file X86SelectionDAGInfo.cpp.
References emitRepstos(), llvm::SelectionDAG::getIntPtrConstant(), and Size.
Referenced by emitConstantSizeRepstos().
|
static |
Returns the best type to use with repmovs/repstos depending on alignment.
Definition at line 31 of file X86SelectionDAGInfo.cpp.
References assert(), llvm::isPowerOf2_64(), and llvm::Align::value().
Referenced by emitConstantSizeRepmov(), and emitConstantSizeRepstos().
|
static |
Referenced by llvm::X86SelectionDAGInfo::EmitTargetCodeForMemcpy().