Lines Matching +full:custom +full:- +full:temp
1 //===-- AVRISelDAGToDAG.cpp - A dag to dag inst selector for AVR ----------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
22 #define DEBUG_TYPE "avr-isel"
23 #define PASS_NAME "AVR DAG->DAG Instruction Selection"
83 auto DL = CurDAG->getDataLayout(); in SelectAddr()
84 MVT PtrVT = getTargetLowering()->getPointerTy(DL); in SelectAddr()
88 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), PtrVT); in SelectAddr()
89 Disp = CurDAG->getTargetConstant(0, dl, MVT::i8); in SelectAddr()
96 !CurDAG->isBaseWithConstantOffset(N)) { in SelectAddr()
101 int RHSC = (int)RHS->getZExtValue(); in SelectAddr()
105 RHSC = -RHSC; in SelectAddr()
113 int FI = cast<FrameIndexSDNode>(N.getOperand(0))->getIndex(); in SelectAddr()
115 Base = CurDAG->getTargetFrameIndex(FI, PtrVT); in SelectAddr()
116 Disp = CurDAG->getTargetConstant(RHSC, dl, MVT::i16); in SelectAddr()
123 MVT VT = cast<MemSDNode>(Op)->getMemoryVT().getSimpleVT(); in SelectAddr()
126 // of 16-bit loads - those can only go up to 62, because we desugar them in SelectAddr()
127 // into a pair of 8-bit loads like `ldd rx, RHSC` + `ldd ry, RHSC + 1`. in SelectAddr()
133 Disp = CurDAG->getTargetConstant(RHSC, dl, MVT::i8); in SelectAddr()
144 ISD::MemIndexedMode AM = LD->getAddressingMode(); in selectIndexedLoad()
145 MVT VT = LD->getMemoryVT().getSimpleVT(); in selectIndexedLoad()
146 auto PtrVT = getTargetLowering()->getPointerTy(CurDAG->getDataLayout()); in selectIndexedLoad()
149 if ((LD->getExtensionType() != ISD::NON_EXTLOAD) || in selectIndexedLoad()
157 int Offs = cast<ConstantSDNode>(LD->getOffset())->getSExtValue(); in selectIndexedLoad()
161 if ((!isPre && Offs != 1) || (isPre && Offs != -1)) { in selectIndexedLoad()
169 if ((!isPre && Offs != 2) || (isPre && Offs != -2)) { in selectIndexedLoad()
181 CurDAG->getMachineNode(Opcode, SDLoc(N), VT, PtrVT, MVT::Other, in selectIndexedLoad()
182 LD->getBasePtr(), LD->getChain()); in selectIndexedLoad()
184 CurDAG->RemoveDeadNode(N); in selectIndexedLoad()
192 if (LD->getExtensionType() != ISD::NON_EXTLOAD || in selectIndexedProgMemLoad()
193 LD->getAddressingMode() != ISD::POST_INC) in selectIndexedProgMemLoad()
197 assert((Bank == 0 || Subtarget->hasELPM()) && in selectIndexedProgMemLoad()
201 int Offs = cast<ConstantSDNode>(LD->getOffset())->getSExtValue(); in selectIndexedProgMemLoad()
221 MachineRegisterInfo &RI = MF->getRegInfo(); in SelectInlineAsmMemoryOperand()
222 const AVRSubtarget &STI = MF->getSubtarget<AVRSubtarget>(); in SelectInlineAsmMemoryOperand()
225 auto DL = CurDAG->getDataLayout(); in SelectInlineAsmMemoryOperand()
231 RI.getRegClass(RegNode->getReg()) == &AVR::PTRDISPREGSRegClass) { in SelectInlineAsmMemoryOperand()
236 if (Op->getOpcode() == ISD::FrameIndex) { in SelectInlineAsmMemoryOperand()
251 if (Op->getOpcode() == ISD::ADD || Op->getOpcode() == ISD::SUB) { in SelectInlineAsmMemoryOperand()
252 SDValue CopyFromRegOp = Op->getOperand(0); in SelectInlineAsmMemoryOperand()
253 SDValue ImmOp = Op->getOperand(1); in SelectInlineAsmMemoryOperand()
257 bool CanHandleRegImmOpt = ImmNode && ImmNode->getAPIntValue().ult(64); in SelectInlineAsmMemoryOperand()
259 if (CopyFromRegOp->getOpcode() == ISD::CopyFromReg) { in SelectInlineAsmMemoryOperand()
261 cast<RegisterSDNode>(CopyFromRegOp->getOperand(1)); in SelectInlineAsmMemoryOperand()
262 Reg = RegNode->getReg(); in SelectInlineAsmMemoryOperand()
269 // If we detect proper case - correct virtual register class in SelectInlineAsmMemoryOperand()
280 CurDAG->getCopyToReg(CopyFromRegOp, dl, VReg, CopyFromRegOp); in SelectInlineAsmMemoryOperand()
283 CurDAG->getCopyFromReg(CopyToReg, dl, VReg, TL.getPointerTy(DL)); in SelectInlineAsmMemoryOperand()
290 if (ImmNode->getValueType(0) != MVT::i8) { in SelectInlineAsmMemoryOperand()
291 Disp = CurDAG->getTargetConstant(ImmNode->getZExtValue(), dl, MVT::i8); in SelectInlineAsmMemoryOperand()
308 SDValue CopyToReg = CurDAG->getCopyToReg(Op, dl, VReg, Op); in SelectInlineAsmMemoryOperand()
310 CurDAG->getCopyFromReg(CopyToReg, dl, VReg, TL.getPointerTy(DL)); in SelectInlineAsmMemoryOperand()
318 auto DL = CurDAG->getDataLayout(); in select()
320 // Convert the frameindex into a temp instruction that will hold the in select()
322 int FI = cast<FrameIndexSDNode>(N)->getIndex(); in select()
324 CurDAG->getTargetFrameIndex(FI, getTargetLowering()->getPointerTy(DL)); in select()
326 CurDAG->SelectNodeTo(N, AVR::FRMIDX, getTargetLowering()->getPointerTy(DL), in select()
327 TFI, CurDAG->getTargetConstant(0, SDLoc(N), MVT::i16)); in select()
335 SDValue BasePtr = ST->getBasePtr(); in select()
345 if (!RN || (RN->getReg() != AVR::SP)) { in select()
350 SDValue Chain = ST->getChain(); in select()
351 EVT VT = ST->getValue().getValueType(); in select()
353 SDValue Offset = CurDAG->getTargetConstant(CST, DL, MVT::i16); in select()
354 SDValue Ops[] = {BasePtr.getOperand(0), Offset, ST->getValue(), Chain}; in select()
357 SDNode *ResNode = CurDAG->getMachineNode(Opc, DL, MVT::Other, Ops); in select()
360 CurDAG->setNodeMemRefs(cast<MachineSDNode>(ResNode), {ST->getMemOperand()}); in select()
363 CurDAG->RemoveDeadNode(N); in select()
375 if (!Subtarget->hasLPM()) in select()
381 if (ProgMemBank > 0 && !Subtarget->hasELPM()) in select()
386 MVT VT = LD->getMemoryVT().getSimpleVT(); in select()
387 SDValue Chain = LD->getChain(); in select()
388 SDValue Ptr = LD->getBasePtr(); in select()
392 Chain = CurDAG->getCopyToReg(Chain, DL, AVR::R31R30, Ptr, SDValue()); in select()
393 Ptr = CurDAG->getCopyFromReg(Chain, DL, AVR::R31R30, MVT::i16, in select()
401 CurDAG->getMachineNode(LPMOpc, DL, VT, MVT::i16, MVT::Other, Ptr); in select()
405 SDValue NC = CurDAG->getTargetConstant(ProgMemBank, DL, MVT::i8); in select()
406 auto *NP = CurDAG->getMachineNode(AVR::LDIRdK, DL, MVT::i8, NC); in select()
407 ResNode = CurDAG->getMachineNode(LPMOpc, DL, VT, MVT::i16, MVT::Other, in select()
415 unsigned Opc = Subtarget->hasLPMX() ? AVR::LPMRdZ : AVR::LPMBRdZ; in select()
417 CurDAG->getMachineNode(Opc, DL, MVT::i8, MVT::Other, Ptr); in select()
421 SDValue NC = CurDAG->getTargetConstant(ProgMemBank, DL, MVT::i8); in select()
422 auto *NP = CurDAG->getMachineNode(AVR::LDIRdK, DL, MVT::i8, NC); in select()
423 ResNode = CurDAG->getMachineNode(AVR::ELPMBRdZ, DL, MVT::i8, MVT::Other, in select()
430 CurDAG->getMachineNode(AVR::LPMWRdZ, DL, MVT::i16, MVT::Other, Ptr); in select()
434 SDValue NC = CurDAG->getTargetConstant(ProgMemBank, DL, MVT::i8); in select()
435 auto *NP = CurDAG->getMachineNode(AVR::LDIRdK, DL, MVT::i8, NC); in select()
436 ResNode = CurDAG->getMachineNode(AVR::ELPMWRdZ, DL, MVT::i16, in select()
446 CurDAG->setNodeMemRefs(cast<MachineSDNode>(ResNode), {LD->getMemOperand()}); in select()
450 CurDAG->RemoveDeadNode(N); in select()
457 SDValue Chain = N->getOperand(0); in select()
458 SDValue Callee = N->getOperand(1); in select()
459 unsigned LastOpNum = N->getNumOperands() - 1; in select()
468 if (N->getOperand(LastOpNum).getValueType() == MVT::Glue) { in select()
469 --LastOpNum; in select()
473 Chain = CurDAG->getCopyToReg(Chain, DL, AVR::R31R30, Callee, InGlue); in select()
475 Ops.push_back(CurDAG->getRegister(AVR::R31R30, MVT::i16)); in select()
479 Ops.push_back(N->getOperand(i)); in select()
485 SDNode *ResNode = CurDAG->getMachineNode( in select()
486 Subtarget->hasEIJMPCALL() ? AVR::EICALL : AVR::ICALL, DL, MVT::Other, in select()
491 CurDAG->RemoveDeadNode(N); in select()
497 SDValue Chain = N->getOperand(0); in select()
498 SDValue JmpAddr = N->getOperand(1); in select()
502 Chain = CurDAG->getCopyToReg(Chain, DL, AVR::R31R30, JmpAddr); in select()
503 SDNode *ResNode = CurDAG->getMachineNode(AVR::IJMP, DL, MVT::Other, Chain); in select()
506 CurDAG->RemoveDeadNode(N); in select()
513 MVT Type = N->getSimpleValueType(0); in selectMultiplication()
517 bool isSigned = N->getOpcode() == ISD::SMUL_LOHI; in selectMultiplication()
520 SDValue Lhs = N->getOperand(0); in selectMultiplication()
521 SDValue Rhs = N->getOperand(1); in selectMultiplication()
522 SDNode *Mul = CurDAG->getMachineNode(MachineOp, DL, MVT::Glue, Lhs, Rhs); in selectMultiplication()
523 SDValue InChain = CurDAG->getEntryNode(); in selectMultiplication()
527 if (N->hasAnyUseOfValue(0)) { in selectMultiplication()
529 CurDAG->getCopyFromReg(InChain, DL, AVR::R0, Type, InGlue); in selectMultiplication()
538 if (N->hasAnyUseOfValue(1)) { in selectMultiplication()
540 CurDAG->getCopyFromReg(InChain, DL, AVR::R1, Type, InGlue); in selectMultiplication()
548 CurDAG->RemoveDeadNode(N); in selectMultiplication()
551 // using a custom inserter. in selectMultiplication()
557 // If we have a custom node, we already have selected! in Select()
558 if (N->isMachineOpcode()) { in Select()
559 LLVM_DEBUG(errs() << "== "; N->dump(CurDAG); errs() << "\n"); in Select()
560 N->setNodeId(-1); in Select()
573 unsigned Opcode = N->getOpcode(); in trySelect()