diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td index 39ebab73652fa..c1855e5cdc566 100644 --- a/llvm/include/llvm/IR/RuntimeLibcalls.td +++ b/llvm/include/llvm/IR/RuntimeLibcalls.td @@ -371,6 +371,9 @@ def AEABI_MEMCLR8 : RuntimeLibcall; // Hexagon calls def HEXAGON_MEMCPY_LIKELY_ALIGNED_MIN32BYTES_MULT8BYTES : RuntimeLibcall; +// XCore calls +def MEMCPY_ALIGN_4 : RuntimeLibcall; + //-------------------------------------------------------------------- // Define implementation default libcalls //-------------------------------------------------------------------- @@ -1544,6 +1547,12 @@ def _allrem : RuntimeLibcallImpl; // CallingConv::X86_StdCall def _aullrem : RuntimeLibcallImpl; // CallingConv::X86_StdCall def _allmul : RuntimeLibcallImpl; // CallingConv::X86_StdCall +//===----------------------------------------------------------------------===// +// XCore Runtime Libcalls +//===----------------------------------------------------------------------===// + +def __memcpy_4 : RuntimeLibcallImpl; + //===----------------------------------------------------------------------===// // ZOS Runtime Libcalls //===----------------------------------------------------------------------===// diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp index 9b109358fff95..79a49159efc73 100644 --- a/llvm/lib/IR/RuntimeLibcalls.cpp +++ b/llvm/lib/IR/RuntimeLibcalls.cpp @@ -595,6 +595,9 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT, if (TT.isSystemZ() && TT.isOSzOS()) setZOSLibCallNameOverrides(); + + if (TT.getArch() == Triple::ArchType::xcore) + setLibcallImpl(RTLIB::MEMCPY_ALIGN_4, RTLIB::__memcpy_4); } bool RuntimeLibcallsInfo::darwinHasExp10(const Triple &TT) { diff --git a/llvm/lib/Target/XCore/XCoreSelectionDAGInfo.cpp b/llvm/lib/Target/XCore/XCoreSelectionDAGInfo.cpp index bc34ab4319690..1bd92a2b49475 100644 --- a/llvm/lib/Target/XCore/XCoreSelectionDAGInfo.cpp +++ b/llvm/lib/Target/XCore/XCoreSelectionDAGInfo.cpp @@ -39,14 +39,17 @@ SDValue XCoreSelectionDAGInfo::EmitTargetCodeForMemcpy( Entry.Node = Src; Args.push_back(Entry); Entry.Node = Size; Args.push_back(Entry); + const char *MemcpyAlign4Name = TLI.getLibcallName(RTLIB::MEMCPY_ALIGN_4); + CallingConv::ID CC = TLI.getLibcallCallingConv(RTLIB::MEMCPY_ALIGN_4); + TargetLowering::CallLoweringInfo CLI(DAG); CLI.setDebugLoc(dl) .setChain(Chain) - .setLibCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY), - Type::getVoidTy(*DAG.getContext()), - DAG.getExternalSymbol( - "__memcpy_4", TLI.getPointerTy(DAG.getDataLayout())), - std::move(Args)) + .setLibCallee( + CC, Type::getVoidTy(*DAG.getContext()), + DAG.getExternalSymbol(MemcpyAlign4Name, + TLI.getPointerTy(DAG.getDataLayout())), + std::move(Args)) .setDiscardResult(); std::pair CallResult = TLI.LowerCallTo(CLI);