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