Handles custom instruction selections.
132 {
133
134 if (n->isMachineOpcode()) {
135 n->setNodeId(-1);
136 return;
137 }
138
139 SDLoc dl(n);
140 if (n->getOpcode() >= ISD::BUILTIN_OP_END &&
142
143 return;
144 } else if (n->getOpcode() == ISD::BR) {
145 SDValue chain = n->getOperand(0);
146
147 MachineBasicBlock* dest =
148 cast<BasicBlockSDNode>(n->getOperand(1))->getBasicBlock();
150 n, TCE::TCEBR, MVT::Other, CurDAG->getBasicBlock(dest), chain);
151 } else if (n->getOpcode() == ISD::FrameIndex) {
152 int fi = cast<FrameIndexSDNode>(n)->getIndex();
153
154 if (n->hasOneUse()) {
158 } else {
159 auto fiN = CurDAG->getMachineNode(
162 ReplaceNode(n, fiN);
163 return;
164 }
165 } else if (n->getOpcode() == ISD::VSELECT ||
166 (n->getOpcode() == ISD::SELECT &&
167 !n->getOperand(1).getValueType().isVector())) {
168 SDNode* node2 = dyn_cast<SDNode>(n->getOperand(0));
169 if (node2->getOpcode() == ISD::SETCC) {
170 SDValue val1 = n->getOperand(1);
171 SDValue val2 = n->getOperand(2);
172
173 SDValue n2val1 = node2->getOperand(0);
174 SDValue n2val2 = node2->getOperand(1);
175
176 if (val1 == n2val1 && val2 == n2val2 && node2->hasOneUse()) {
177 int opc;
178 ISD::CondCode cc = cast<CondCodeSDNode>(
179 node2->getOperand(2))->get();
180
181 switch (cc) {
182 case ISD::SETLT:
183 case ISD::SETLE:
184 case ISD::SETOLT:
185 case ISD::SETOLE:
187 if (opc != -1) {
189 n,opc, n->getSimpleValueType(0), val1, val2);
190 }
191 break;
192 case ISD::SETGT:
193 case ISD::SETGE:
194 case ISD::SETOGT:
195 case ISD::SETOGE:
197 if (opc != -1) {
199 n, opc, n->getSimpleValueType(0), val1, val2);
200 }
201 break;
202 case ISD::SETULT:
203 case ISD::SETULE:
205 if (opc != -1) {
207 n, opc, n->getSimpleValueType(0), val1, val2);
208 }
209 break;
210 case ISD::SETUGT:
211 case ISD::SETUGE:
213 if (opc != -1) {
215 n, opc, n->getSimpleValueType(0), val1, val2);
216 }
217 break;
218 default:
219 break;
220 }
221 }
222 }
223 } else if (n->getOpcode() == ISD::SHL ||
224 n->getOpcode() == ISD::SRA ||
225 n->getOpcode() == ISD::SRL) {
226 SDValue shifted = n->getOperand(0);
227 SDValue shifter = n->getOperand(1);
228 EVT shiftedVt = shifted.getValueType();
229 EVT shifterVt = shifter.getValueType();
230
231 } else if (n->getOpcode() == ISD::AND ||
232 n->getOpcode() == ISD::OR ||
233 n->getOpcode() == ISD::XOR) {
234 SDValue lhs = n->getOperand(0);
235 SDValue rhs = n->getOperand(1);
236 EVT lhsVt = lhs.getValueType();
237 EVT rhsVt = rhs.getValueType();
238 }
239
240 SelectCode(n);
241}
#define SELECT_NODE_AND_RETURN(args...)
int getMaxOpcode(llvm::SDNode *n)
int getMinuOpcode(llvm::SDNode *n)
int getMinOpcode(llvm::SDNode *n)
int getMaxuOpcode(llvm::SDNode *n)