comparison lib/Target/ARM/ARMSelectionDAGInfo.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
comparison
equal deleted inserted replaced
146:3fc4d5c3e21e 148:63bd29f05246
1 //===-- ARMSelectionDAGInfo.cpp - ARM SelectionDAG Info -------------------===// 1 //===-- ARMSelectionDAGInfo.cpp - ARM SelectionDAG Info -------------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // 4 // See https://llvm.org/LICENSE.txt for license information.
5 // This file is distributed under the University of Illinois Open Source 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 // License. See LICENSE.TXT for details.
7 // 6 //
8 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
9 // 8 //
10 // This file implements the ARMSelectionDAGInfo class. 9 // This file implements the ARMSelectionDAGInfo class.
11 // 10 //
47 AEABILibcall = AEABI_MEMCPY; 46 AEABILibcall = AEABI_MEMCPY;
48 break; 47 break;
49 case RTLIB::MEMMOVE: 48 case RTLIB::MEMMOVE:
50 AEABILibcall = AEABI_MEMMOVE; 49 AEABILibcall = AEABI_MEMMOVE;
51 break; 50 break;
52 case RTLIB::MEMSET: 51 case RTLIB::MEMSET:
53 AEABILibcall = AEABI_MEMSET; 52 AEABILibcall = AEABI_MEMSET;
54 if (ConstantSDNode *ConstantSrc = dyn_cast<ConstantSDNode>(Src)) 53 if (ConstantSDNode *ConstantSrc = dyn_cast<ConstantSDNode>(Src))
55 if (ConstantSrc->getZExtValue() == 0) 54 if (ConstantSrc->getZExtValue() == 0)
56 AEABILibcall = AEABI_MEMCLR; 55 AEABILibcall = AEABI_MEMCLR;
57 break; 56 break;
91 if (Src.getValueType().bitsGT(MVT::i32)) 90 if (Src.getValueType().bitsGT(MVT::i32))
92 Src = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src); 91 Src = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src);
93 else if (Src.getValueType().bitsLT(MVT::i32)) 92 else if (Src.getValueType().bitsLT(MVT::i32))
94 Src = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Src); 93 Src = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Src);
95 94
96 Entry.Node = Src; 95 Entry.Node = Src;
97 Entry.Ty = Type::getInt32Ty(*DAG.getContext()); 96 Entry.Ty = Type::getInt32Ty(*DAG.getContext());
98 Entry.IsSExt = false; 97 Entry.IsSExt = false;
99 Args.push_back(Entry); 98 Args.push_back(Entry);
100 } else { 99 } else {
101 Entry.Node = Src; 100 Entry.Node = Src;
102 Args.push_back(Entry); 101 Args.push_back(Entry);
103 102
104 Entry.Node = Size; 103 Entry.Node = Size;
105 Args.push_back(Entry); 104 Args.push_back(Entry);
106 } 105 }
107 106
108 char const *FunctionNames[4][3] = { 107 char const *FunctionNames[4][3] = {
119 DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant], 118 DAG.getExternalSymbol(FunctionNames[AEABILibcall][AlignVariant],
120 TLI->getPointerTy(DAG.getDataLayout())), 119 TLI->getPointerTy(DAG.getDataLayout())),
121 std::move(Args)) 120 std::move(Args))
122 .setDiscardResult(); 121 .setDiscardResult();
123 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 122 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
124 123
125 return CallResult.second; 124 return CallResult.second;
126 } 125 }
127 126
128 SDValue ARMSelectionDAGInfo::EmitTargetCodeForMemcpy( 127 SDValue ARMSelectionDAGInfo::EmitTargetCodeForMemcpy(
129 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, 128 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
169 // emit. 168 // emit.
170 unsigned NumMEMCPYs = (NumMemOps + MaxLoadsInLDM - 1) / MaxLoadsInLDM; 169 unsigned NumMEMCPYs = (NumMemOps + MaxLoadsInLDM - 1) / MaxLoadsInLDM;
171 170
172 // Code size optimisation: do not inline memcpy if expansion results in 171 // Code size optimisation: do not inline memcpy if expansion results in
173 // more instructions than the libary call. 172 // more instructions than the libary call.
174 if (NumMEMCPYs > 1 && DAG.getMachineFunction().getFunction().optForMinSize()) { 173 if (NumMEMCPYs > 1 && Subtarget.hasMinSize()) {
175 return SDValue(); 174 return SDValue();
176 } 175 }
177 176
178 SDVTList VTs = DAG.getVTList(MVT::i32, MVT::i32, MVT::Other, MVT::Glue); 177 SDVTList VTs = DAG.getVTList(MVT::i32, MVT::i32, MVT::Other, MVT::Glue);
179 178