Line data Source code
1 : //===-- LegalizeTypes.h - DAG Type Legalizer class definition ---*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This file defines the DAGTypeLegalizer class. This is a private interface
11 : // shared between the code that implements the SelectionDAG::LegalizeTypes
12 : // method.
13 : //
14 : //===----------------------------------------------------------------------===//
15 :
16 : #ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
17 : #define LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
18 :
19 : #include "llvm/ADT/DenseMap.h"
20 : #include "llvm/CodeGen/SelectionDAG.h"
21 : #include "llvm/CodeGen/TargetLowering.h"
22 : #include "llvm/Support/Compiler.h"
23 : #include "llvm/Support/Debug.h"
24 :
25 : namespace llvm {
26 :
27 : //===----------------------------------------------------------------------===//
28 : /// This takes an arbitrary SelectionDAG as input and hacks on it until only
29 : /// value types the target machine can handle are left. This involves promoting
30 : /// small sizes to large sizes or splitting up large values into small values.
31 : ///
32 : class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
33 : const TargetLowering &TLI;
34 : SelectionDAG &DAG;
35 : public:
36 : /// This pass uses the NodeId on the SDNodes to hold information about the
37 : /// state of the node. The enum has all the values.
38 : enum NodeIdFlags {
39 : /// All operands have been processed, so this node is ready to be handled.
40 : ReadyToProcess = 0,
41 :
42 : /// This is a new node, not before seen, that was created in the process of
43 : /// legalizing some other node.
44 : NewNode = -1,
45 :
46 : /// This node's ID needs to be set to the number of its unprocessed
47 : /// operands.
48 : Unanalyzed = -2,
49 :
50 : /// This is a node that has already been processed.
51 : Processed = -3
52 :
53 : // 1+ - This is a node which has this many unprocessed operands.
54 : };
55 : private:
56 :
57 : /// This is a bitvector that contains two bits for each simple value type,
58 : /// where the two bits correspond to the LegalizeAction enum from
59 : /// TargetLowering. This can be queried with "getTypeAction(VT)".
60 : TargetLowering::ValueTypeActionImpl ValueTypeActions;
61 :
62 : /// Return how we should legalize values of this type.
63 0 : TargetLowering::LegalizeTypeAction getTypeAction(EVT VT) const {
64 96794344 : return TLI.getTypeAction(*DAG.getContext(), VT);
65 : }
66 :
67 : /// Return true if this type is legal on this target.
68 0 : bool isTypeLegal(EVT VT) const {
69 117963 : return TLI.getTypeAction(*DAG.getContext(), VT) == TargetLowering::TypeLegal;
70 : }
71 :
72 : /// Return true if this is a simple legal type.
73 0 : bool isSimpleLegalType(EVT VT) const {
74 5844 : return VT.isSimple() && TLI.isTypeLegal(VT);
75 : }
76 :
77 : /// Return true if this type can be passed in registers.
78 : /// For example, x86_64's f128, should to be legally in registers
79 : /// and only some operations converted to library calls or integer
80 : /// bitwise operations.
81 8214 : bool isLegalInHWReg(EVT VT) const {
82 8214 : EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
83 0 : return VT == NVT && isSimpleLegalType(VT);
84 : }
85 :
86 0 : EVT getSetCCResultType(EVT VT) const {
87 0 : return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
88 : }
89 :
90 : /// Pretend all of this node's results are legal.
91 0 : bool IgnoreNodeResults(SDNode *N) const {
92 207833698 : return N->getOpcode() == ISD::TargetConstant ||
93 0 : N->getOpcode() == ISD::Register;
94 : }
95 :
96 : // Bijection from SDValue to unique id. As each created node gets a
97 : // new id we do not need to worry about reuse expunging. Should we
98 : // run out of ids, we can do a one time expensive compactifcation.
99 : typedef unsigned TableId;
100 :
101 : TableId NextValueId = 1;
102 :
103 : SmallDenseMap<SDValue, TableId, 8> ValueToIdMap;
104 : SmallDenseMap<TableId, SDValue, 8> IdToValueMap;
105 :
106 : /// For integer nodes that are below legal width, this map indicates what
107 : /// promoted value to use.
108 : SmallDenseMap<TableId, TableId, 8> PromotedIntegers;
109 :
110 : /// For integer nodes that need to be expanded this map indicates which
111 : /// operands are the expanded version of the input.
112 : SmallDenseMap<TableId, std::pair<TableId, TableId>, 8> ExpandedIntegers;
113 :
114 : /// For floating-point nodes converted to integers of the same size, this map
115 : /// indicates the converted value to use.
116 : SmallDenseMap<TableId, TableId, 8> SoftenedFloats;
117 :
118 : /// For floating-point nodes that have a smaller precision than the smallest
119 : /// supported precision, this map indicates what promoted value to use.
120 : SmallDenseMap<TableId, TableId, 8> PromotedFloats;
121 :
122 : /// For float nodes that need to be expanded this map indicates which operands
123 : /// are the expanded version of the input.
124 : SmallDenseMap<TableId, std::pair<TableId, TableId>, 8> ExpandedFloats;
125 :
126 : /// For nodes that are <1 x ty>, this map indicates the scalar value of type
127 : /// 'ty' to use.
128 : SmallDenseMap<TableId, TableId, 8> ScalarizedVectors;
129 :
130 : /// For nodes that need to be split this map indicates which operands are the
131 : /// expanded version of the input.
132 : SmallDenseMap<TableId, std::pair<TableId, TableId>, 8> SplitVectors;
133 :
134 : /// For vector nodes that need to be widened, indicates the widened value to
135 : /// use.
136 : SmallDenseMap<TableId, TableId, 8> WidenedVectors;
137 :
138 : /// For values that have been replaced with another, indicates the replacement
139 : /// value to use.
140 : SmallDenseMap<TableId, TableId, 8> ReplacedValues;
141 :
142 : /// This defines a worklist of nodes to process. In order to be pushed onto
143 : /// this worklist, all operands of a node must have already been processed.
144 : SmallVector<SDNode*, 128> Worklist;
145 :
146 9797419 : TableId getTableId(SDValue V) {
147 : assert(V.getNode() && "Getting TableId on SDValue()");
148 :
149 9797419 : auto I = ValueToIdMap.find(V);
150 9797419 : if (I != ValueToIdMap.end()) {
151 : // replace if there's been a shift.
152 5434876 : RemapId(I->second);
153 : assert(I->second && "All Ids should be nonzero");
154 5434876 : return I->second;
155 : }
156 : // Add if it's not there.
157 4362543 : ValueToIdMap.insert(std::make_pair(V, NextValueId));
158 4362543 : IdToValueMap.insert(std::make_pair(NextValueId, V));
159 4362543 : ++NextValueId;
160 : assert(NextValueId != 0 &&
161 : "Ran out of Ids. Increase id type size or add compactification");
162 4362543 : return NextValueId - 1;
163 : }
164 :
165 : const SDValue &getSDValue(TableId &Id) {
166 6769332 : RemapId(Id);
167 : assert(Id && "TableId should be non-zero");
168 5958755 : return IdToValueMap[Id];
169 : }
170 :
171 : public:
172 1288200 : explicit DAGTypeLegalizer(SelectionDAG &dag)
173 1288200 : : TLI(dag.getTargetLoweringInfo()), DAG(dag),
174 1288200 : ValueTypeActions(TLI.getValueTypeActions()) {
175 : static_assert(MVT::LAST_VALUETYPE <= MVT::MAX_ALLOWED_VALUETYPE,
176 : "Too many value types for ValueTypeActions to hold!");
177 1288201 : }
178 :
179 : /// This is the main entry point for the type legalizer. This does a
180 : /// top-down traversal of the dag, legalizing types as it goes. Returns
181 : /// "true" if it made any changes.
182 : bool run();
183 :
184 445 : void NoteDeletion(SDNode *Old, SDNode *New) {
185 891 : for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i) {
186 446 : TableId NewId = getTableId(SDValue(New, i));
187 446 : TableId OldId = getTableId(SDValue(Old, i));
188 :
189 446 : if (OldId != NewId)
190 446 : ReplacedValues[OldId] = NewId;
191 :
192 : // Delete Node from tables.
193 892 : ValueToIdMap.erase(SDValue(Old, i));
194 446 : IdToValueMap.erase(OldId);
195 446 : PromotedIntegers.erase(OldId);
196 446 : ExpandedIntegers.erase(OldId);
197 446 : SoftenedFloats.erase(OldId);
198 446 : PromotedFloats.erase(OldId);
199 446 : ExpandedFloats.erase(OldId);
200 446 : ScalarizedVectors.erase(OldId);
201 446 : SplitVectors.erase(OldId);
202 446 : WidenedVectors.erase(OldId);
203 : }
204 445 : }
205 :
206 0 : SelectionDAG &getDAG() const { return DAG; }
207 :
208 : private:
209 : SDNode *AnalyzeNewNode(SDNode *N);
210 : void AnalyzeNewValue(SDValue &Val);
211 : void PerformExpensiveChecks();
212 : void RemapId(TableId &Id);
213 : void RemapValue(SDValue &V);
214 :
215 : // Common routines.
216 : SDValue BitConvertToInteger(SDValue Op);
217 : SDValue BitConvertVectorToIntegerVector(SDValue Op);
218 : SDValue CreateStackStoreLoad(SDValue Op, EVT DestVT);
219 : bool CustomLowerNode(SDNode *N, EVT VT, bool LegalizeResult);
220 : bool CustomWidenLowerNode(SDNode *N, EVT VT);
221 :
222 : /// Replace each result of the given MERGE_VALUES node with the corresponding
223 : /// input operand, except for the result 'ResNo', for which the corresponding
224 : /// input operand is returned.
225 : SDValue DisintegrateMERGE_VALUES(SDNode *N, unsigned ResNo);
226 :
227 : SDValue JoinIntegers(SDValue Lo, SDValue Hi);
228 : SDValue LibCallify(RTLIB::Libcall LC, SDNode *N, bool isSigned);
229 :
230 : std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,
231 : SDNode *Node, bool isSigned);
232 : std::pair<SDValue, SDValue> ExpandAtomic(SDNode *Node);
233 :
234 : SDValue PromoteTargetBoolean(SDValue Bool, EVT ValVT);
235 :
236 : void ReplaceValueWith(SDValue From, SDValue To);
237 : void SplitInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
238 : void SplitInteger(SDValue Op, EVT LoVT, EVT HiVT,
239 : SDValue &Lo, SDValue &Hi);
240 :
241 : void AddToWorklist(SDNode *N) {
242 : N->setNodeId(ReadyToProcess);
243 15301527 : Worklist.push_back(N);
244 : }
245 :
246 : //===--------------------------------------------------------------------===//
247 : // Integer Promotion Support: LegalizeIntegerTypes.cpp
248 : //===--------------------------------------------------------------------===//
249 :
250 : /// Given a processed operand Op which was promoted to a larger integer type,
251 : /// this returns the promoted value. The low bits of the promoted value
252 : /// corresponding to the original type are exactly equal to Op.
253 : /// The extra bits contain rubbish, so the promoted value may need to be zero-
254 : /// or sign-extended from the original type before it is usable (the helpers
255 : /// SExtPromotedInteger and ZExtPromotedInteger can do this for you).
256 : /// For example, if Op is an i16 and was promoted to an i32, then this method
257 : /// returns an i32, the lower 16 bits of which coincide with Op, and the upper
258 : /// 16 bits of which contain rubbish.
259 281946 : SDValue GetPromotedInteger(SDValue Op) {
260 281946 : TableId &PromotedId = PromotedIntegers[getTableId(Op)];
261 281946 : SDValue PromotedOp = getSDValue(PromotedId);
262 : assert(PromotedOp.getNode() && "Operand wasn't promoted?");
263 281946 : return PromotedOp;
264 : }
265 : void SetPromotedInteger(SDValue Op, SDValue Result);
266 :
267 : /// Get a promoted operand and sign extend it to the final size.
268 2478 : SDValue SExtPromotedInteger(SDValue Op) {
269 2478 : EVT OldVT = Op.getValueType();
270 : SDLoc dl(Op);
271 2478 : Op = GetPromotedInteger(Op);
272 2478 : return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Op.getValueType(), Op,
273 2478 : DAG.getValueType(OldVT));
274 : }
275 :
276 : /// Get a promoted operand and zero extend it to the final size.
277 16196 : SDValue ZExtPromotedInteger(SDValue Op) {
278 16196 : EVT OldVT = Op.getValueType();
279 : SDLoc dl(Op);
280 16196 : Op = GetPromotedInteger(Op);
281 16196 : return DAG.getZeroExtendInReg(Op, dl, OldVT.getScalarType());
282 : }
283 :
284 : // Integer Result Promotion.
285 : void PromoteIntegerResult(SDNode *N, unsigned ResNo);
286 : SDValue PromoteIntRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
287 : SDValue PromoteIntRes_AssertSext(SDNode *N);
288 : SDValue PromoteIntRes_AssertZext(SDNode *N);
289 : SDValue PromoteIntRes_Atomic0(AtomicSDNode *N);
290 : SDValue PromoteIntRes_Atomic1(AtomicSDNode *N);
291 : SDValue PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N, unsigned ResNo);
292 : SDValue PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N);
293 : SDValue PromoteIntRes_VECTOR_SHUFFLE(SDNode *N);
294 : SDValue PromoteIntRes_BUILD_VECTOR(SDNode *N);
295 : SDValue PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N);
296 : SDValue PromoteIntRes_EXTEND_VECTOR_INREG(SDNode *N);
297 : SDValue PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N);
298 : SDValue PromoteIntRes_CONCAT_VECTORS(SDNode *N);
299 : SDValue PromoteIntRes_BITCAST(SDNode *N);
300 : SDValue PromoteIntRes_BSWAP(SDNode *N);
301 : SDValue PromoteIntRes_BITREVERSE(SDNode *N);
302 : SDValue PromoteIntRes_BUILD_PAIR(SDNode *N);
303 : SDValue PromoteIntRes_Constant(SDNode *N);
304 : SDValue PromoteIntRes_CTLZ(SDNode *N);
305 : SDValue PromoteIntRes_CTPOP(SDNode *N);
306 : SDValue PromoteIntRes_CTTZ(SDNode *N);
307 : SDValue PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N);
308 : SDValue PromoteIntRes_FP_TO_XINT(SDNode *N);
309 : SDValue PromoteIntRes_FP_TO_FP16(SDNode *N);
310 : SDValue PromoteIntRes_INT_EXTEND(SDNode *N);
311 : SDValue PromoteIntRes_LOAD(LoadSDNode *N);
312 : SDValue PromoteIntRes_MLOAD(MaskedLoadSDNode *N);
313 : SDValue PromoteIntRes_MGATHER(MaskedGatherSDNode *N);
314 : SDValue PromoteIntRes_Overflow(SDNode *N);
315 : SDValue PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo);
316 : SDValue PromoteIntRes_SELECT(SDNode *N);
317 : SDValue PromoteIntRes_VSELECT(SDNode *N);
318 : SDValue PromoteIntRes_SELECT_CC(SDNode *N);
319 : SDValue PromoteIntRes_SETCC(SDNode *N);
320 : SDValue PromoteIntRes_SHL(SDNode *N);
321 : SDValue PromoteIntRes_SimpleIntBinOp(SDNode *N);
322 : SDValue PromoteIntRes_ZExtIntBinOp(SDNode *N);
323 : SDValue PromoteIntRes_SExtIntBinOp(SDNode *N);
324 : SDValue PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N);
325 : SDValue PromoteIntRes_SRA(SDNode *N);
326 : SDValue PromoteIntRes_SRL(SDNode *N);
327 : SDValue PromoteIntRes_TRUNCATE(SDNode *N);
328 : SDValue PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo);
329 : SDValue PromoteIntRes_ADDSUBCARRY(SDNode *N, unsigned ResNo);
330 : SDValue PromoteIntRes_UNDEF(SDNode *N);
331 : SDValue PromoteIntRes_VAARG(SDNode *N);
332 : SDValue PromoteIntRes_XMULO(SDNode *N, unsigned ResNo);
333 : SDValue PromoteIntRes_SADDSAT(SDNode *N);
334 :
335 : // Integer Operand Promotion.
336 : bool PromoteIntegerOperand(SDNode *N, unsigned OpNo);
337 : SDValue PromoteIntOp_ANY_EXTEND(SDNode *N);
338 : SDValue PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N);
339 : SDValue PromoteIntOp_BITCAST(SDNode *N);
340 : SDValue PromoteIntOp_BUILD_PAIR(SDNode *N);
341 : SDValue PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo);
342 : SDValue PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo);
343 : SDValue PromoteIntOp_BUILD_VECTOR(SDNode *N);
344 : SDValue PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N, unsigned OpNo);
345 : SDValue PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N);
346 : SDValue PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N);
347 : SDValue PromoteIntOp_CONCAT_VECTORS(SDNode *N);
348 : SDValue PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N);
349 : SDValue PromoteIntOp_SELECT(SDNode *N, unsigned OpNo);
350 : SDValue PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo);
351 : SDValue PromoteIntOp_SETCC(SDNode *N, unsigned OpNo);
352 : SDValue PromoteIntOp_Shift(SDNode *N);
353 : SDValue PromoteIntOp_SIGN_EXTEND(SDNode *N);
354 : SDValue PromoteIntOp_SINT_TO_FP(SDNode *N);
355 : SDValue PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo);
356 : SDValue PromoteIntOp_TRUNCATE(SDNode *N);
357 : SDValue PromoteIntOp_UINT_TO_FP(SDNode *N);
358 : SDValue PromoteIntOp_ZERO_EXTEND(SDNode *N);
359 : SDValue PromoteIntOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
360 : SDValue PromoteIntOp_MLOAD(MaskedLoadSDNode *N, unsigned OpNo);
361 : SDValue PromoteIntOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
362 : SDValue PromoteIntOp_MGATHER(MaskedGatherSDNode *N, unsigned OpNo);
363 : SDValue PromoteIntOp_ADDSUBCARRY(SDNode *N, unsigned OpNo);
364 :
365 : void PromoteSetCCOperands(SDValue &LHS,SDValue &RHS, ISD::CondCode Code);
366 :
367 : //===--------------------------------------------------------------------===//
368 : // Integer Expansion Support: LegalizeIntegerTypes.cpp
369 : //===--------------------------------------------------------------------===//
370 :
371 : /// Given a processed operand Op which was expanded into two integers of half
372 : /// the size, this returns the two halves. The low bits of Op are exactly
373 : /// equal to the bits of Lo; the high bits exactly equal Hi.
374 : /// For example, if Op is an i64 which was expanded into two i32's, then this
375 : /// method returns the two i32's, with Lo being equal to the lower 32 bits of
376 : /// Op, and Hi being equal to the upper 32 bits.
377 : void GetExpandedInteger(SDValue Op, SDValue &Lo, SDValue &Hi);
378 : void SetExpandedInteger(SDValue Op, SDValue Lo, SDValue Hi);
379 :
380 : // Integer Result Expansion.
381 : void ExpandIntegerResult(SDNode *N, unsigned ResNo);
382 : void ExpandIntRes_ANY_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
383 : void ExpandIntRes_AssertSext (SDNode *N, SDValue &Lo, SDValue &Hi);
384 : void ExpandIntRes_AssertZext (SDNode *N, SDValue &Lo, SDValue &Hi);
385 : void ExpandIntRes_Constant (SDNode *N, SDValue &Lo, SDValue &Hi);
386 : void ExpandIntRes_CTLZ (SDNode *N, SDValue &Lo, SDValue &Hi);
387 : void ExpandIntRes_CTPOP (SDNode *N, SDValue &Lo, SDValue &Hi);
388 : void ExpandIntRes_CTTZ (SDNode *N, SDValue &Lo, SDValue &Hi);
389 : void ExpandIntRes_LOAD (LoadSDNode *N, SDValue &Lo, SDValue &Hi);
390 : void ExpandIntRes_READCYCLECOUNTER (SDNode *N, SDValue &Lo, SDValue &Hi);
391 : void ExpandIntRes_SIGN_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
392 : void ExpandIntRes_SIGN_EXTEND_INREG (SDNode *N, SDValue &Lo, SDValue &Hi);
393 : void ExpandIntRes_TRUNCATE (SDNode *N, SDValue &Lo, SDValue &Hi);
394 : void ExpandIntRes_ZERO_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
395 : void ExpandIntRes_FLT_ROUNDS (SDNode *N, SDValue &Lo, SDValue &Hi);
396 : void ExpandIntRes_FP_TO_SINT (SDNode *N, SDValue &Lo, SDValue &Hi);
397 : void ExpandIntRes_FP_TO_UINT (SDNode *N, SDValue &Lo, SDValue &Hi);
398 :
399 : void ExpandIntRes_Logical (SDNode *N, SDValue &Lo, SDValue &Hi);
400 : void ExpandIntRes_ADDSUB (SDNode *N, SDValue &Lo, SDValue &Hi);
401 : void ExpandIntRes_ADDSUBC (SDNode *N, SDValue &Lo, SDValue &Hi);
402 : void ExpandIntRes_ADDSUBE (SDNode *N, SDValue &Lo, SDValue &Hi);
403 : void ExpandIntRes_ADDSUBCARRY (SDNode *N, SDValue &Lo, SDValue &Hi);
404 : void ExpandIntRes_BITREVERSE (SDNode *N, SDValue &Lo, SDValue &Hi);
405 : void ExpandIntRes_BSWAP (SDNode *N, SDValue &Lo, SDValue &Hi);
406 : void ExpandIntRes_MUL (SDNode *N, SDValue &Lo, SDValue &Hi);
407 : void ExpandIntRes_SDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
408 : void ExpandIntRes_SREM (SDNode *N, SDValue &Lo, SDValue &Hi);
409 : void ExpandIntRes_UDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
410 : void ExpandIntRes_UREM (SDNode *N, SDValue &Lo, SDValue &Hi);
411 : void ExpandIntRes_Shift (SDNode *N, SDValue &Lo, SDValue &Hi);
412 :
413 : void ExpandIntRes_MINMAX (SDNode *N, SDValue &Lo, SDValue &Hi);
414 :
415 : void ExpandIntRes_SADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
416 : void ExpandIntRes_UADDSUBO (SDNode *N, SDValue &Lo, SDValue &Hi);
417 : void ExpandIntRes_XMULO (SDNode *N, SDValue &Lo, SDValue &Hi);
418 : void ExpandIntRes_SADDSAT (SDNode *N, SDValue &Lo, SDValue &Hi);
419 :
420 : void ExpandIntRes_ATOMIC_LOAD (SDNode *N, SDValue &Lo, SDValue &Hi);
421 :
422 : void ExpandShiftByConstant(SDNode *N, const APInt &Amt,
423 : SDValue &Lo, SDValue &Hi);
424 : bool ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
425 : bool ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);
426 :
427 : // Integer Operand Expansion.
428 : bool ExpandIntegerOperand(SDNode *N, unsigned OpNo);
429 : SDValue ExpandIntOp_BR_CC(SDNode *N);
430 : SDValue ExpandIntOp_SELECT_CC(SDNode *N);
431 : SDValue ExpandIntOp_SETCC(SDNode *N);
432 : SDValue ExpandIntOp_SETCCCARRY(SDNode *N);
433 : SDValue ExpandIntOp_Shift(SDNode *N);
434 : SDValue ExpandIntOp_SINT_TO_FP(SDNode *N);
435 : SDValue ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo);
436 : SDValue ExpandIntOp_TRUNCATE(SDNode *N);
437 : SDValue ExpandIntOp_UINT_TO_FP(SDNode *N);
438 : SDValue ExpandIntOp_RETURNADDR(SDNode *N);
439 : SDValue ExpandIntOp_ATOMIC_STORE(SDNode *N);
440 :
441 : void IntegerExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
442 : ISD::CondCode &CCCode, const SDLoc &dl);
443 :
444 : //===--------------------------------------------------------------------===//
445 : // Float to Integer Conversion Support: LegalizeFloatTypes.cpp
446 : //===--------------------------------------------------------------------===//
447 :
448 : /// Given an operand Op of Float type, returns the integer if the Op is not
449 : /// supported in target HW and converted to the integer.
450 : /// The integer contains exactly the same bits as Op - only the type changed.
451 : /// For example, if Op is an f32 which was softened to an i32, then this
452 : /// method returns an i32, the bits of which coincide with those of Op.
453 : /// If the Op can be efficiently supported in target HW or the operand must
454 : /// stay in a register, the Op is not converted to an integer.
455 : /// In that case, the given op is returned.
456 4536 : SDValue GetSoftenedFloat(SDValue Op) {
457 4536 : TableId Id = getTableId(Op);
458 4536 : auto Iter = SoftenedFloats.find(Id);
459 4536 : if (Iter == SoftenedFloats.end()) {
460 : assert(isSimpleLegalType(Op.getValueType()) &&
461 : "Operand wasn't converted to integer?");
462 969 : return Op;
463 : }
464 3567 : SDValue SoftenedOp = getSDValue(Iter->second);
465 : assert(SoftenedOp.getNode() && "Unconverted op in SoftenedFloats?");
466 3567 : return SoftenedOp;
467 : }
468 : void SetSoftenedFloat(SDValue Op, SDValue Result);
469 :
470 : // Convert Float Results to Integer for Non-HW-supported Operations.
471 : bool SoftenFloatResult(SDNode *N, unsigned ResNo);
472 : SDValue SoftenFloatRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
473 : SDValue SoftenFloatRes_BITCAST(SDNode *N, unsigned ResNo);
474 : SDValue SoftenFloatRes_BUILD_PAIR(SDNode *N);
475 : SDValue SoftenFloatRes_ConstantFP(SDNode *N, unsigned ResNo);
476 : SDValue SoftenFloatRes_EXTRACT_VECTOR_ELT(SDNode *N, unsigned ResNo);
477 : SDValue SoftenFloatRes_FABS(SDNode *N, unsigned ResNo);
478 : SDValue SoftenFloatRes_FMINNUM(SDNode *N);
479 : SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
480 : SDValue SoftenFloatRes_FADD(SDNode *N);
481 : SDValue SoftenFloatRes_FCEIL(SDNode *N);
482 : SDValue SoftenFloatRes_FCOPYSIGN(SDNode *N, unsigned ResNo);
483 : SDValue SoftenFloatRes_FCOS(SDNode *N);
484 : SDValue SoftenFloatRes_FDIV(SDNode *N);
485 : SDValue SoftenFloatRes_FEXP(SDNode *N);
486 : SDValue SoftenFloatRes_FEXP2(SDNode *N);
487 : SDValue SoftenFloatRes_FFLOOR(SDNode *N);
488 : SDValue SoftenFloatRes_FLOG(SDNode *N);
489 : SDValue SoftenFloatRes_FLOG2(SDNode *N);
490 : SDValue SoftenFloatRes_FLOG10(SDNode *N);
491 : SDValue SoftenFloatRes_FMA(SDNode *N);
492 : SDValue SoftenFloatRes_FMUL(SDNode *N);
493 : SDValue SoftenFloatRes_FNEARBYINT(SDNode *N);
494 : SDValue SoftenFloatRes_FNEG(SDNode *N, unsigned ResNo);
495 : SDValue SoftenFloatRes_FP_EXTEND(SDNode *N);
496 : SDValue SoftenFloatRes_FP16_TO_FP(SDNode *N);
497 : SDValue SoftenFloatRes_FP_ROUND(SDNode *N);
498 : SDValue SoftenFloatRes_FPOW(SDNode *N);
499 : SDValue SoftenFloatRes_FPOWI(SDNode *N);
500 : SDValue SoftenFloatRes_FREM(SDNode *N);
501 : SDValue SoftenFloatRes_FRINT(SDNode *N);
502 : SDValue SoftenFloatRes_FROUND(SDNode *N);
503 : SDValue SoftenFloatRes_FSIN(SDNode *N);
504 : SDValue SoftenFloatRes_FSQRT(SDNode *N);
505 : SDValue SoftenFloatRes_FSUB(SDNode *N);
506 : SDValue SoftenFloatRes_FTRUNC(SDNode *N);
507 : SDValue SoftenFloatRes_LOAD(SDNode *N, unsigned ResNo);
508 : SDValue SoftenFloatRes_SELECT(SDNode *N, unsigned ResNo);
509 : SDValue SoftenFloatRes_SELECT_CC(SDNode *N, unsigned ResNo);
510 : SDValue SoftenFloatRes_UNDEF(SDNode *N);
511 : SDValue SoftenFloatRes_VAARG(SDNode *N);
512 : SDValue SoftenFloatRes_XINT_TO_FP(SDNode *N);
513 :
514 : // Return true if we can skip softening the given operand or SDNode because
515 : // either it was soften before by SoftenFloatResult and references to the
516 : // operand were replaced by ReplaceValueWith or it's value type is legal in HW
517 : // registers and the operand can be left unchanged.
518 : bool CanSkipSoftenFloatOperand(SDNode *N, unsigned OpNo);
519 :
520 : // Convert Float Operand to Integer for Non-HW-supported Operations.
521 : bool SoftenFloatOperand(SDNode *N, unsigned OpNo);
522 : SDValue SoftenFloatOp_BITCAST(SDNode *N);
523 : SDValue SoftenFloatOp_COPY_TO_REG(SDNode *N);
524 : SDValue SoftenFloatOp_BR_CC(SDNode *N);
525 : SDValue SoftenFloatOp_FABS(SDNode *N);
526 : SDValue SoftenFloatOp_FCOPYSIGN(SDNode *N);
527 : SDValue SoftenFloatOp_FNEG(SDNode *N);
528 : SDValue SoftenFloatOp_FP_EXTEND(SDNode *N);
529 : SDValue SoftenFloatOp_FP_ROUND(SDNode *N);
530 : SDValue SoftenFloatOp_FP_TO_XINT(SDNode *N);
531 : SDValue SoftenFloatOp_SELECT(SDNode *N);
532 : SDValue SoftenFloatOp_SELECT_CC(SDNode *N);
533 : SDValue SoftenFloatOp_SETCC(SDNode *N);
534 : SDValue SoftenFloatOp_STORE(SDNode *N, unsigned OpNo);
535 :
536 : //===--------------------------------------------------------------------===//
537 : // Float Expansion Support: LegalizeFloatTypes.cpp
538 : //===--------------------------------------------------------------------===//
539 :
540 : /// Given a processed operand Op which was expanded into two floating-point
541 : /// values of half the size, this returns the two halves.
542 : /// The low bits of Op are exactly equal to the bits of Lo; the high bits
543 : /// exactly equal Hi. For example, if Op is a ppcf128 which was expanded
544 : /// into two f64's, then this method returns the two f64's, with Lo being
545 : /// equal to the lower 64 bits of Op, and Hi to the upper 64 bits.
546 : void GetExpandedFloat(SDValue Op, SDValue &Lo, SDValue &Hi);
547 : void SetExpandedFloat(SDValue Op, SDValue Lo, SDValue Hi);
548 :
549 : // Float Result Expansion.
550 : void ExpandFloatResult(SDNode *N, unsigned ResNo);
551 : void ExpandFloatRes_ConstantFP(SDNode *N, SDValue &Lo, SDValue &Hi);
552 : void ExpandFloatRes_FABS (SDNode *N, SDValue &Lo, SDValue &Hi);
553 : void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
554 : void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
555 : void ExpandFloatRes_FADD (SDNode *N, SDValue &Lo, SDValue &Hi);
556 : void ExpandFloatRes_FCEIL (SDNode *N, SDValue &Lo, SDValue &Hi);
557 : void ExpandFloatRes_FCOPYSIGN (SDNode *N, SDValue &Lo, SDValue &Hi);
558 : void ExpandFloatRes_FCOS (SDNode *N, SDValue &Lo, SDValue &Hi);
559 : void ExpandFloatRes_FDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
560 : void ExpandFloatRes_FEXP (SDNode *N, SDValue &Lo, SDValue &Hi);
561 : void ExpandFloatRes_FEXP2 (SDNode *N, SDValue &Lo, SDValue &Hi);
562 : void ExpandFloatRes_FFLOOR (SDNode *N, SDValue &Lo, SDValue &Hi);
563 : void ExpandFloatRes_FLOG (SDNode *N, SDValue &Lo, SDValue &Hi);
564 : void ExpandFloatRes_FLOG2 (SDNode *N, SDValue &Lo, SDValue &Hi);
565 : void ExpandFloatRes_FLOG10 (SDNode *N, SDValue &Lo, SDValue &Hi);
566 : void ExpandFloatRes_FMA (SDNode *N, SDValue &Lo, SDValue &Hi);
567 : void ExpandFloatRes_FMUL (SDNode *N, SDValue &Lo, SDValue &Hi);
568 : void ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &Lo, SDValue &Hi);
569 : void ExpandFloatRes_FNEG (SDNode *N, SDValue &Lo, SDValue &Hi);
570 : void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
571 : void ExpandFloatRes_FPOW (SDNode *N, SDValue &Lo, SDValue &Hi);
572 : void ExpandFloatRes_FPOWI (SDNode *N, SDValue &Lo, SDValue &Hi);
573 : void ExpandFloatRes_FREM (SDNode *N, SDValue &Lo, SDValue &Hi);
574 : void ExpandFloatRes_FRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
575 : void ExpandFloatRes_FROUND (SDNode *N, SDValue &Lo, SDValue &Hi);
576 : void ExpandFloatRes_FSIN (SDNode *N, SDValue &Lo, SDValue &Hi);
577 : void ExpandFloatRes_FSQRT (SDNode *N, SDValue &Lo, SDValue &Hi);
578 : void ExpandFloatRes_FSUB (SDNode *N, SDValue &Lo, SDValue &Hi);
579 : void ExpandFloatRes_FTRUNC (SDNode *N, SDValue &Lo, SDValue &Hi);
580 : void ExpandFloatRes_LOAD (SDNode *N, SDValue &Lo, SDValue &Hi);
581 : void ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &Lo, SDValue &Hi);
582 :
583 : // Float Operand Expansion.
584 : bool ExpandFloatOperand(SDNode *N, unsigned OpNo);
585 : SDValue ExpandFloatOp_BR_CC(SDNode *N);
586 : SDValue ExpandFloatOp_FCOPYSIGN(SDNode *N);
587 : SDValue ExpandFloatOp_FP_ROUND(SDNode *N);
588 : SDValue ExpandFloatOp_FP_TO_SINT(SDNode *N);
589 : SDValue ExpandFloatOp_FP_TO_UINT(SDNode *N);
590 : SDValue ExpandFloatOp_SELECT_CC(SDNode *N);
591 : SDValue ExpandFloatOp_SETCC(SDNode *N);
592 : SDValue ExpandFloatOp_STORE(SDNode *N, unsigned OpNo);
593 :
594 : void FloatExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
595 : ISD::CondCode &CCCode, const SDLoc &dl);
596 :
597 : //===--------------------------------------------------------------------===//
598 : // Float promotion support: LegalizeFloatTypes.cpp
599 : //===--------------------------------------------------------------------===//
600 :
601 6145 : SDValue GetPromotedFloat(SDValue Op) {
602 6145 : TableId &PromotedId = PromotedFloats[getTableId(Op)];
603 6145 : SDValue PromotedOp = getSDValue(PromotedId);
604 : assert(PromotedOp.getNode() && "Operand wasn't promoted?");
605 6145 : return PromotedOp;
606 : }
607 : void SetPromotedFloat(SDValue Op, SDValue Result);
608 :
609 : void PromoteFloatResult(SDNode *N, unsigned ResNo);
610 : SDValue PromoteFloatRes_BITCAST(SDNode *N);
611 : SDValue PromoteFloatRes_BinOp(SDNode *N);
612 : SDValue PromoteFloatRes_ConstantFP(SDNode *N);
613 : SDValue PromoteFloatRes_EXTRACT_VECTOR_ELT(SDNode *N);
614 : SDValue PromoteFloatRes_FCOPYSIGN(SDNode *N);
615 : SDValue PromoteFloatRes_FMAD(SDNode *N);
616 : SDValue PromoteFloatRes_FPOWI(SDNode *N);
617 : SDValue PromoteFloatRes_FP_ROUND(SDNode *N);
618 : SDValue PromoteFloatRes_LOAD(SDNode *N);
619 : SDValue PromoteFloatRes_SELECT(SDNode *N);
620 : SDValue PromoteFloatRes_SELECT_CC(SDNode *N);
621 : SDValue PromoteFloatRes_UnaryOp(SDNode *N);
622 : SDValue PromoteFloatRes_UNDEF(SDNode *N);
623 : SDValue PromoteFloatRes_XINT_TO_FP(SDNode *N);
624 :
625 : bool PromoteFloatOperand(SDNode *N, unsigned OpNo);
626 : SDValue PromoteFloatOp_BITCAST(SDNode *N, unsigned OpNo);
627 : SDValue PromoteFloatOp_FCOPYSIGN(SDNode *N, unsigned OpNo);
628 : SDValue PromoteFloatOp_FP_EXTEND(SDNode *N, unsigned OpNo);
629 : SDValue PromoteFloatOp_FP_TO_XINT(SDNode *N, unsigned OpNo);
630 : SDValue PromoteFloatOp_STORE(SDNode *N, unsigned OpNo);
631 : SDValue PromoteFloatOp_SELECT_CC(SDNode *N, unsigned OpNo);
632 : SDValue PromoteFloatOp_SETCC(SDNode *N, unsigned OpNo);
633 :
634 : //===--------------------------------------------------------------------===//
635 : // Scalarization Support: LegalizeVectorTypes.cpp
636 : //===--------------------------------------------------------------------===//
637 :
638 : /// Given a processed one-element vector Op which was scalarized to its
639 : /// element type, this returns the element. For example, if Op is a v1i32,
640 : /// Op = < i32 val >, this method returns val, an i32.
641 63730 : SDValue GetScalarizedVector(SDValue Op) {
642 63730 : TableId &ScalarizedId = ScalarizedVectors[getTableId(Op)];
643 63730 : SDValue ScalarizedOp = getSDValue(ScalarizedId);
644 : assert(ScalarizedOp.getNode() && "Operand wasn't scalarized?");
645 63730 : return ScalarizedOp;
646 : }
647 : void SetScalarizedVector(SDValue Op, SDValue Result);
648 :
649 : // Vector Result Scalarization: <1 x ty> -> ty.
650 : void ScalarizeVectorResult(SDNode *N, unsigned ResNo);
651 : SDValue ScalarizeVecRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
652 : SDValue ScalarizeVecRes_BinOp(SDNode *N);
653 : SDValue ScalarizeVecRes_TernaryOp(SDNode *N);
654 : SDValue ScalarizeVecRes_UnaryOp(SDNode *N);
655 : SDValue ScalarizeVecRes_StrictFPOp(SDNode *N);
656 : SDValue ScalarizeVecRes_InregOp(SDNode *N);
657 : SDValue ScalarizeVecRes_VecInregOp(SDNode *N);
658 :
659 : SDValue ScalarizeVecRes_BITCAST(SDNode *N);
660 : SDValue ScalarizeVecRes_BUILD_VECTOR(SDNode *N);
661 : SDValue ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N);
662 : SDValue ScalarizeVecRes_FP_ROUND(SDNode *N);
663 : SDValue ScalarizeVecRes_FPOWI(SDNode *N);
664 : SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
665 : SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
666 : SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
667 : SDValue ScalarizeVecRes_VSELECT(SDNode *N);
668 : SDValue ScalarizeVecRes_SELECT(SDNode *N);
669 : SDValue ScalarizeVecRes_SELECT_CC(SDNode *N);
670 : SDValue ScalarizeVecRes_SETCC(SDNode *N);
671 : SDValue ScalarizeVecRes_UNDEF(SDNode *N);
672 : SDValue ScalarizeVecRes_VECTOR_SHUFFLE(SDNode *N);
673 :
674 : // Vector Operand Scalarization: <1 x ty> -> ty.
675 : bool ScalarizeVectorOperand(SDNode *N, unsigned OpNo);
676 : SDValue ScalarizeVecOp_BITCAST(SDNode *N);
677 : SDValue ScalarizeVecOp_UnaryOp(SDNode *N);
678 : SDValue ScalarizeVecOp_CONCAT_VECTORS(SDNode *N);
679 : SDValue ScalarizeVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
680 : SDValue ScalarizeVecOp_VSELECT(SDNode *N);
681 : SDValue ScalarizeVecOp_VSETCC(SDNode *N);
682 : SDValue ScalarizeVecOp_STORE(StoreSDNode *N, unsigned OpNo);
683 : SDValue ScalarizeVecOp_FP_ROUND(SDNode *N, unsigned OpNo);
684 :
685 : //===--------------------------------------------------------------------===//
686 : // Vector Splitting Support: LegalizeVectorTypes.cpp
687 : //===--------------------------------------------------------------------===//
688 :
689 : /// Given a processed vector Op which was split into vectors of half the size,
690 : /// this method returns the halves. The first elements of Op coincide with the
691 : /// elements of Lo; the remaining elements of Op coincide with the elements of
692 : /// Hi: Op is what you would get by concatenating Lo and Hi.
693 : /// For example, if Op is a v8i32 that was split into two v4i32's, then this
694 : /// method returns the two v4i32's, with Lo corresponding to the first 4
695 : /// elements of Op, and Hi to the last 4 elements.
696 : void GetSplitVector(SDValue Op, SDValue &Lo, SDValue &Hi);
697 : void SetSplitVector(SDValue Op, SDValue Lo, SDValue Hi);
698 :
699 : // Vector Result Splitting: <128 x ty> -> 2 x <64 x ty>.
700 : void SplitVectorResult(SDNode *N, unsigned ResNo);
701 : void SplitVecRes_BinOp(SDNode *N, SDValue &Lo, SDValue &Hi);
702 : void SplitVecRes_TernaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
703 : void SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo, SDValue &Hi);
704 : void SplitVecRes_ExtendOp(SDNode *N, SDValue &Lo, SDValue &Hi);
705 : void SplitVecRes_InregOp(SDNode *N, SDValue &Lo, SDValue &Hi);
706 : void SplitVecRes_ExtVecInRegOp(SDNode *N, SDValue &Lo, SDValue &Hi);
707 : void SplitVecRes_StrictFPOp(SDNode *N, SDValue &Lo, SDValue &Hi);
708 :
709 : void SplitVecRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi);
710 : void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
711 : void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo, SDValue &Hi);
712 : void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
713 : void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
714 : void SplitVecRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi);
715 : void SplitVecRes_FCOPYSIGN(SDNode *N, SDValue &Lo, SDValue &Hi);
716 : void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
717 : void SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo, SDValue &Hi);
718 : void SplitVecRes_MLOAD(MaskedLoadSDNode *MLD, SDValue &Lo, SDValue &Hi);
719 : void SplitVecRes_MGATHER(MaskedGatherSDNode *MGT, SDValue &Lo, SDValue &Hi);
720 : void SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &Lo, SDValue &Hi);
721 : void SplitVecRes_SETCC(SDNode *N, SDValue &Lo, SDValue &Hi);
722 : void SplitVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N, SDValue &Lo,
723 : SDValue &Hi);
724 :
725 : // Vector Operand Splitting: <128 x ty> -> 2 x <64 x ty>.
726 : bool SplitVectorOperand(SDNode *N, unsigned OpNo);
727 : SDValue SplitVecOp_VSELECT(SDNode *N, unsigned OpNo);
728 : SDValue SplitVecOp_VECREDUCE(SDNode *N, unsigned OpNo);
729 : SDValue SplitVecOp_UnaryOp(SDNode *N);
730 : SDValue SplitVecOp_TruncateHelper(SDNode *N);
731 :
732 : SDValue SplitVecOp_BITCAST(SDNode *N);
733 : SDValue SplitVecOp_EXTRACT_SUBVECTOR(SDNode *N);
734 : SDValue SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
735 : SDValue SplitVecOp_ExtVecInRegOp(SDNode *N);
736 : SDValue SplitVecOp_STORE(StoreSDNode *N, unsigned OpNo);
737 : SDValue SplitVecOp_MSTORE(MaskedStoreSDNode *N, unsigned OpNo);
738 : SDValue SplitVecOp_MSCATTER(MaskedScatterSDNode *N, unsigned OpNo);
739 : SDValue SplitVecOp_MGATHER(MaskedGatherSDNode *MGT, unsigned OpNo);
740 : SDValue SplitVecOp_CONCAT_VECTORS(SDNode *N);
741 : SDValue SplitVecOp_VSETCC(SDNode *N);
742 : SDValue SplitVecOp_FP_ROUND(SDNode *N);
743 : SDValue SplitVecOp_FCOPYSIGN(SDNode *N);
744 :
745 : //===--------------------------------------------------------------------===//
746 : // Vector Widening Support: LegalizeVectorTypes.cpp
747 : //===--------------------------------------------------------------------===//
748 :
749 : /// Given a processed vector Op which was widened into a larger vector, this
750 : /// method returns the larger vector. The elements of the returned vector
751 : /// consist of the elements of Op followed by elements containing rubbish.
752 : /// For example, if Op is a v2i32 that was widened to a v4i32, then this
753 : /// method returns a v4i32 for which the first two elements are the same as
754 : /// those of Op, while the last two elements contain rubbish.
755 16943 : SDValue GetWidenedVector(SDValue Op) {
756 16943 : TableId &WidenedId = WidenedVectors[getTableId(Op)];
757 16943 : SDValue WidenedOp = getSDValue(WidenedId);
758 : assert(WidenedOp.getNode() && "Operand wasn't widened?");
759 16943 : return WidenedOp;
760 : }
761 : void SetWidenedVector(SDValue Op, SDValue Result);
762 :
763 : // Widen Vector Result Promotion.
764 : void WidenVectorResult(SDNode *N, unsigned ResNo);
765 : SDValue WidenVecRes_MERGE_VALUES(SDNode* N, unsigned ResNo);
766 : SDValue WidenVecRes_BITCAST(SDNode* N);
767 : SDValue WidenVecRes_BUILD_VECTOR(SDNode* N);
768 : SDValue WidenVecRes_CONCAT_VECTORS(SDNode* N);
769 : SDValue WidenVecRes_EXTEND_VECTOR_INREG(SDNode* N);
770 : SDValue WidenVecRes_EXTRACT_SUBVECTOR(SDNode* N);
771 : SDValue WidenVecRes_INSERT_VECTOR_ELT(SDNode* N);
772 : SDValue WidenVecRes_LOAD(SDNode* N);
773 : SDValue WidenVecRes_MLOAD(MaskedLoadSDNode* N);
774 : SDValue WidenVecRes_MGATHER(MaskedGatherSDNode* N);
775 : SDValue WidenVecRes_SCALAR_TO_VECTOR(SDNode* N);
776 : SDValue WidenVecRes_SELECT(SDNode* N);
777 : SDValue WidenVSELECTAndMask(SDNode *N);
778 : SDValue WidenVecRes_SELECT_CC(SDNode* N);
779 : SDValue WidenVecRes_SETCC(SDNode* N);
780 : SDValue WidenVecRes_UNDEF(SDNode *N);
781 : SDValue WidenVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N);
782 :
783 : SDValue WidenVecRes_Ternary(SDNode *N);
784 : SDValue WidenVecRes_Binary(SDNode *N);
785 : SDValue WidenVecRes_BinaryCanTrap(SDNode *N);
786 : SDValue WidenVecRes_StrictFP(SDNode *N);
787 : SDValue WidenVecRes_Convert(SDNode *N);
788 : SDValue WidenVecRes_FCOPYSIGN(SDNode *N);
789 : SDValue WidenVecRes_POWI(SDNode *N);
790 : SDValue WidenVecRes_Shift(SDNode *N);
791 : SDValue WidenVecRes_Unary(SDNode *N);
792 : SDValue WidenVecRes_InregOp(SDNode *N);
793 :
794 : // Widen Vector Operand.
795 : bool WidenVectorOperand(SDNode *N, unsigned OpNo);
796 : SDValue WidenVecOp_BITCAST(SDNode *N);
797 : SDValue WidenVecOp_CONCAT_VECTORS(SDNode *N);
798 : SDValue WidenVecOp_EXTEND(SDNode *N);
799 : SDValue WidenVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
800 : SDValue WidenVecOp_EXTRACT_SUBVECTOR(SDNode *N);
801 : SDValue WidenVecOp_STORE(SDNode* N);
802 : SDValue WidenVecOp_MSTORE(SDNode* N, unsigned OpNo);
803 : SDValue WidenVecOp_MGATHER(SDNode* N, unsigned OpNo);
804 : SDValue WidenVecOp_MSCATTER(SDNode* N, unsigned OpNo);
805 : SDValue WidenVecOp_SETCC(SDNode* N);
806 :
807 : SDValue WidenVecOp_Convert(SDNode *N);
808 : SDValue WidenVecOp_FCOPYSIGN(SDNode *N);
809 :
810 : //===--------------------------------------------------------------------===//
811 : // Vector Widening Utilities Support: LegalizeVectorTypes.cpp
812 : //===--------------------------------------------------------------------===//
813 :
814 : /// Helper function to generate a set of loads to load a vector with a
815 : /// resulting wider type. It takes:
816 : /// LdChain: list of chains for the load to be generated.
817 : /// Ld: load to widen
818 : SDValue GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
819 : LoadSDNode *LD);
820 :
821 : /// Helper function to generate a set of extension loads to load a vector with
822 : /// a resulting wider type. It takes:
823 : /// LdChain: list of chains for the load to be generated.
824 : /// Ld: load to widen
825 : /// ExtType: extension element type
826 : SDValue GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
827 : LoadSDNode *LD, ISD::LoadExtType ExtType);
828 :
829 : /// Helper function to generate a set of stores to store a widen vector into
830 : /// non-widen memory.
831 : /// StChain: list of chains for the stores we have generated
832 : /// ST: store of a widen value
833 : void GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain, StoreSDNode *ST);
834 :
835 : /// Helper function to generate a set of stores to store a truncate widen
836 : /// vector into non-widen memory.
837 : /// StChain: list of chains for the stores we have generated
838 : /// ST: store of a widen value
839 : void GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
840 : StoreSDNode *ST);
841 :
842 : /// Modifies a vector input (widen or narrows) to a vector of NVT. The
843 : /// input vector must have the same element type as NVT.
844 : /// When FillWithZeroes is "on" the vector will be widened with zeroes.
845 : /// By default, the vector will be widened with undefined values.
846 : SDValue ModifyToType(SDValue InOp, EVT NVT, bool FillWithZeroes = false);
847 :
848 : /// Return a mask of vector type MaskVT to replace InMask. Also adjust
849 : /// MaskVT to ToMaskVT if needed with vector extension or truncation.
850 : SDValue convertMask(SDValue InMask, EVT MaskVT, EVT ToMaskVT);
851 :
852 : /// Get the target mask VT, and widen if needed.
853 : EVT getSETCCWidenedResultTy(SDValue SetCC);
854 :
855 : //===--------------------------------------------------------------------===//
856 : // Generic Splitting: LegalizeTypesGeneric.cpp
857 : //===--------------------------------------------------------------------===//
858 :
859 : // Legalization methods which only use that the illegal type is split into two
860 : // not necessarily identical types. As such they can be used for splitting
861 : // vectors and expanding integers and floats.
862 :
863 4949 : void GetSplitOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
864 9898 : if (Op.getValueType().isVector())
865 2550 : GetSplitVector(Op, Lo, Hi);
866 2399 : else if (Op.getValueType().isInteger())
867 2385 : GetExpandedInteger(Op, Lo, Hi);
868 : else
869 14 : GetExpandedFloat(Op, Lo, Hi);
870 4949 : }
871 :
872 : /// Use ISD::EXTRACT_ELEMENT nodes to extract the low and high parts of the
873 : /// given value.
874 : void GetPairElements(SDValue Pair, SDValue &Lo, SDValue &Hi);
875 :
876 : // Generic Result Splitting.
877 : void SplitRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
878 : SDValue &Lo, SDValue &Hi);
879 : void SplitRes_SELECT (SDNode *N, SDValue &Lo, SDValue &Hi);
880 : void SplitRes_SELECT_CC (SDNode *N, SDValue &Lo, SDValue &Hi);
881 : void SplitRes_UNDEF (SDNode *N, SDValue &Lo, SDValue &Hi);
882 :
883 : //===--------------------------------------------------------------------===//
884 : // Generic Expansion: LegalizeTypesGeneric.cpp
885 : //===--------------------------------------------------------------------===//
886 :
887 : // Legalization methods which only use that the illegal type is split into two
888 : // identical types of half the size, and that the Lo/Hi part is stored first
889 : // in memory on little/big-endian machines, followed by the Hi/Lo part. As
890 : // such they can be used for expanding integers and floats.
891 :
892 187166 : void GetExpandedOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
893 374332 : if (Op.getValueType().isInteger())
894 186951 : GetExpandedInteger(Op, Lo, Hi);
895 : else
896 215 : GetExpandedFloat(Op, Lo, Hi);
897 187166 : }
898 :
899 :
900 : /// This function will split the integer \p Op into \p NumElements
901 : /// operations of type \p EltVT and store them in \p Ops.
902 : void IntegerToVector(SDValue Op, unsigned NumElements,
903 : SmallVectorImpl<SDValue> &Ops, EVT EltVT);
904 :
905 : // Generic Result Expansion.
906 : void ExpandRes_MERGE_VALUES (SDNode *N, unsigned ResNo,
907 : SDValue &Lo, SDValue &Hi);
908 : void ExpandRes_BITCAST (SDNode *N, SDValue &Lo, SDValue &Hi);
909 : void ExpandRes_BUILD_PAIR (SDNode *N, SDValue &Lo, SDValue &Hi);
910 : void ExpandRes_EXTRACT_ELEMENT (SDNode *N, SDValue &Lo, SDValue &Hi);
911 : void ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
912 : void ExpandRes_NormalLoad (SDNode *N, SDValue &Lo, SDValue &Hi);
913 : void ExpandRes_VAARG (SDNode *N, SDValue &Lo, SDValue &Hi);
914 :
915 : // Generic Operand Expansion.
916 : SDValue ExpandOp_BITCAST (SDNode *N);
917 : SDValue ExpandOp_BUILD_VECTOR (SDNode *N);
918 : SDValue ExpandOp_EXTRACT_ELEMENT (SDNode *N);
919 : SDValue ExpandOp_INSERT_VECTOR_ELT(SDNode *N);
920 : SDValue ExpandOp_SCALAR_TO_VECTOR (SDNode *N);
921 : SDValue ExpandOp_NormalStore (SDNode *N, unsigned OpNo);
922 : };
923 :
924 : } // end namespace llvm.
925 :
926 : #endif
|