AArch64/X86: Factor out common bzero logic; NFC
llvm-svn: 321035
This commit is contained in:
parent
e704583f23
commit
a92cecfbda
|
@ -334,6 +334,7 @@ HANDLE_LIBCALL(O_PPCF128, "__gcc_qunord")
|
|||
HANDLE_LIBCALL(MEMCPY, "memcpy")
|
||||
HANDLE_LIBCALL(MEMMOVE, "memmove")
|
||||
HANDLE_LIBCALL(MEMSET, "memset")
|
||||
HANDLE_LIBCALL(BZERO, nullptr)
|
||||
|
||||
// Element-wise unordered-atomic memory of different sizes
|
||||
HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_1, "__llvm_memcpy_element_unordered_atomic_1")
|
||||
|
|
|
@ -114,6 +114,10 @@ static void InitLibcallNames(const char **Names, const Triple &TT) {
|
|||
// FIXME: What about other targets?
|
||||
Names[RTLIB::FPEXT_F16_F32] = "__extendhfsf2";
|
||||
Names[RTLIB::FPROUND_F32_F16] = "__truncsfhf2";
|
||||
|
||||
// Darwin 10 and higher has an optimized __bzero.
|
||||
if (!TT.isMacOSX() || !TT.isMacOSXVersionLT(10, 6))
|
||||
Names[RTLIB::BZERO] = "__bzero";
|
||||
} else {
|
||||
Names[RTLIB::FPEXT_F16_F32] = "__gnu_h2f_ieee";
|
||||
Names[RTLIB::FPROUND_F32_F16] = "__gnu_f2h_ieee";
|
||||
|
|
|
@ -25,11 +25,11 @@ SDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
|
|||
ConstantSDNode *SizeValue = dyn_cast<ConstantSDNode>(Size);
|
||||
const AArch64Subtarget &STI =
|
||||
DAG.getMachineFunction().getSubtarget<AArch64Subtarget>();
|
||||
const char *bzeroEntry =
|
||||
(V && V->isNullValue()) ? STI.getBZeroEntry() : nullptr;
|
||||
const char *bzeroName = (V && V->isNullValue())
|
||||
? DAG.getTargetLoweringInfo().getLibcallName(RTLIB::BZERO) : nullptr;
|
||||
// For small size (< 256), it is not beneficial to use bzero
|
||||
// instead of memset.
|
||||
if (bzeroEntry && (!SizeValue || SizeValue->getZExtValue() > 256)) {
|
||||
if (bzeroName && (!SizeValue || SizeValue->getZExtValue() > 256)) {
|
||||
const AArch64TargetLowering &TLI = *STI.getTargetLowering();
|
||||
|
||||
EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());
|
||||
|
@ -45,7 +45,7 @@ SDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
|
|||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr),
|
||||
DAG.getExternalSymbol(bzeroName, IntPtr),
|
||||
std::move(Args))
|
||||
.setDiscardResult();
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
|
|
|
@ -217,19 +217,6 @@ unsigned char AArch64Subtarget::classifyGlobalFunctionReference(
|
|||
return AArch64II::MO_NO_FLAG;
|
||||
}
|
||||
|
||||
/// This function returns the name of a function which has an interface
|
||||
/// like the non-standard bzero function, if such a function exists on
|
||||
/// the current subtarget and it is considered prefereable over
|
||||
/// memset with zero passed as the second argument. Otherwise it
|
||||
/// returns null.
|
||||
const char *AArch64Subtarget::getBZeroEntry() const {
|
||||
// Prefer bzero on Darwin only.
|
||||
if(isTargetDarwin())
|
||||
return "bzero";
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AArch64Subtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
|
||||
unsigned NumRegionInstrs) const {
|
||||
// LNT run (at least on Cyclone) showed reasonably significant gains for
|
||||
|
|
|
@ -309,13 +309,6 @@ public:
|
|||
unsigned char classifyGlobalFunctionReference(const GlobalValue *GV,
|
||||
const TargetMachine &TM) const;
|
||||
|
||||
/// This function returns the name of a function which has an interface
|
||||
/// like the non-standard bzero function, if such a function exists on
|
||||
/// the current subtarget and it is considered prefereable over
|
||||
/// memset with zero passed as the second argument. Otherwise it
|
||||
/// returns null.
|
||||
const char *getBZeroEntry() const;
|
||||
|
||||
void overrideSchedPolicy(MachineSchedPolicy &Policy,
|
||||
unsigned NumRegionInstrs) const override;
|
||||
|
||||
|
|
|
@ -89,8 +89,9 @@ SDValue X86SelectionDAGInfo::EmitTargetCodeForMemset(
|
|||
// Check to see if there is a specialized entry-point for memory zeroing.
|
||||
ConstantSDNode *ValC = dyn_cast<ConstantSDNode>(Val);
|
||||
|
||||
if (const char *bzeroEntry = ValC &&
|
||||
ValC->isNullValue() ? Subtarget.getBZeroEntry() : nullptr) {
|
||||
if (const char *bzeroName = (ValC && ValC->isNullValue())
|
||||
? DAG.getTargetLoweringInfo().getLibcallName(RTLIB::BZERO)
|
||||
: nullptr) {
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());
|
||||
Type *IntPtrTy = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
|
||||
|
@ -106,7 +107,7 @@ SDValue X86SelectionDAGInfo::EmitTargetCodeForMemset(
|
|||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setLibCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr),
|
||||
DAG.getExternalSymbol(bzeroName, IntPtr),
|
||||
std::move(Args))
|
||||
.setDiscardResult();
|
||||
|
||||
|
|
|
@ -174,19 +174,6 @@ X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV,
|
|||
return X86II::MO_NO_FLAG;
|
||||
}
|
||||
|
||||
/// This function returns the name of a function which has an interface like
|
||||
/// the non-standard bzero function, if such a function exists on the
|
||||
/// current subtarget and it is considered preferable over memset with zero
|
||||
/// passed as the second argument. Otherwise it returns null.
|
||||
const char *X86Subtarget::getBZeroEntry() const {
|
||||
// Darwin 10 has a __bzero entry point for this purpose.
|
||||
if (getTargetTriple().isMacOSX() &&
|
||||
!getTargetTriple().isMacOSXVersionLT(10, 6))
|
||||
return "__bzero";
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool X86Subtarget::hasSinCos() const {
|
||||
if (getTargetTriple().isMacOSX()) {
|
||||
return !getTargetTriple().isMacOSXVersionLT(10, 9) && is64Bit();
|
||||
|
|
|
@ -682,13 +682,6 @@ public:
|
|||
/// Return true if the subtarget allows calls to immediate address.
|
||||
bool isLegalToCallImmediateAddr() const;
|
||||
|
||||
/// This function returns the name of a function which has an interface
|
||||
/// like the non-standard bzero function, if such a function exists on
|
||||
/// the current subtarget and it is considered prefereable over
|
||||
/// memset with zero passed as the second argument. Otherwise it
|
||||
/// returns null.
|
||||
const char *getBZeroEntry() const;
|
||||
|
||||
/// This function returns true if the target has sincos() routine in its
|
||||
/// compiler runtime or math libraries.
|
||||
bool hasSinCos() const;
|
||||
|
|
Loading…
Reference in New Issue