62 lines · cpp
1//===-- HexagonSelectionDAGInfo.cpp - Hexagon SelectionDAG Info -----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the HexagonSelectionDAGInfo class.10//11//===----------------------------------------------------------------------===//12 13#include "HexagonTargetMachine.h"14#include "llvm/CodeGen/SelectionDAG.h"15using namespace llvm;16 17#define DEBUG_TYPE "hexagon-selectiondag-info"18 19SDValue HexagonSelectionDAGInfo::EmitTargetCodeForMemcpy(20 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,21 SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,22 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {23 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);24 if (AlwaysInline || Alignment < Align(4) || !ConstantSize)25 return SDValue();26 27 uint64_t SizeVal = ConstantSize->getZExtValue();28 if (SizeVal < 32 || (SizeVal % 8) != 0)29 return SDValue();30 31 // Special case aligned memcpys with size >= 32 bytes and a multiple of 8.32 //33 const TargetLowering &TLI = *DAG.getSubtarget().getTargetLowering();34 TargetLowering::ArgListTy Args;35 Type *ArgTy = DAG.getDataLayout().getIntPtrType(*DAG.getContext());36 Args.emplace_back(Dst, ArgTy);37 Args.emplace_back(Src, ArgTy);38 Args.emplace_back(Size, ArgTy);39 40 const char *SpecialMemcpyName = TLI.getLibcallName(41 RTLIB::HEXAGON_MEMCPY_LIKELY_ALIGNED_MIN32BYTES_MULT8BYTES);42 const MachineFunction &MF = DAG.getMachineFunction();43 bool LongCalls = MF.getSubtarget<HexagonSubtarget>().useLongCalls();44 unsigned Flags = LongCalls ? HexagonII::HMOTF_ConstExtended : 0;45 46 CallingConv::ID CC = TLI.getLibcallCallingConv(47 RTLIB::HEXAGON_MEMCPY_LIKELY_ALIGNED_MIN32BYTES_MULT8BYTES);48 49 TargetLowering::CallLoweringInfo CLI(DAG);50 CLI.setDebugLoc(dl)51 .setChain(Chain)52 .setLibCallee(53 CC, Type::getVoidTy(*DAG.getContext()),54 DAG.getTargetExternalSymbol(55 SpecialMemcpyName, TLI.getPointerTy(DAG.getDataLayout()), Flags),56 std::move(Args))57 .setDiscardResult();58 59 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);60 return CallResult.second;61}62