Mercurial > hg > CbC > CbC_llvm
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 |