1 //===-- XCoreSelectionDAGInfo.cpp - XCore SelectionDAG Info ---------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the XCoreSelectionDAGInfo class.
12 //===----------------------------------------------------------------------===//
14 #include "XCoreTargetMachine.h"
17 #define DEBUG_TYPE "xcore-selectiondag-info"
19 SDValue
XCoreSelectionDAGInfo::EmitTargetCodeForMemcpy(
20 SelectionDAG
&DAG
, const SDLoc
&dl
, SDValue Chain
, SDValue Dst
, SDValue Src
,
21 SDValue Size
, unsigned Align
, bool isVolatile
, bool AlwaysInline
,
22 MachinePointerInfo DstPtrInfo
, MachinePointerInfo SrcPtrInfo
) const {
23 unsigned SizeBitWidth
= Size
.getValueSizeInBits();
24 // Call __memcpy_4 if the src, dst and size are all 4 byte aligned.
25 if (!AlwaysInline
&& (Align
& 3) == 0 &&
26 DAG
.MaskedValueIsZero(Size
, APInt(SizeBitWidth
, 3))) {
27 const TargetLowering
&TLI
= *DAG
.getSubtarget().getTargetLowering();
28 TargetLowering::ArgListTy Args
;
29 TargetLowering::ArgListEntry Entry
;
30 Entry
.Ty
= DAG
.getDataLayout().getIntPtrType(*DAG
.getContext());
31 Entry
.Node
= Dst
; Args
.push_back(Entry
);
32 Entry
.Node
= Src
; Args
.push_back(Entry
);
33 Entry
.Node
= Size
; Args
.push_back(Entry
);
35 TargetLowering::CallLoweringInfo
CLI(DAG
);
38 .setLibCallee(TLI
.getLibcallCallingConv(RTLIB::MEMCPY
),
39 Type::getVoidTy(*DAG
.getContext()),
40 DAG
.getExternalSymbol(
41 "__memcpy_4", TLI
.getPointerTy(DAG
.getDataLayout())),
45 std::pair
<SDValue
,SDValue
> CallResult
= TLI
.LowerCallTo(CLI
);
46 return CallResult
.second
;
49 // Otherwise have the target-independent code call memcpy.