1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//===-- ARMSelectionDAGInfo.cpp - ARM SelectionDAG Info -------------------===//
2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//                     The LLVM Compiler Infrastructure
4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// This file is distributed under the University of Illinois Open Source
6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// License. See LICENSE.TXT for details.
7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//===----------------------------------------------------------------------===//
9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// This file implements the ARMSelectionDAGInfo class.
11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//===----------------------------------------------------------------------===//
13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "ARMTargetMachine.h"
15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "llvm/CodeGen/SelectionDAG.h"
16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include "llvm/IR/DerivedTypes.h"
17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeusing namespace llvm;
18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
19155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define DEBUG_TYPE "arm-selectiondag-info"
20155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
21155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeARMSelectionDAGInfo::ARMSelectionDAGInfo(const DataLayout &DL)
22155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    : TargetSelectionDAGInfo(&DL) {}
23155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeARMSelectionDAGInfo::~ARMSelectionDAGInfo() {
25155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}
26155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
27155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeSDValue
28155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeARMSelectionDAGInfo::EmitTargetCodeForMemcpy(SelectionDAG &DAG, SDLoc dl,
29155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                             SDValue Chain,
30155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                             SDValue Dst, SDValue Src,
31155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                             SDValue Size, unsigned Align,
32155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                             bool isVolatile, bool AlwaysInline,
33155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                             MachinePointerInfo DstPtrInfo,
34155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                          MachinePointerInfo SrcPtrInfo) const {
35155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const ARMSubtarget &Subtarget = DAG.getTarget().getSubtarget<ARMSubtarget>();
36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Do repeated 4-byte loads and stores. To be improved.
37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // This requires 4-byte alignment.
38155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  if ((Align & 3) != 0)
39155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return SDValue();
40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // This requires the copy size to be a constant, preferably
41155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // within a subtarget-specific limit.
42155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
43155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  if (!ConstantSize)
44155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return SDValue();
45155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  uint64_t SizeVal = ConstantSize->getZExtValue();
46155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  if (!AlwaysInline && SizeVal > Subtarget.getMaxInlineSizeThreshold())
47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return SDValue();
48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  unsigned BytesLeft = SizeVal & 3;
50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  unsigned NumMemOps = SizeVal >> 2;
51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  unsigned EmittedNumMemOps = 0;
52f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann  EVT VT = MVT::i32;
53f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann  unsigned VTSize = 4;
54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  unsigned i = 0;
55155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Emit a maximum of 4 loads in Thumb1 since we have fewer registers
56f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann  const unsigned MAX_LOADS_IN_LDM = Subtarget.isThumb1Only() ? 4 : 6;
57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  SDValue TFOps[6];
58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  SDValue Loads[6];
59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  uint64_t SrcOff = 0, DstOff = 0;
60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Emit up to MAX_LOADS_IN_LDM loads, then a TokenFactor barrier, then the
62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // same number of stores.  The loads and stores will get combined into
63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // ldm/stm later on.
64155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  while (EmittedNumMemOps < NumMemOps) {
65155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    for (i = 0;
66155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande         i < MAX_LOADS_IN_LDM && EmittedNumMemOps + i < NumMemOps; ++i) {
67155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      Loads[i] = DAG.getLoad(VT, dl, Chain,
68155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                             DAG.getNode(ISD::ADD, dl, MVT::i32, Src,
69155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                         DAG.getConstant(SrcOff, MVT::i32)),
70155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                             SrcPtrInfo.getWithOffset(SrcOff), isVolatile,
71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                             false, false, 0);
72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      TFOps[i] = Loads[i].getValue(1);
73155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      SrcOff += VTSize;
74155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
75155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
76155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                        makeArrayRef(TFOps, i));
77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
78155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    for (i = 0;
79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande         i < MAX_LOADS_IN_LDM && EmittedNumMemOps + i < NumMemOps; ++i) {
80155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      TFOps[i] = DAG.getStore(Chain, dl, Loads[i],
81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                              DAG.getNode(ISD::ADD, dl, MVT::i32, Dst,
82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                          DAG.getConstant(DstOff, MVT::i32)),
83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                              DstPtrInfo.getWithOffset(DstOff),
84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                              isVolatile, false, 0);
85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      DstOff += VTSize;
86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                        makeArrayRef(TFOps, i));
89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
90155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    EmittedNumMemOps += i;
91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
92155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  if (BytesLeft == 0)
94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return Chain;
95155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
96155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Issue loads / stores for the trailing (1 - 3) bytes.
97155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  unsigned BytesLeftSave = BytesLeft;
98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  i = 0;
99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  while (BytesLeft) {
100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (BytesLeft >= 2) {
101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VT = MVT::i16;
102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VTSize = 2;
103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    } else {
104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VT = MVT::i8;
105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VTSize = 1;
106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Loads[i] = DAG.getLoad(VT, dl, Chain,
109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           DAG.getNode(ISD::ADD, dl, MVT::i32, Src,
110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                       DAG.getConstant(SrcOff, MVT::i32)),
111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           SrcPtrInfo.getWithOffset(SrcOff),
112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           false, false, false, 0);
113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    TFOps[i] = Loads[i].getValue(1);
114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    ++i;
115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    SrcOff += VTSize;
116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    BytesLeft -= VTSize;
117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                      makeArrayRef(TFOps, i));
120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  i = 0;
122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  BytesLeft = BytesLeftSave;
123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  while (BytesLeft) {
124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (BytesLeft >= 2) {
125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VT = MVT::i16;
126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VTSize = 2;
127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    } else {
128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VT = MVT::i8;
129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      VTSize = 1;
130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    TFOps[i] = DAG.getStore(Chain, dl, Loads[i],
133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                            DAG.getNode(ISD::ADD, dl, MVT::i32, Dst,
134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                        DAG.getConstant(DstOff, MVT::i32)),
135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                            DstPtrInfo.getWithOffset(DstOff), false, false, 0);
136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    ++i;
137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    DstOff += VTSize;
138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    BytesLeft -= VTSize;
139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  return DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                     makeArrayRef(TFOps, i));
142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}
143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Adjust parameters for memset, EABI uses format (ptr, size, value),
145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// GNU library uses (ptr, value, size)
146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// See RTABI section 4.3.4
147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeSDValue ARMSelectionDAGInfo::
148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeEmitTargetCodeForMemset(SelectionDAG &DAG, SDLoc dl,
149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                        SDValue Chain, SDValue Dst,
150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                        SDValue Src, SDValue Size,
151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                        unsigned Align, bool isVolatile,
152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                        MachinePointerInfo DstPtrInfo) const {
153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const ARMSubtarget &Subtarget = DAG.getTarget().getSubtarget<ARMSubtarget>();
154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Use default for non-AAPCS (or MachO) subtargets
155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  if (!Subtarget.isAAPCS_ABI() || Subtarget.isTargetMachO() ||
156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      Subtarget.isTargetWindows())
157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return SDValue();
158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const ARMTargetLowering &TLI =
160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *static_cast<const ARMTargetLowering*>(DAG.getTarget().getTargetLowering());
161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  TargetLowering::ArgListTy Args;
162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  TargetLowering::ArgListEntry Entry;
163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // First argument: data pointer
165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Type *IntPtrTy = TLI.getDataLayout()->getIntPtrType(*DAG.getContext());
166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.Node = Dst;
167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.Ty = IntPtrTy;
168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Args.push_back(Entry);
169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Second argument: buffer size
171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.Node = Size;
172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.Ty = IntPtrTy;
173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.isSExt = false;
174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Args.push_back(Entry);
175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Extend or truncate the argument to be an i32 value for the call.
177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  if (Src.getValueType().bitsGT(MVT::i32))
178155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Src = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src);
179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  else
180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Src = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Src);
181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Third argument: value to fill
183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.Node = Src;
184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.Ty = Type::getInt32Ty(*DAG.getContext());
185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Entry.isSExt = true;
186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Args.push_back(Entry);
187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Emit __eabi_memset call
189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  TargetLowering::CallLoweringInfo CLI(DAG);
190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  CLI.setDebugLoc(dl).setChain(Chain)
191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    .setCallee(TLI.getLibcallCallingConv(RTLIB::MEMSET),
192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande               Type::getVoidTy(*DAG.getContext()),
193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande               DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::MEMSET),
194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                     TLI.getPointerTy()), std::move(Args), 0)
195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    .setDiscardResult();
196155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI);
198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  return CallResult.second;
199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}
200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande