36 #define DEBUG_TYPE "lanai-isel"
37 #define PASS_NAME "Lanai DAG->DAG Pattern Instruction Selection"
53 LanaiDAGToDAGISel() =
delete;
62 bool SelectInlineAsmMemoryOperand(
const SDValue &
Op,
unsigned ConstraintCode,
63 std::vector<SDValue> &OutOps)
override;
67 #include "LanaiGenDAGISel.inc"
74 void selectFrameIndex(
SDNode *
N);
111 if (canBeRepresentedAsSls(*CN)) {
112 int32_t
Imm = CN->getSExtValue();
113 Offset = CurDAG->getTargetConstant(
Imm,
DL, CN->getValueType(0));
133 if (isInt<16>(CN->getSExtValue())) {
134 int16_t
Imm = CN->getSExtValue();
135 Offset = CurDAG->getTargetConstant(
Imm,
DL, CN->getValueType(0));
136 Base = CurDAG->getRegister(Lanai::R0, CN->getValueType(0));
142 if (canBeRepresentedAsSls(*CN))
146 if (isInt<10>(CN->getSExtValue())) {
147 int16_t
Imm = CN->getSExtValue();
148 Offset = CurDAG->getTargetConstant(
Imm,
DL, CN->getValueType(0));
149 Base = CurDAG->getRegister(Lanai::R0, CN->getValueType(0));
158 Base = CurDAG->getTargetFrameIndex(
160 getTargetLowering()->getPointerTy(CurDAG->getDataLayout()));
177 if ((RiMode && isInt<16>(CN->getSExtValue())) ||
178 (!RiMode && isInt<10>(CN->getSExtValue()))) {
181 dyn_cast<FrameIndexSDNode>(
Addr.getOperand(0))) {
182 Base = CurDAG->getTargetFrameIndex(
184 getTargetLowering()->getPointerTy(CurDAG->getDataLayout()));
195 if (AluOperator ==
ISD::OR && RiMode &&
207 return selectAddrRiSpls(
Addr, Base,
Offset, AluOp,
true);
212 return selectAddrRiSpls(
Addr, Base,
Offset, AluOp,
false);
232 if (isInt<16>(CN->getSExtValue()))
245 R1 =
Addr.getOperand(0);
255 bool LanaiDAGToDAGISel::SelectInlineAsmMemoryOperand(
256 const SDValue &
Op,
unsigned ConstraintCode, std::vector<SDValue> &OutOps) {
258 switch (ConstraintCode) {
262 if (!selectAddrRr(
Op, Op0, Op1, AluOp) &&
263 !selectAddrRi(
Op, Op0, Op1, AluOp))
268 OutOps.push_back(Op0);
269 OutOps.push_back(Op1);
270 OutOps.push_back(AluOp);
277 unsigned Opcode = Node->getOpcode();
280 if (Node->isMachineOpcode()) {
287 EVT VT = Node->getValueType(0);
294 if (ConstNode->
isZero()) {
295 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
297 return ReplaceNode(Node,
New.getNode());
302 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(),
304 return ReplaceNode(Node,
New.getNode());
309 selectFrameIndex(Node);
319 void LanaiDAGToDAGISel::selectFrameIndex(
SDNode *Node) {
322 int FI = cast<FrameIndexSDNode>(Node)->getIndex();
323 EVT VT = Node->getValueType(0);
324 SDValue TFI = CurDAG->getTargetFrameIndex(FI, VT);
325 unsigned Opc = Lanai::ADD_I_LO;
326 if (Node->hasOneUse()) {
327 CurDAG->SelectNodeTo(Node, Opc, VT, TFI,
Imm);
330 ReplaceNode(Node, CurDAG->getMachineNode(Opc,
DL, VT, TFI,
Imm));
336 return new LanaiDAGToDAGISel(
TM);