Lines Matching defs:AM
59 AddrType AM;
84 : AM(AT), BaseType(Base::RegBase), Disp(0), BaseFrameIndex(0), IndexReg(),
109 return AM == AddrType::ARII || AM == AddrType::PCI ||
110 AM == AddrType::ARID || AM == AddrType::PCD || AM == AddrType::AL;
114 switch (AM) {
206 bool foldOffsetIntoAddress(uint64_t Offset, M68kISelAddressMode &AM);
208 bool matchLoadInAddress(LoadSDNode *N, M68kISelAddressMode &AM);
209 bool matchAddress(SDValue N, M68kISelAddressMode &AM);
210 bool matchAddressBase(SDValue N, M68kISelAddressMode &AM);
211 bool matchAddressRecursively(SDValue N, M68kISelAddressMode &AM,
213 bool matchADD(SDValue &N, M68kISelAddressMode &AM, unsigned Depth);
214 bool matchWrapper(SDValue N, M68kISelAddressMode &AM);
235 inline bool getFrameIndexAddress(M68kISelAddressMode &AM, const SDLoc &DL,
237 if (AM.BaseType == M68kISelAddressMode::Base::FrameIndexBase) {
238 Disp = getI32Imm(AM.Disp, DL);
240 AM.BaseFrameIndex, TLI->getPointerTy(CurDAG->getDataLayout()));
248 inline bool getSymbolicDisplacement(M68kISelAddressMode &AM, const SDLoc &DL,
250 if (AM.GV) {
251 Sym = CurDAG->getTargetGlobalAddress(AM.GV, SDLoc(), MVT::i32, AM.Disp,
252 AM.SymbolFlags);
256 if (AM.CP) {
257 Sym = CurDAG->getTargetConstantPool(AM.CP, MVT::i32, AM.Alignment,
258 AM.Disp, AM.SymbolFlags);
262 if (AM.ES) {
263 assert(!AM.Disp && "Non-zero displacement is ignored with ES.");
264 Sym = CurDAG->getTargetExternalSymbol(AM.ES, MVT::i32, AM.SymbolFlags);
268 if (AM.MCSym) {
269 assert(!AM.Disp && "Non-zero displacement is ignored with MCSym.");
270 assert(AM.SymbolFlags == 0 && "oo");
271 Sym = CurDAG->getMCSymbol(AM.MCSym, MVT::i32);
275 if (AM.JT != -1) {
276 assert(!AM.Disp && "Non-zero displacement is ignored with JT.");
277 Sym = CurDAG->getTargetJumpTable(AM.JT, MVT::i32, AM.SymbolFlags);
281 if (AM.BlockAddr) {
282 Sym = CurDAG->getTargetBlockAddress(AM.BlockAddr, MVT::i32, AM.Disp,
283 AM.SymbolFlags);
368 static bool doesDispFitFI(M68kISelAddressMode &AM) {
369 if (!AM.isDispAddrType())
372 return isIntN(AM.getDispSize() - 1, AM.Disp);
375 static bool doesDispFit(M68kISelAddressMode &AM, int64_t Val) {
376 if (!AM.isDispAddrType())
378 return isIntN(AM.getDispSize(), Val);
391 M68kISelAddressMode &AM) {
393 if (Offset != 0 && (AM.ES || AM.MCSym))
396 int64_t Val = AM.Disp + Offset;
398 if (doesDispFit(AM, Val)) {
399 AM.Disp = Val;
412 bool M68kDAGToDAGISel::matchAddressBase(SDValue N, M68kISelAddressMode &AM) {
414 if (AM.hasBase()) {
416 if (!AM.hasIndexReg()) {
417 AM.IndexReg = N;
418 AM.Scale = 1;
427 AM.BaseType = M68kISelAddressMode::Base::RegBase;
428 AM.BaseReg = N;
434 M68kISelAddressMode &AM) {
439 M68kISelAddressMode &AM,
445 return matchAddressBase(N, AM);
450 if (AM.isPCRelative()) {
456 if (foldOffsetIntoAddress(Cst->getSExtValue(), AM))
467 if (foldOffsetIntoAddress(Val, AM))
474 if (matchWrapper(N, AM))
479 if (matchLoadInAddress(cast<LoadSDNode>(N), AM))
491 matchADD(N, AM, Depth))
496 if (matchADD(N, AM, Depth))
501 if (AM.isDispAddrType() &&
502 AM.BaseType == M68kISelAddressMode::Base::RegBase &&
503 AM.BaseReg.getNode() == nullptr && doesDispFitFI(AM)) {
504 AM.BaseType = M68kISelAddressMode::Base::FrameIndexBase;
505 AM.BaseFrameIndex = cast<FrameIndexSDNode>(N)->getIndex();
512 AM.GV = GA->getGlobal();
513 AM.SymbolFlags = GA->getTargetFlags();
518 return matchAddressBase(N, AM);
523 bool M68kDAGToDAGISel::matchAddress(SDValue N, M68kISelAddressMode &AM) {
531 return matchAddressRecursively(N, AM, 0);
534 bool M68kDAGToDAGISel::matchADD(SDValue &N, M68kISelAddressMode &AM,
540 M68kISelAddressMode Backup = AM;
541 if (matchAddressRecursively(N.getOperand(0), AM, Depth + 1) &&
542 matchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth + 1)) {
545 AM = Backup;
548 if (matchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth + 1) &&
549 matchAddressRecursively(Handle.getValue().getOperand(0), AM, Depth + 1)) {
552 AM = Backup;
557 if (!AM.hasBase() && !AM.hasIndexReg()) {
559 AM.BaseReg = N.getOperand(0);
560 AM.IndexReg = N.getOperand(1);
561 AM.Scale = 1;
573 bool M68kDAGToDAGISel::matchWrapper(SDValue N, M68kISelAddressMode &AM) {
576 if (AM.hasSymbolicDisplacement())
584 M68kISelAddressMode Backup = AM;
586 if (AM.hasBase()) {
591 AM.GV = G->getGlobal();
592 AM.SymbolFlags = G->getTargetFlags();
593 if (!foldOffsetIntoAddress(G->getOffset(), AM)) {
594 AM = Backup;
598 AM.CP = CP->getConstVal();
599 AM.Alignment = CP->getAlign();
600 AM.SymbolFlags = CP->getTargetFlags();
601 if (!foldOffsetIntoAddress(CP->getOffset(), AM)) {
602 AM = Backup;
606 AM.ES = S->getSymbol();
607 AM.SymbolFlags = S->getTargetFlags();
609 AM.MCSym = S->getMCSymbol();
611 AM.JT = J->getIndex();
612 AM.SymbolFlags = J->getTargetFlags();
614 AM.BlockAddr = BA->getBlockAddress();
615 AM.SymbolFlags = BA->getTargetFlags();
616 if (!foldOffsetIntoAddress(BA->getOffset(), AM)) {
617 AM = Backup;
623 AM.setBaseReg(CurDAG->getRegister(M68k::PC, MVT::i32));
628 if (!AM.isDisp32()) {
634 AM.GV = G->getGlobal();
635 AM.Disp += G->getOffset();
636 AM.SymbolFlags = G->getTargetFlags();
638 AM.CP = CP->getConstVal();
639 AM.Alignment = CP->getAlign();
640 AM.Disp += CP->getOffset();
641 AM.SymbolFlags = CP->getTargetFlags();
643 AM.ES = S->getSymbol();
644 AM.SymbolFlags = S->getTargetFlags();
646 AM.MCSym = S->getMCSymbol();
648 AM.JT = J->getIndex();
649 AM.SymbolFlags = J->getTargetFlags();
651 AM.BlockAddr = BA->getBlockAddress();
652 AM.Disp += BA->getOffset();
653 AM.SymbolFlags = BA->getTargetFlags();
714 M68kISelAddressMode AM(M68kISelAddressMode::AddrType::ARID);
716 if (!matchAddress(N, AM))
719 if (AM.isPCRelative()) {
725 if (getFrameIndexAddress(AM, SDLoc(N), Disp, Base)) {
730 if (AM.hasIndexReg()) {
735 if (!AM.hasBaseReg()) {
740 Base = AM.BaseReg;
742 if (getSymbolicDisplacement(AM, SDLoc(N), Disp)) {
743 assert(!AM.Disp && "Should not be any displacement");
749 if (AM.Disp == 0) {
754 Disp = getI16Imm(AM.Disp, SDLoc(N));
777 M68kISelAddressMode AM(M68kISelAddressMode::AddrType::ARII);
780 if (!matchAddress(N, AM))
783 if (AM.isPCRelative()) {
788 if (!AM.hasIndexReg()) {
793 if (!AM.hasBaseReg()) {
798 if (!isAddressBase(AM.BaseReg) && isAddressBase(AM.IndexReg)) {
799 Base = AM.IndexReg;
800 Index = AM.BaseReg;
802 Base = AM.BaseReg;
803 Index = AM.IndexReg;
806 if (AM.hasSymbolicDisplacement()) {
814 if (AM.Disp == 0 && (!Parent || (Parent->getOpcode() != ISD::LOAD &&
820 Disp = getI8Imm(AM.Disp, SDLoc(N));
828 M68kISelAddressMode AM(M68kISelAddressMode::AddrType::AL);
830 if (!matchAddress(N, AM)) {
835 if (AM.isPCRelative()) {
840 if (AM.hasBase()) {
845 if (AM.hasIndexReg()) {
850 if (getSymbolicDisplacement(AM, SDLoc(N), Sym)) {
855 if (AM.Disp) {
856 Sym = getI32Imm(AM.Disp, SDLoc(N));
868 M68kISelAddressMode AM(M68kISelAddressMode::AddrType::PCD);
870 if (!matchAddress(N, AM))
873 if (!AM.isPCRelative()) {
878 if (AM.hasIndexReg()) {
883 if (getSymbolicDisplacement(AM, SDLoc(N), Disp)) {
888 Disp = getI16Imm(AM.Disp, SDLoc(N));
897 M68kISelAddressMode AM(M68kISelAddressMode::AddrType::PCI);
899 if (!matchAddress(N, AM))
902 if (!AM.isPCRelative()) {
907 if (!AM.hasIndexReg()) {
912 Index = AM.IndexReg;
914 if (getSymbolicDisplacement(AM, SDLoc(N), Disp)) {
915 assert(!AM.Disp && "Should not be any displacement");
920 Disp = getI8Imm(AM.Disp, SDLoc(N));
928 M68kISelAddressMode AM(M68kISelAddressMode::AddrType::ARI);
930 if (!matchAddress(N, AM)) {
935 if (AM.isPCRelative()) {
941 if (AM.hasIndexReg() || AM.Disp != 0) {
947 if (AM.hasSymbolicDisplacement()) {
952 if (AM.hasBaseReg()) {
953 Base = AM.BaseReg;