xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonSelectionDAGInfo.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- HexagonSelectionDAGInfo.cpp - Hexagon SelectionDAG Info -----------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the HexagonSelectionDAGInfo class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "HexagonTargetMachine.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/SelectionDAG.h"
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "hexagon-selectiondag-info"
19*9880d681SAndroid Build Coastguard Worker 
EmitTargetCodeForMemcpy(SelectionDAG & DAG,const SDLoc & dl,SDValue Chain,SDValue Dst,SDValue Src,SDValue Size,unsigned Align,bool isVolatile,bool AlwaysInline,MachinePointerInfo DstPtrInfo,MachinePointerInfo SrcPtrInfo) const20*9880d681SAndroid Build Coastguard Worker SDValue HexagonSelectionDAGInfo::EmitTargetCodeForMemcpy(
21*9880d681SAndroid Build Coastguard Worker     SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
22*9880d681SAndroid Build Coastguard Worker     SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
23*9880d681SAndroid Build Coastguard Worker     MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
24*9880d681SAndroid Build Coastguard Worker   ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
25*9880d681SAndroid Build Coastguard Worker   if (AlwaysInline || (Align & 0x3) != 0 || !ConstantSize)
26*9880d681SAndroid Build Coastguard Worker     return SDValue();
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker   uint64_t SizeVal = ConstantSize->getZExtValue();
29*9880d681SAndroid Build Coastguard Worker   if (SizeVal < 32 || (SizeVal % 8) != 0)
30*9880d681SAndroid Build Coastguard Worker     return SDValue();
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker   // Special case aligned memcpys with size >= 32 bytes and a multiple of 8.
33*9880d681SAndroid Build Coastguard Worker   //
34*9880d681SAndroid Build Coastguard Worker   const TargetLowering &TLI = *DAG.getSubtarget().getTargetLowering();
35*9880d681SAndroid Build Coastguard Worker   TargetLowering::ArgListTy Args;
36*9880d681SAndroid Build Coastguard Worker   TargetLowering::ArgListEntry Entry;
37*9880d681SAndroid Build Coastguard Worker   Entry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
38*9880d681SAndroid Build Coastguard Worker   Entry.Node = Dst;
39*9880d681SAndroid Build Coastguard Worker   Args.push_back(Entry);
40*9880d681SAndroid Build Coastguard Worker   Entry.Node = Src;
41*9880d681SAndroid Build Coastguard Worker   Args.push_back(Entry);
42*9880d681SAndroid Build Coastguard Worker   Entry.Node = Size;
43*9880d681SAndroid Build Coastguard Worker   Args.push_back(Entry);
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker   const char *SpecialMemcpyName =
46*9880d681SAndroid Build Coastguard Worker       "__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes";
47*9880d681SAndroid Build Coastguard Worker 
48*9880d681SAndroid Build Coastguard Worker   TargetLowering::CallLoweringInfo CLI(DAG);
49*9880d681SAndroid Build Coastguard Worker   CLI.setDebugLoc(dl)
50*9880d681SAndroid Build Coastguard Worker       .setChain(Chain)
51*9880d681SAndroid Build Coastguard Worker       .setCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY),
52*9880d681SAndroid Build Coastguard Worker                  Type::getVoidTy(*DAG.getContext()),
53*9880d681SAndroid Build Coastguard Worker                  DAG.getTargetExternalSymbol(
54*9880d681SAndroid Build Coastguard Worker                      SpecialMemcpyName, TLI.getPointerTy(DAG.getDataLayout())),
55*9880d681SAndroid Build Coastguard Worker                  std::move(Args))
56*9880d681SAndroid Build Coastguard Worker       .setDiscardResult();
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
59*9880d681SAndroid Build Coastguard Worker   return CallResult.second;
60*9880d681SAndroid Build Coastguard Worker }
61