brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 33aa6e4 Raw
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