Lines Matching defs:AM

197     bool FoldOffsetIntoAddress(uint64_t Offset, X86ISelAddressMode &AM);
198 bool MatchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM);
199 bool MatchWrapper(SDValue N, X86ISelAddressMode &AM);
200 bool MatchAddress(SDValue N, X86ISelAddressMode &AM);
201 bool MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
203 bool MatchAddressBase(SDValue N, X86ISelAddressMode &AM);
232 inline void getAddressOperands(X86ISelAddressMode &AM, SDValue &Base,
235 Base = (AM.BaseType == X86ISelAddressMode::FrameIndexBase) ?
236 CurDAG->getTargetFrameIndex(AM.Base_FrameIndex, TLI.getPointerTy()) :
237 AM.Base_Reg;
238 Scale = getI8Imm(AM.Scale);
239 Index = AM.IndexReg;
242 if (AM.GV)
243 Disp = CurDAG->getTargetGlobalAddress(AM.GV, DebugLoc(),
244 MVT::i32, AM.Disp,
245 AM.SymbolFlags);
246 else if (AM.CP)
247 Disp = CurDAG->getTargetConstantPool(AM.CP, MVT::i32,
248 AM.Align, AM.Disp, AM.SymbolFlags);
249 else if (AM.ES)
250 Disp = CurDAG->getTargetExternalSymbol(AM.ES, MVT::i32, AM.SymbolFlags);
251 else if (AM.JT != -1)
252 Disp = CurDAG->getTargetJumpTable(AM.JT, MVT::i32, AM.SymbolFlags);
253 else if (AM.BlockAddr)
254 Disp = CurDAG->getBlockAddress(AM.BlockAddr, MVT::i32,
255 true, AM.SymbolFlags);
257 Disp = CurDAG->getTargetConstant(AM.Disp, MVT::i32);
259 if (AM.Segment.getNode())
260 Segment = AM.Segment;
569 X86ISelAddressMode &AM) {
570 int64_t Val = AM.Disp + Offset;
574 AM.hasSymbolicDisplacement()))
578 if (AM.BaseType == X86ISelAddressMode::FrameIndexBase &&
582 AM.Disp = Val;
587 bool X86DAGToDAGISel::MatchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM){
597 if (C->getSExtValue() == 0 && AM.Segment.getNode() == 0 &&
601 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
604 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
615 bool X86DAGToDAGISel::MatchWrapper(SDValue N, X86ISelAddressMode &AM) {
618 if (AM.hasSymbolicDisplacement())
632 if (AM.hasBaseOrIndexReg())
635 X86ISelAddressMode Backup = AM;
636 AM.GV = G->getGlobal();
637 AM.SymbolFlags = G->getTargetFlags();
638 if (FoldOffsetIntoAddress(G->getOffset(), AM)) {
639 AM = Backup;
643 X86ISelAddressMode Backup = AM;
644 AM.CP = CP->getConstVal();
645 AM.Align = CP->getAlignment();
646 AM.SymbolFlags = CP->getTargetFlags();
647 if (FoldOffsetIntoAddress(CP->getOffset(), AM)) {
648 AM = Backup;
652 AM.ES = S->getSymbol();
653 AM.SymbolFlags = S->getTargetFlags();
655 AM.JT = J->getIndex();
656 AM.SymbolFlags = J->getTargetFlags();
658 AM.BlockAddr = cast<BlockAddressSDNode>(N0)->getBlockAddress();
659 AM.SymbolFlags = cast<BlockAddressSDNode>(N0)->getTargetFlags();
663 AM.setBaseReg(CurDAG->getRegister(X86::RIP, MVT::i64));
675 AM.GV = G->getGlobal();
676 AM.Disp += G->getOffset();
677 AM.SymbolFlags = G->getTargetFlags();
679 AM.CP = CP->getConstVal();
680 AM.Align = CP->getAlignment();
681 AM.Disp += CP->getOffset();
682 AM.SymbolFlags = CP->getTargetFlags();
684 AM.ES = S->getSymbol();
685 AM.SymbolFlags = S->getTargetFlags();
687 AM.JT = J->getIndex();
688 AM.SymbolFlags = J->getTargetFlags();
690 AM.BlockAddr = cast<BlockAddressSDNode>(N0)->getBlockAddress();
691 AM.SymbolFlags = cast<BlockAddressSDNode>(N0)->getTargetFlags();
702 bool X86DAGToDAGISel::MatchAddress(SDValue N, X86ISelAddressMode &AM) {
703 if (MatchAddressRecursively(N, AM, 0))
708 if (AM.Scale == 2 &&
709 AM.BaseType == X86ISelAddressMode::RegBase &&
710 AM.Base_Reg.getNode() == 0) {
711 AM.Base_Reg = AM.IndexReg;
712 AM.Scale = 1;
720 AM.Scale == 1 &&
721 AM.BaseType == X86ISelAddressMode::RegBase &&
722 AM.Base_Reg.getNode() == 0 &&
723 AM.IndexReg.getNode() == 0 &&
724 AM.SymbolFlags == X86II::MO_NO_FLAG &&
725 AM.hasSymbolicDisplacement())
726 AM.Base_Reg = CurDAG->getRegister(X86::RIP, MVT::i64);
750 X86ISelAddressMode &AM) {
782 AM.IndexReg = And;
783 AM.Scale = (1 << ScaleLog);
793 X86ISelAddressMode &AM) {
825 AM.Scale = 1 << ShiftAmt;
826 AM.IndexReg = NewAnd;
860 X86ISelAddressMode &AM) {
933 AM.Scale = 1 << AMShiftAmt;
934 AM.IndexReg = NewSRL;
938 bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
943 AM.dump();
947 return MatchAddressBase(N, AM);
952 if (AM.isRIPRelative()) {
956 if (!AM.ES && AM.JT != -1) return true;
959 if (!FoldOffsetIntoAddress(Cst->getSExtValue(), AM))
968 if (!FoldOffsetIntoAddress(Val, AM))
975 if (!MatchWrapper(N, AM))
980 if (!MatchLoadInAddress(cast<LoadSDNode>(N), AM))
985 if (AM.BaseType == X86ISelAddressMode::RegBase &&
986 AM.Base_Reg.getNode() == 0 &&
987 (!Subtarget->is64Bit() || isDispSafeForFrameIndex(AM.Disp))) {
988 AM.BaseType = X86ISelAddressMode::FrameIndexBase;
989 AM.Base_FrameIndex = cast<FrameIndexSDNode>(N)->getIndex();
995 if (AM.IndexReg.getNode() != 0 || AM.Scale != 1)
1006 AM.Scale = 1 << Val;
1013 AM.IndexReg = ShVal.getNode()->getOperand(0);
1017 if (!FoldOffsetIntoAddress(Disp, AM))
1021 AM.IndexReg = ShVal;
1029 if (AM.IndexReg.getNode() != 0 || AM.Scale != 1) break;
1049 if (!FoldMaskAndShiftToScale(*CurDAG, N, Mask, N, X, AM))
1062 if (AM.BaseType == X86ISelAddressMode::RegBase &&
1063 AM.Base_Reg.getNode() == 0 &&
1064 AM.IndexReg.getNode() == 0) {
1069 AM.Scale = unsigned(CN->getZExtValue())-1;
1083 if (FoldOffsetIntoAddress(Disp, AM))
1089 AM.IndexReg = AM.Base_Reg = Reg;
1108 X86ISelAddressMode Backup = AM;
1109 if (MatchAddressRecursively(N.getNode()->getOperand(0), AM, Depth+1)) {
1110 AM = Backup;
1114 if (AM.IndexReg.getNode() || AM.isRIPRelative()) {
1115 AM = Backup;
1133 if ((AM.BaseType == X86ISelAddressMode::RegBase &&
1134 AM.Base_Reg.getNode() &&
1135 !AM.Base_Reg.getNode()->hasOneUse()) ||
1136 AM.BaseType == X86ISelAddressMode::FrameIndexBase)
1140 if ((AM.hasSymbolicDisplacement() && !Backup.hasSymbolicDisplacement()) +
1141 ((AM.Disp != 0) && (Backup.Disp == 0)) +
1142 (AM.Segment.getNode() && !Backup.Segment.getNode()) >= 2)
1146 AM = Backup;
1153 AM.IndexReg = Neg;
1154 AM.Scale = 1;
1167 X86ISelAddressMode Backup = AM;
1168 if (!MatchAddressRecursively(N.getOperand(0), AM, Depth+1) &&
1169 !MatchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth+1))
1171 AM = Backup;
1174 if (!MatchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth+1)&&
1175 !MatchAddressRecursively(Handle.getValue().getOperand(0), AM, Depth+1))
1177 AM = Backup;
1182 if (AM.BaseType == X86ISelAddressMode::RegBase &&
1183 !AM.Base_Reg.getNode() &&
1184 !AM.IndexReg.getNode()) {
1186 AM.Base_Reg = N.getOperand(0);
1187 AM.IndexReg = N.getOperand(1);
1188 AM.Scale = 1;
1198 X86ISelAddressMode Backup = AM;
1202 if (!MatchAddressRecursively(N.getOperand(0), AM, Depth+1) &&
1203 !FoldOffsetIntoAddress(CN->getSExtValue(), AM))
1205 AM = Backup;
1214 if (AM.IndexReg.getNode() != 0 || AM.Scale != 1) break;
1229 if (!FoldMaskAndShiftToExtract(*CurDAG, N, Mask, Shift, X, AM))
1233 if (!FoldMaskAndShiftToScale(*CurDAG, N, Mask, Shift, X, AM))
1238 if (!FoldMaskedShiftToScaledMask(*CurDAG, N, Mask, Shift, X, AM))
1244 return MatchAddressBase(N, AM);
1249 bool X86DAGToDAGISel::MatchAddressBase(SDValue N, X86ISelAddressMode &AM) {
1251 if (AM.BaseType != X86ISelAddressMode::RegBase || AM.Base_Reg.getNode()) {
1253 if (AM.IndexReg.getNode() == 0) {
1254 AM.IndexReg = N;
1255 AM.Scale = 1;
1264 AM.BaseType = X86ISelAddressMode::RegBase;
1265 AM.Base_Reg = N;
1279 X86ISelAddressMode AM;
1291 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
1293 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
1296 if (MatchAddress(N, AM))
1300 if (AM.BaseType == X86ISelAddressMode::RegBase) {
1301 if (!AM.Base_Reg.getNode())
1302 AM.Base_Reg = CurDAG->getRegister(0, VT);
1305 if (!AM.IndexReg.getNode())
1306 AM.IndexReg = CurDAG->getRegister(0, VT);
1308 getAddressOperands(AM, Base, Scale, Index, Disp, Segment);
1364 X86ISelAddressMode AM;
1366 // Set AM.Segment to prevent MatchAddress from using one. LEA doesn't support
1368 SDValue Copy = AM.Segment;
1370 AM.Segment = T;
1371 if (MatchAddress(N, AM))
1373 assert (T == AM.Segment);
1374 AM.Segment = Copy;
1378 if (AM.BaseType == X86ISelAddressMode::RegBase)
1379 if (AM.Base_Reg.getNode())
1382 AM.Base_Reg = CurDAG->getRegister(0, VT);
1383 else if (AM.BaseType == X86ISelAddressMode::FrameIndexBase)
1386 if (AM.IndexReg.getNode())
1389 AM.IndexReg = CurDAG->getRegister(0, VT);
1393 if (AM.Scale > 1)
1401 if (AM.hasSymbolicDisplacement()) {
1410 if (AM.Disp && (AM.Base_Reg.getNode() || AM.IndexReg.getNode()))
1417 getAddressOperands(AM, Base, Scale, Index, Disp, Segment);
1428 X86ISelAddressMode AM;
1429 AM.GV = GA->getGlobal();
1430 AM.Disp += GA->getOffset();
1431 AM.Base_Reg = CurDAG->getRegister(0, N.getValueType());
1432 AM.SymbolFlags = GA->getTargetFlags();
1435 AM.Scale = 1;
1436 AM.IndexReg = CurDAG->getRegister(X86::EBX, MVT::i32);
1438 AM.IndexReg = CurDAG->getRegister(0, MVT::i64);
1441 getAddressOperands(AM, Base, Scale, Index, Disp, Segment);