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
19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesAArch64SelectionDAGInfo::AArch64SelectionDAGInfo(const DataLayout *DL)
20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    : TargetSelectionDAGInfo(DL) {}
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesAArch64SelectionDAGInfo::~AArch64SelectionDAGInfo() {}
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SelectionDAG &DAG, SDLoc dl, SDValue Chain, SDValue Dst, SDValue Src,
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue Size, unsigned Align, bool isVolatile,
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachinePointerInfo DstPtrInfo) const {
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Check to see if there is a specialized entry-point for memory zeroing.
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ConstantSDNode *V = dyn_cast<ConstantSDNode>(Src);
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ConstantSDNode *SizeValue = dyn_cast<ConstantSDNode>(Size);
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const char *bzeroEntry =
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      (V && V->isNullValue())
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          ? DAG.getTarget().getSubtarget<AArch64Subtarget>().getBZeroEntry()
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines          : nullptr;
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // For small size (< 256), it is not beneficial to use bzero
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // instead of memset.
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (bzeroEntry && (!SizeValue || SizeValue->getZExtValue() > 256)) {
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const AArch64TargetLowering &TLI =
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        *static_cast<const AArch64TargetLowering *>(
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines            DAG.getTarget().getTargetLowering());
4172062f5744557e270a38192554c3126ea5f97434Tim Northover
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EVT IntPtr = TLI.getPointerTy();
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Type *IntPtrTy = getDataLayout()->getIntPtrType(*DAG.getContext());
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TargetLowering::ArgListTy Args;
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TargetLowering::ArgListEntry Entry;
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Entry.Node = Dst;
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Entry.Ty = IntPtrTy;
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Args.push_back(Entry);
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Entry.Node = Size;
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Args.push_back(Entry);
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    TargetLowering::CallLoweringInfo CLI(DAG);
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CLI.setDebugLoc(dl).setChain(Chain)
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()),
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                 DAG.getExternalSymbol(bzeroEntry, IntPtr), std::move(Args), 0)
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      .setDiscardResult();
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return CallResult.second;
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return SDValue();
6072062f5744557e270a38192554c3126ea5f97434Tim Northover}
61