ARM: Add runtime libcall definitions for aebi memory functions (#144974)
Fix bypassing ordinary RuntimeLibcalls APIs for cases handled in ARMSelectionDAGInfo
This commit is contained in:
parent
b88e1f6a79
commit
4243e502c1
@ -357,6 +357,17 @@ multiclass LibmLongDoubleLibCall<string libcall_basename = !toupper(NAME),
|
||||
!strconcat(rtbasename, "l")>;
|
||||
}
|
||||
|
||||
// ARM EABI calls
|
||||
def AEABI_MEMCPY4 : RuntimeLibcall; // Align 4
|
||||
def AEABI_MEMCPY8 : RuntimeLibcall; // Align 8
|
||||
def AEABI_MEMMOVE4 : RuntimeLibcall;
|
||||
def AEABI_MEMMOVE8 : RuntimeLibcall;
|
||||
def AEABI_MEMSET4 : RuntimeLibcall;
|
||||
def AEABI_MEMSET8 : RuntimeLibcall;
|
||||
def AEABI_MEMCLR : RuntimeLibcall;
|
||||
def AEABI_MEMCLR4 : RuntimeLibcall;
|
||||
def AEABI_MEMCLR8 : RuntimeLibcall;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Define implementation default libcalls
|
||||
//--------------------------------------------------------------------
|
||||
@ -1134,8 +1145,20 @@ def __aeabi_uidivmod : RuntimeLibcallImpl<UDIVREM_I32>; // CallingConv::ARM_AAP
|
||||
// Memory operations
|
||||
// RTABI chapter 4.3.4
|
||||
def __aeabi_memcpy : RuntimeLibcallImpl<MEMCPY>; // CallingConv::ARM_AAPCS
|
||||
def __aeabi_memcpy4 : RuntimeLibcallImpl<AEABI_MEMCPY4>;
|
||||
def __aeabi_memcpy8 : RuntimeLibcallImpl<AEABI_MEMCPY8>;
|
||||
|
||||
def __aeabi_memmove : RuntimeLibcallImpl<MEMMOVE>; // CallingConv::ARM_AAPCS
|
||||
def __aeabi_memmove4 : RuntimeLibcallImpl<AEABI_MEMMOVE4>;
|
||||
def __aeabi_memmove8 : RuntimeLibcallImpl<AEABI_MEMMOVE8>;
|
||||
|
||||
def __aeabi_memset : RuntimeLibcallImpl<MEMSET>; // CallingConv::ARM_AAPCS
|
||||
def __aeabi_memset4 : RuntimeLibcallImpl<AEABI_MEMSET4>;
|
||||
def __aeabi_memset8 : RuntimeLibcallImpl<AEABI_MEMSET8>;
|
||||
|
||||
def __aeabi_memclr : RuntimeLibcallImpl<AEABI_MEMCLR>;
|
||||
def __aeabi_memclr4 : RuntimeLibcallImpl<AEABI_MEMCLR4>;
|
||||
def __aeabi_memclr8 : RuntimeLibcallImpl<AEABI_MEMCLR8>;
|
||||
|
||||
// isTargetWindows()
|
||||
def __stoi64 : RuntimeLibcallImpl<FPTOSINT_F32_I64>; // CallingConv::ARM_AAPCS_VFP
|
||||
|
||||
@ -702,6 +702,23 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
|
||||
{RTLIB::MEMCPY, RTLIB::__aeabi_memcpy, CallingConv::ARM_AAPCS},
|
||||
{RTLIB::MEMMOVE, RTLIB::__aeabi_memmove, CallingConv::ARM_AAPCS},
|
||||
{RTLIB::MEMSET, RTLIB::__aeabi_memset, CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr, CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4,
|
||||
CallingConv::ARM_AAPCS},
|
||||
{RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8,
|
||||
CallingConv::ARM_AAPCS},
|
||||
};
|
||||
|
||||
for (const auto &LC : MemOpsLibraryCalls) {
|
||||
|
||||
@ -121,18 +121,20 @@ SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(
|
||||
Args.push_back(Entry);
|
||||
}
|
||||
|
||||
char const *FunctionNames[4][3] = {
|
||||
{ "__aeabi_memcpy", "__aeabi_memcpy4", "__aeabi_memcpy8" },
|
||||
{ "__aeabi_memmove", "__aeabi_memmove4", "__aeabi_memmove8" },
|
||||
{ "__aeabi_memset", "__aeabi_memset4", "__aeabi_memset8" },
|
||||
{ "__aeabi_memclr", "__aeabi_memclr4", "__aeabi_memclr8" }
|
||||
};
|
||||
static const RTLIB::Libcall FunctionImpls[4][3] = {
|
||||
{RTLIB::MEMCPY, RTLIB::AEABI_MEMCPY4, RTLIB::AEABI_MEMCPY8},
|
||||
{RTLIB::MEMMOVE, RTLIB::AEABI_MEMMOVE4, RTLIB::AEABI_MEMMOVE8},
|
||||
{RTLIB::MEMSET, RTLIB::AEABI_MEMSET4, RTLIB::AEABI_MEMSET8},
|
||||
{RTLIB::AEABI_MEMCLR, RTLIB::AEABI_MEMCLR4, RTLIB::AEABI_MEMCLR8}};
|
||||
|
||||
RTLIB::Libcall NewLC = FunctionImpls[AEABILibcall][AlignVariant];
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setLibCallee(
|
||||
TLI->getLibcallCallingConv(LC), Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],
|
||||
TLI->getLibcallCallingConv(NewLC), Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(TLI->getLibcallName(NewLC),
|
||||
TLI->getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args))
|
||||
.setDiscardResult();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user