Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 1 | //===-- SparcISelLowering.h - Sparc DAG Lowering Interface ------*- 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 interfaces that Sparc uses to lower LLVM code into a |
| 11 | // selection DAG. |
| 12 | // |
| 13 | //===----------------------------------------------------------------------===// |
| 14 | |
Benjamin Kramer | a7c40ef | 2014-08-13 16:26:38 +0000 | [diff] [blame] | 15 | #ifndef LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H |
| 16 | #define LLVM_LIB_TARGET_SPARC_SPARCISELLOWERING_H |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 17 | |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 18 | #include "Sparc.h" |
Craig Topper | b25fda9 | 2012-03-17 18:46:09 +0000 | [diff] [blame] | 19 | #include "llvm/Target/TargetLowering.h" |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 20 | |
| 21 | namespace llvm { |
Jakob Stoklund Olesen | 5ad3b35 | 2013-04-02 04:08:54 +0000 | [diff] [blame] | 22 | class SparcSubtarget; |
| 23 | |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 24 | namespace SPISD { |
| 25 | enum { |
Dan Gohman | ed1cf1a | 2008-09-23 18:42:32 +0000 | [diff] [blame] | 26 | FIRST_NUMBER = ISD::BUILTIN_OP_END, |
Jakob Stoklund Olesen | d9bbdfd | 2013-04-03 04:41:44 +0000 | [diff] [blame] | 27 | CMPICC, // Compare two GPR operands, set icc+xcc. |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 28 | CMPFCC, // Compare two FP operands, set fcc. |
| 29 | BRICC, // Branch to dest on icc condition |
Jakob Stoklund Olesen | d9bbdfd | 2013-04-03 04:41:44 +0000 | [diff] [blame] | 30 | BRXCC, // Branch to dest on xcc condition (64-bit only). |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 31 | BRFCC, // Branch to dest on fcc condition |
| 32 | SELECT_ICC, // Select between two values using the current ICC flags. |
Jakob Stoklund Olesen | 8cfaffa | 2013-04-04 03:08:00 +0000 | [diff] [blame] | 33 | SELECT_XCC, // Select between two values using the current XCC flags. |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 34 | SELECT_FCC, // Select between two values using the current FCC flags. |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 35 | |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 36 | Hi, Lo, // Hi/Lo operations, typically on a global address. |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 37 | |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 38 | FTOI, // FP to Int within a FP register. |
| 39 | ITOF, // Int to FP within a FP register. |
Venkatraman Govindaraju | 5ae77f7 | 2013-11-03 12:28:40 +0000 | [diff] [blame] | 40 | FTOX, // FP to Int64 within a FP register. |
| 41 | XTOF, // Int64 to FP within a FP register. |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 42 | |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 43 | CALL, // A call instruction. |
Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 44 | RET_FLAG, // Return with a flag operand. |
Venkatraman Govindaraju | cb1dca6 | 2013-09-22 06:48:52 +0000 | [diff] [blame] | 45 | GLOBAL_BASE_REG, // Global base reg for PIC. |
| 46 | FLUSHW, // FLUSH register windows to stack. |
| 47 | |
| 48 | TLS_ADD, // For Thread Local Storage (TLS). |
| 49 | TLS_LD, |
| 50 | TLS_CALL |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 51 | }; |
| 52 | } |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 53 | |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 54 | class SparcTargetLowering : public TargetLowering { |
Jakob Stoklund Olesen | 5ad3b35 | 2013-04-02 04:08:54 +0000 | [diff] [blame] | 55 | const SparcSubtarget *Subtarget; |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 56 | public: |
Eric Christopher | f5e9406 | 2015-01-30 23:46:43 +0000 | [diff] [blame] | 57 | SparcTargetLowering(TargetMachine &TM, const SparcSubtarget &STI); |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 58 | SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 59 | |
Jay Foad | a0653a3 | 2014-05-14 21:14:37 +0000 | [diff] [blame] | 60 | /// computeKnownBitsForTargetNode - Determine which of the bits specified |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 61 | /// in Mask are known to be either zero or one and return them in the |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 62 | /// KnownZero/KnownOne bitsets. |
Jay Foad | a0653a3 | 2014-05-14 21:14:37 +0000 | [diff] [blame] | 63 | void computeKnownBitsForTargetNode(const SDValue Op, |
| 64 | APInt &KnownZero, |
| 65 | APInt &KnownOne, |
| 66 | const SelectionDAG &DAG, |
| 67 | unsigned Depth = 0) const override; |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 68 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 69 | MachineBasicBlock * |
Dan Gohman | 25c1653 | 2010-05-01 00:01:06 +0000 | [diff] [blame] | 70 | EmitInstrWithCustomInserter(MachineInstr *MI, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 71 | MachineBasicBlock *MBB) const override; |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 72 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 73 | const char *getTargetNodeName(unsigned Opcode) const override; |
Anton Korobeynikov | 281cf24 | 2008-10-10 20:28:10 +0000 | [diff] [blame] | 74 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 75 | ConstraintType getConstraintType(const std::string &Constraint) const override; |
Venkatraman Govindaraju | 407e442 | 2014-01-22 01:29:51 +0000 | [diff] [blame] | 76 | ConstraintWeight |
| 77 | getSingleConstraintMatchWeight(AsmOperandInfo &info, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 78 | const char *constraint) const override; |
Venkatraman Govindaraju | 407e442 | 2014-01-22 01:29:51 +0000 | [diff] [blame] | 79 | void LowerAsmOperandForConstraint(SDValue Op, |
| 80 | std::string &Constraint, |
| 81 | std::vector<SDValue> &Ops, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 82 | SelectionDAG &DAG) const override; |
Eric Christopher | 11e4df7 | 2015-02-26 22:38:43 +0000 | [diff] [blame] | 83 | std::pair<unsigned, const TargetRegisterClass *> |
| 84 | getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, |
| 85 | const std::string &Constraint, |
| 86 | MVT VT) const override; |
Dan Gohman | 2fe6bee | 2008-10-18 02:06:02 +0000 | [diff] [blame] | 87 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 88 | bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override; |
| 89 | MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i32; } |
Bill Wendling | 31ceb1b | 2009-06-30 22:38:32 +0000 | [diff] [blame] | 90 | |
Venkatraman Govindaraju | f6c8fe9 | 2013-12-09 04:02:15 +0000 | [diff] [blame] | 91 | /// getSetCCResultType - Return the ISD::SETCC ValueType |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 92 | EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override; |
Venkatraman Govindaraju | f6c8fe9 | 2013-12-09 04:02:15 +0000 | [diff] [blame] | 93 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 94 | SDValue |
Dan Gohman | f9bbcd1 | 2009-08-05 01:29:28 +0000 | [diff] [blame] | 95 | LowerFormalArguments(SDValue Chain, |
Sandeep Patel | 68c5f47 | 2009-09-02 08:44:58 +0000 | [diff] [blame] | 96 | CallingConv::ID CallConv, |
Dan Gohman | f9bbcd1 | 2009-08-05 01:29:28 +0000 | [diff] [blame] | 97 | bool isVarArg, |
| 98 | const SmallVectorImpl<ISD::InputArg> &Ins, |
Andrew Trick | ef9de2a | 2013-05-25 02:42:55 +0000 | [diff] [blame] | 99 | SDLoc dl, SelectionDAG &DAG, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 100 | SmallVectorImpl<SDValue> &InVals) const override; |
Jakob Stoklund Olesen | 0b21f35 | 2013-04-02 04:09:02 +0000 | [diff] [blame] | 101 | SDValue LowerFormalArguments_32(SDValue Chain, |
| 102 | CallingConv::ID CallConv, |
| 103 | bool isVarArg, |
| 104 | const SmallVectorImpl<ISD::InputArg> &Ins, |
Andrew Trick | ef9de2a | 2013-05-25 02:42:55 +0000 | [diff] [blame] | 105 | SDLoc dl, SelectionDAG &DAG, |
Jakob Stoklund Olesen | 0b21f35 | 2013-04-02 04:09:02 +0000 | [diff] [blame] | 106 | SmallVectorImpl<SDValue> &InVals) const; |
| 107 | SDValue LowerFormalArguments_64(SDValue Chain, |
| 108 | CallingConv::ID CallConv, |
| 109 | bool isVarArg, |
| 110 | const SmallVectorImpl<ISD::InputArg> &Ins, |
Andrew Trick | ef9de2a | 2013-05-25 02:42:55 +0000 | [diff] [blame] | 111 | SDLoc dl, SelectionDAG &DAG, |
Jakob Stoklund Olesen | 0b21f35 | 2013-04-02 04:09:02 +0000 | [diff] [blame] | 112 | SmallVectorImpl<SDValue> &InVals) const; |
Dan Gohman | f9bbcd1 | 2009-08-05 01:29:28 +0000 | [diff] [blame] | 113 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 114 | SDValue |
Justin Holewinski | aa58397 | 2012-05-25 16:35:28 +0000 | [diff] [blame] | 115 | LowerCall(TargetLowering::CallLoweringInfo &CLI, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 116 | SmallVectorImpl<SDValue> &InVals) const override; |
Jakob Stoklund Olesen | a30f483 | 2013-04-07 19:10:57 +0000 | [diff] [blame] | 117 | SDValue LowerCall_32(TargetLowering::CallLoweringInfo &CLI, |
| 118 | SmallVectorImpl<SDValue> &InVals) const; |
| 119 | SDValue LowerCall_64(TargetLowering::CallLoweringInfo &CLI, |
| 120 | SmallVectorImpl<SDValue> &InVals) const; |
Dan Gohman | f9bbcd1 | 2009-08-05 01:29:28 +0000 | [diff] [blame] | 121 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 122 | SDValue |
Dan Gohman | f9bbcd1 | 2009-08-05 01:29:28 +0000 | [diff] [blame] | 123 | LowerReturn(SDValue Chain, |
Sandeep Patel | 68c5f47 | 2009-09-02 08:44:58 +0000 | [diff] [blame] | 124 | CallingConv::ID CallConv, bool isVarArg, |
Dan Gohman | f9bbcd1 | 2009-08-05 01:29:28 +0000 | [diff] [blame] | 125 | const SmallVectorImpl<ISD::OutputArg> &Outs, |
Dan Gohman | fe7532a | 2010-07-07 15:54:55 +0000 | [diff] [blame] | 126 | const SmallVectorImpl<SDValue> &OutVals, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 127 | SDLoc dl, SelectionDAG &DAG) const override; |
Jakob Stoklund Olesen | edaf66b | 2013-04-06 23:57:33 +0000 | [diff] [blame] | 128 | SDValue LowerReturn_32(SDValue Chain, |
| 129 | CallingConv::ID CallConv, bool IsVarArg, |
| 130 | const SmallVectorImpl<ISD::OutputArg> &Outs, |
| 131 | const SmallVectorImpl<SDValue> &OutVals, |
Andrew Trick | ef9de2a | 2013-05-25 02:42:55 +0000 | [diff] [blame] | 132 | SDLoc DL, SelectionDAG &DAG) const; |
Jakob Stoklund Olesen | edaf66b | 2013-04-06 23:57:33 +0000 | [diff] [blame] | 133 | SDValue LowerReturn_64(SDValue Chain, |
| 134 | CallingConv::ID CallConv, bool IsVarArg, |
| 135 | const SmallVectorImpl<ISD::OutputArg> &Outs, |
| 136 | const SmallVectorImpl<SDValue> &OutVals, |
Andrew Trick | ef9de2a | 2013-05-25 02:42:55 +0000 | [diff] [blame] | 137 | SDLoc DL, SelectionDAG &DAG) const; |
Chris Lattner | 840c700 | 2009-09-15 17:46:24 +0000 | [diff] [blame] | 138 | |
Dan Gohman | 21cea8a | 2010-04-17 15:26:15 +0000 | [diff] [blame] | 139 | SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; |
Venkatraman Govindaraju | cb1dca6 | 2013-09-22 06:48:52 +0000 | [diff] [blame] | 140 | SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; |
Dan Gohman | 21cea8a | 2010-04-17 15:26:15 +0000 | [diff] [blame] | 141 | SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; |
Venkatraman Govindaraju | f80d72f | 2013-06-03 05:58:33 +0000 | [diff] [blame] | 142 | SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; |
Venkatraman Govindaraju | a82203f | 2011-02-21 03:42:44 +0000 | [diff] [blame] | 143 | |
| 144 | unsigned getSRetArgSize(SelectionDAG &DAG, SDValue Callee) const; |
Jakob Stoklund Olesen | 1fb08a8 | 2013-04-14 01:33:32 +0000 | [diff] [blame] | 145 | SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const; |
| 146 | SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF, |
| 147 | SelectionDAG &DAG) const; |
Jakob Stoklund Olesen | e0fc832 | 2013-04-14 04:35:16 +0000 | [diff] [blame] | 148 | SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const; |
Venkatraman Govindaraju | 59039dc | 2013-09-03 04:11:59 +0000 | [diff] [blame] | 149 | |
| 150 | SDValue LowerF128_LibCallArg(SDValue Chain, ArgListTy &Args, |
| 151 | SDValue Arg, SDLoc DL, |
| 152 | SelectionDAG &DAG) const; |
| 153 | SDValue LowerF128Op(SDValue Op, SelectionDAG &DAG, |
| 154 | const char *LibFuncName, |
| 155 | unsigned numArgs) const; |
| 156 | SDValue LowerF128Compare(SDValue LHS, SDValue RHS, |
| 157 | unsigned &SPCC, |
| 158 | SDLoc DL, |
| 159 | SelectionDAG &DAG) const; |
| 160 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 161 | bool ShouldShrinkFPConstant(EVT VT) const override { |
Venkatraman Govindaraju | 59039dc | 2013-09-03 04:11:59 +0000 | [diff] [blame] | 162 | // Do not shrink FP constpool if VT == MVT::f128. |
| 163 | // (ldd, call _Q_fdtoq) is more expensive than two ldds. |
| 164 | return VT != MVT::f128; |
| 165 | } |
Venkatraman Govindaraju | 5ae77f7 | 2013-11-03 12:28:40 +0000 | [diff] [blame] | 166 | |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 167 | void ReplaceNodeResults(SDNode *N, |
Venkatraman Govindaraju | 5ae77f7 | 2013-11-03 12:28:40 +0000 | [diff] [blame] | 168 | SmallVectorImpl<SDValue>& Results, |
Craig Topper | b0c941b | 2014-04-29 07:57:13 +0000 | [diff] [blame] | 169 | SelectionDAG &DAG) const override; |
Jakob Stoklund Olesen | 05ae2d6 | 2014-01-24 06:23:31 +0000 | [diff] [blame] | 170 | |
| 171 | MachineBasicBlock *expandSelectCC(MachineInstr *MI, MachineBasicBlock *BB, |
| 172 | unsigned BROpcode) const; |
| 173 | MachineBasicBlock *expandAtomicRMW(MachineInstr *MI, |
| 174 | MachineBasicBlock *BB, |
| 175 | unsigned Opcode, |
| 176 | unsigned CondCode = 0) const; |
Chris Lattner | 0a1762e | 2008-03-17 03:21:36 +0000 | [diff] [blame] | 177 | }; |
| 178 | } // end namespace llvm |
| 179 | |
| 180 | #endif // SPARC_ISELLOWERING_H |