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