36 #define DEBUG_TYPE "lanai-isel"
59 return "Lanai DAG->DAG Pattern Instruction Selection";
62 bool SelectInlineAsmMemoryOperand(
const SDValue &
Op,
unsigned ConstraintCode,
63 std::vector<SDValue> &OutOps)
override;
67 #include "LanaiGenDAGISel.inc"
74 void selectFrameIndex(
SDNode *
N);
107 if (canBeRepresentedAsSls(*CN)) {
108 int32_t
Imm = CN->getSExtValue();
109 Offset = CurDAG->getTargetConstant(
Imm,
DL, CN->getValueType(0));
130 int16_t
Imm = CN->getSExtValue();
131 Offset = CurDAG->getTargetConstant(
Imm,
DL, CN->getValueType(0));
132 Base = CurDAG->getRegister(Lanai::R0, CN->getValueType(0));
138 if (canBeRepresentedAsSls(*CN))
142 if (isInt<10>(CN->getSExtValue())) {
143 int16_t
Imm = CN->getSExtValue();
144 Offset = CurDAG->getTargetConstant(
Imm,
DL, CN->getValueType(0));
145 Base = CurDAG->getRegister(Lanai::R0, CN->getValueType(0));
154 Base = CurDAG->getTargetFrameIndex(
156 getTargetLowering()->getPointerTy(CurDAG->getDataLayout()));
173 if ((RiMode &&
isInt<16>(CN->getSExtValue())) ||
174 (!RiMode && isInt<10>(CN->getSExtValue()))) {
177 dyn_cast<FrameIndexSDNode>(
Addr.getOperand(0))) {
178 Base = CurDAG->getTargetFrameIndex(
180 getTargetLowering()->getPointerTy(CurDAG->getDataLayout()));
191 if (AluOperator ==
ISD::OR && RiMode &&
203 return selectAddrRiSpls(
Addr,
Base, Offset, AluOp,
true);
208 return selectAddrRiSpls(
Addr,
Base, Offset, AluOp,
false);
241 R1 =
Addr.getOperand(0);
251 bool LanaiDAGToDAGISel::SelectInlineAsmMemoryOperand(
252 const SDValue &
Op,
unsigned ConstraintCode, std::vector<SDValue> &OutOps) {
254 switch (ConstraintCode) {
258 if (!selectAddrRr(
Op, Op0, Op1, AluOp) &&
259 !selectAddrRi(
Op, Op0, Op1, AluOp))
264 OutOps.push_back(Op0);
265 OutOps.push_back(Op1);
266 OutOps.push_back(AluOp);
273 unsigned Opcode = Node->getOpcode();
276 if (Node->isMachineOpcode()) {
283 EVT VT = Node->getValueType(0);
290 if (ConstNode->
isZero()) {
291 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
293 return ReplaceNode(Node,
New.getNode());
298 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
300 return ReplaceNode(Node,
New.getNode());
305 selectFrameIndex(Node);
315 void LanaiDAGToDAGISel::selectFrameIndex(
SDNode *Node) {
318 int FI = cast<FrameIndexSDNode>(Node)->getIndex();
319 EVT VT = Node->getValueType(0);
320 SDValue TFI = CurDAG->getTargetFrameIndex(FI, VT);
321 unsigned Opc = Lanai::ADD_I_LO;
322 if (Node->hasOneUse()) {
323 CurDAG->SelectNodeTo(Node, Opc, VT, TFI,
Imm);
326 ReplaceNode(Node, CurDAG->getMachineNode(Opc,
DL, VT, TFI,
Imm));
332 return new LanaiDAGToDAGISel(
TM);