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