0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===-- SparcISelLowering.h - Sparc DAG Lowering Interface ------*- C++ -*-===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
147
|
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-exception
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 // This file defines the interfaces that Sparc uses to lower LLVM code into a
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 // selection DAG.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13
|
77
|
14 #ifndef LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H
|
|
15 #define LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 #include "Sparc.h"
|
134
|
18 #include "llvm/CodeGen/TargetLowering.h"
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 namespace llvm {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 class SparcSubtarget;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 namespace SPISD {
|
95
|
24 enum NodeType : unsigned {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 FIRST_NUMBER = ISD::BUILTIN_OP_END,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 CMPICC, // Compare two GPR operands, set icc+xcc.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 CMPFCC, // Compare two FP operands, set fcc.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 BRICC, // Branch to dest on icc condition
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 BRXCC, // Branch to dest on xcc condition (64-bit only).
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 BRFCC, // Branch to dest on fcc condition
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 SELECT_ICC, // Select between two values using the current ICC flags.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 SELECT_XCC, // Select between two values using the current XCC flags.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 SELECT_FCC, // Select between two values using the current FCC flags.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 Hi, Lo, // Hi/Lo operations, typically on a global address.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 FTOI, // FP to Int within a FP register.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 ITOF, // Int to FP within a FP register.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 FTOX, // FP to Int64 within a FP register.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 XTOF, // Int64 to FP within a FP register.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 CALL, // A call instruction.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 RET_FLAG, // Return with a flag operand.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 GLOBAL_BASE_REG, // Global base reg for PIC.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 FLUSHW, // FLUSH register windows to stack.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 TLS_ADD, // For Thread Local Storage (TLS).
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 TLS_LD,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 TLS_CALL
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 class SparcTargetLowering : public TargetLowering {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 const SparcSubtarget *Subtarget;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 public:
|
120
|
56 SparcTargetLowering(const TargetMachine &TM, const SparcSubtarget &STI);
|
77
|
57 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
|
147
|
58
|
120
|
59 bool useSoftFloat() const override;
|
147
|
60
|
77
|
61 /// computeKnownBitsForTargetNode - Determine which of the bits specified
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 /// in Mask are known to be either zero or one and return them in the
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 /// KnownZero/KnownOne bitsets.
|
77
|
64 void computeKnownBitsForTargetNode(const SDValue Op,
|
121
|
65 KnownBits &Known,
|
|
66 const APInt &DemandedElts,
|
77
|
67 const SelectionDAG &DAG,
|
|
68 unsigned Depth = 0) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69
|
77
|
70 MachineBasicBlock *
|
120
|
71 EmitInstrWithCustomInserter(MachineInstr &MI,
|
|
72 MachineBasicBlock *MBB) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73
|
77
|
74 const char *getTargetNodeName(unsigned Opcode) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75
|
95
|
76 ConstraintType getConstraintType(StringRef Constraint) const override;
|
77
|
77 ConstraintWeight
|
|
78 getSingleConstraintMatchWeight(AsmOperandInfo &info,
|
|
79 const char *constraint) const override;
|
|
80 void LowerAsmOperandForConstraint(SDValue Op,
|
|
81 std::string &Constraint,
|
|
82 std::vector<SDValue> &Ops,
|
|
83 SelectionDAG &DAG) const override;
|
120
|
84
|
|
85 unsigned
|
|
86 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
|
|
87 if (ConstraintCode == "o")
|
|
88 return InlineAsm::Constraint_o;
|
|
89 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
|
|
90 }
|
|
91
|
95
|
92 std::pair<unsigned, const TargetRegisterClass *>
|
|
93 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
|
94 StringRef Constraint, MVT VT) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95
|
77
|
96 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
|
95
|
97 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
|
|
98 return MVT::i32;
|
|
99 }
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100
|
120
|
101 unsigned getRegisterByName(const char* RegName, EVT VT,
|
|
102 SelectionDAG &DAG) const override;
|
|
103
|
100
|
104 /// If a physical register, this returns the register that receives the
|
|
105 /// exception address on entry to an EH pad.
|
|
106 unsigned
|
|
107 getExceptionPointerRegister(const Constant *PersonalityFn) const override {
|
|
108 return SP::I0;
|
|
109 }
|
|
110
|
|
111 /// If a physical register, this returns the register that receives the
|
|
112 /// exception typeid on entry to a landing pad.
|
|
113 unsigned
|
|
114 getExceptionSelectorRegister(const Constant *PersonalityFn) const override {
|
|
115 return SP::I1;
|
|
116 }
|
|
117
|
120
|
118 /// Override to support customized stack guard loading.
|
|
119 bool useLoadStackGuardNode() const override;
|
|
120 void insertSSPDeclarations(Module &M) const override;
|
|
121
|
33
|
122 /// getSetCCResultType - Return the ISD::SETCC ValueType
|
95
|
123 EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
|
|
124 EVT VT) const override;
|
33
|
125
|
77
|
126 SDValue
|
120
|
127 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
|
|
128 const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
129 const SDLoc &dl, SelectionDAG &DAG,
|
|
130 SmallVectorImpl<SDValue> &InVals) const override;
|
|
131 SDValue LowerFormalArguments_32(SDValue Chain, CallingConv::ID CallConv,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 bool isVarArg,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 const SmallVectorImpl<ISD::InputArg> &Ins,
|
120
|
134 const SDLoc &dl, SelectionDAG &DAG,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 SmallVectorImpl<SDValue> &InVals) const;
|
120
|
136 SDValue LowerFormalArguments_64(SDValue Chain, CallingConv::ID CallConv,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 bool isVarArg,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 const SmallVectorImpl<ISD::InputArg> &Ins,
|
120
|
139 const SDLoc &dl, SelectionDAG &DAG,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 SmallVectorImpl<SDValue> &InVals) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141
|
77
|
142 SDValue
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
77
|
144 SmallVectorImpl<SDValue> &InVals) const override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 SDValue LowerCall_32(TargetLowering::CallLoweringInfo &CLI,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 SmallVectorImpl<SDValue> &InVals) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 SDValue LowerCall_64(TargetLowering::CallLoweringInfo &CLI,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148 SmallVectorImpl<SDValue> &InVals) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149
|
120
|
150 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
|
|
151 const SmallVectorImpl<ISD::OutputArg> &Outs,
|
|
152 const SmallVectorImpl<SDValue> &OutVals,
|
|
153 const SDLoc &dl, SelectionDAG &DAG) const override;
|
|
154 SDValue LowerReturn_32(SDValue Chain, CallingConv::ID CallConv,
|
|
155 bool IsVarArg,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 const SmallVectorImpl<ISD::OutputArg> &Outs,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
157 const SmallVectorImpl<SDValue> &OutVals,
|
120
|
158 const SDLoc &DL, SelectionDAG &DAG) const;
|
|
159 SDValue LowerReturn_64(SDValue Chain, CallingConv::ID CallConv,
|
|
160 bool IsVarArg,
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 const SmallVectorImpl<ISD::OutputArg> &Outs,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 const SmallVectorImpl<SDValue> &OutVals,
|
120
|
163 const SDLoc &DL, SelectionDAG &DAG) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
165 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
167 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
168 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
170 SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171 SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
172 SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
173 SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
174
|
120
|
175 SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, SDValue Arg,
|
|
176 const SDLoc &DL, SelectionDAG &DAG) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 SDValue LowerF128Op(SDValue Op, SelectionDAG &DAG,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178 const char *LibFuncName,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 unsigned numArgs) const;
|
120
|
180 SDValue LowerF128Compare(SDValue LHS, SDValue RHS, unsigned &SPCC,
|
|
181 const SDLoc &DL, SelectionDAG &DAG) const;
|
|
182
|
|
183 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184
|
147
|
185 SDValue PerformBITCASTCombine(SDNode *N, DAGCombinerInfo &DCI) const;
|
|
186
|
|
187 SDValue bitcastConstantFPToInt(ConstantFPSDNode *C, const SDLoc &DL,
|
|
188 SelectionDAG &DAG) const;
|
|
189
|
|
190 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
|
|
191
|
77
|
192 bool ShouldShrinkFPConstant(EVT VT) const override {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 // Do not shrink FP constpool if VT == MVT::f128.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 // (ldd, call _Q_fdtoq) is more expensive than two ldds.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 return VT != MVT::f128;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
196 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197
|
120
|
198 bool shouldInsertFencesForAtomic(const Instruction *I) const override {
|
|
199 // FIXME: We insert fences for each atomics and generate
|
|
200 // sub-optimal code for PSO/TSO. (Approximately nobody uses any
|
|
201 // mode but TSO, which makes this even more silly)
|
|
202 return true;
|
|
203 }
|
|
204
|
|
205 AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
|
|
206
|
77
|
207 void ReplaceNodeResults(SDNode *N,
|
95
|
208 SmallVectorImpl<SDValue>& Results,
|
|
209 SelectionDAG &DAG) const override;
|
77
|
210
|
120
|
211 MachineBasicBlock *expandSelectCC(MachineInstr &MI, MachineBasicBlock *BB,
|
77
|
212 unsigned BROpcode) const;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 } // end namespace llvm
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 #endif // SPARC_ISELLOWERING_H
|