172062f5744557e270a38192554c3126ea5f97434Tim Northover//===-- AArch64SelectionDAGInfo.cpp - AArch64 SelectionDAG Info -----------===//
272062f5744557e270a38192554c3126ea5f97434Tim Northover//
372062f5744557e270a38192554c3126ea5f97434Tim Northover//                     The LLVM Compiler Infrastructure
472062f5744557e270a38192554c3126ea5f97434Tim Northover//
572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source
672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details.
772062f5744557e270a38192554c3126ea5f97434Tim Northover//
872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
972062f5744557e270a38192554c3126ea5f97434Tim Northover//
1072062f5744557e270a38192554c3126ea5f97434Tim Northover// This file implements the AArch64SelectionDAGInfo class.
1172062f5744557e270a38192554c3126ea5f97434Tim Northover//
1272062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
1372062f5744557e270a38192554c3126ea5f97434Tim Northover
1472062f5744557e270a38192554c3126ea5f97434Tim Northover#include "AArch64TargetMachine.h"
1572062f5744557e270a38192554c3126ea5f97434Tim Northoverusing namespace llvm;
1672062f5744557e270a38192554c3126ea5f97434Tim Northover
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "aarch64-selectiondag-info"
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SelectionDAG &DAG, SDLoc dl, SDValue Chain, SDValue Dst, SDValue Src,
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue Size, unsigned Align, bool isVolatile,
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachinePointerInfo DstPtrInfo) const {
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Check to see if there is a specialized entry-point for memory zeroing.
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ConstantSDNode *V = dyn_cast<ConstantSDNode>(Src);
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ConstantSDNode *SizeValue = dyn_cast<ConstantSDNode>(Size);
26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const AArch64Subtarget &STI =
27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      DAG.getMachineFunction().getSubtarget<AArch64Subtarget>();
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const char *bzeroEntry =
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      (V && V->isNullValue()) ? STI.getBZeroEntry() : nullptr;
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // For small size (< 256), it is not beneficial to use bzero
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // instead of memset.
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (bzeroEntry && (!SizeValue || SizeValue->getZExtValue() > 256)) {
33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    const AArch64TargetLowering &TLI = *STI.getTargetLowering();
3472062f5744557e270a38192554c3126ea5f97434Tim Northover
35cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());
36cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar    Type *IntPtrTy = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TargetLowering::ArgListTy Args;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TargetLowering::ArgListEntry Entry;
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Entry.Node = Dst;
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Entry.Ty = IntPtrTy;
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Args.push_back(Entry);
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Entry.Node = Size;
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Args.push_back(Entry);
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TargetLowering::CallLoweringInfo CLI(DAG);
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CLI.setDebugLoc(dl).setChain(Chain)
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
47c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                 DAG.getExternalSymbol(bzeroEntry, IntPtr), std::move(Args), 0)
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      .setDiscardResult();
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return CallResult.second;
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SDValue();
5372062f5744557e270a38192554c3126ea5f97434Tim Northover}
54