Home | History | Annotate | Download | only in X86

Lines Matching refs:AM

198     bool FoldOffsetIntoAddress(uint64_t Offset, X86ISelAddressMode &AM);
199 bool MatchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM);
200 bool MatchWrapper(SDValue N, X86ISelAddressMode &AM);
201 bool MatchAddress(SDValue N, X86ISelAddressMode &AM);
202 bool MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
204 bool MatchAddressBase(SDValue N, X86ISelAddressMode &AM);
237 inline void getAddressOperands(X86ISelAddressMode &AM, SDValue &Base,
240 Base = (AM.BaseType == X86ISelAddressMode::FrameIndexBase) ?
241 CurDAG->getTargetFrameIndex(AM.Base_FrameIndex,
243 AM.Base_Reg;
244 Scale = getI8Imm(AM.Scale);
245 Index = AM.IndexReg;
248 if (AM.GV)
249 Disp = CurDAG->getTargetGlobalAddress(AM.GV, SDLoc(),
250 MVT::i32, AM.Disp,
251 AM.SymbolFlags);
252 else if (AM.CP)
253 Disp = CurDAG->getTargetConstantPool(AM.CP, MVT::i32,
254 AM.Align, AM.Disp, AM.SymbolFlags);
255 else if (AM.ES) {
256 assert(!AM.Disp && "Non-zero displacement is ignored with ES.");
257 Disp = CurDAG->getTargetExternalSymbol(AM.ES, MVT::i32, AM.SymbolFlags);
258 } else if (AM.JT != -1) {
259 assert(!AM.Disp && "Non-zero displacement is ignored with JT.");
260 Disp = CurDAG->getTargetJumpTable(AM.JT, MVT::i32, AM.SymbolFlags);
261 } else if (AM.BlockAddr)
262 Disp = CurDAG->getTargetBlockAddress(AM.BlockAddr, MVT::i32, AM.Disp,
263 AM.SymbolFlags);
265 Disp = CurDAG->getTargetConstant(AM.Disp, MVT::i32);
267 if (AM.Segment.getNode())
268 Segment = AM.Segment;
595 X86ISelAddressMode &AM) {
596 int64_t Val = AM.Disp + Offset;
600 AM.hasSymbolicDisplacement()))
604 if (AM.BaseType == X86ISelAddressMode::FrameIndexBase &&
608 AM.Disp = Val;
613 bool X86DAGToDAGISel::MatchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM){
623 if (C->getSExtValue() == 0 && AM.Segment.getNode() == nullptr &&
627 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
630 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
641 bool X86DAGToDAGISel::MatchWrapper(SDValue N, X86ISelAddressMode &AM) {
644 if (AM.hasSymbolicDisplacement())
658 if (AM.hasBaseOrIndexReg())
661 X86ISelAddressMode Backup = AM;
662 AM.GV = G->getGlobal();
663 AM.SymbolFlags = G->getTargetFlags();
664 if (FoldOffsetIntoAddress(G->getOffset(), AM)) {
665 AM = Backup;
669 X86ISelAddressMode Backup = AM;
670 AM.CP = CP->getConstVal();
671 AM.Align = CP->getAlignment();
672 AM.SymbolFlags = CP->getTargetFlags();
673 if (FoldOffsetIntoAddress(CP->getOffset(), AM)) {
674 AM = Backup;
678 AM.ES = S->getSymbol();
679 AM.SymbolFlags = S->getTargetFlags();
681 AM.JT = J->getIndex();
682 AM.SymbolFlags = J->getTargetFlags();
684 X86ISelAddressMode Backup = AM;
685 AM.BlockAddr = BA->getBlockAddress();
686 AM.SymbolFlags = BA->getTargetFlags();
687 if (FoldOffsetIntoAddress(BA->getOffset(), AM)) {
688 AM = Backup;
695 AM.setBaseReg(CurDAG->getRegister(X86::RIP, MVT::i64));
707 AM.GV = G->getGlobal();
708 AM.Disp += G->getOffset();
709 AM.SymbolFlags = G->getTargetFlags();
711 AM.CP = CP->getConstVal();
712 AM.Align = CP->getAlignment();
713 AM.Disp += CP->getOffset();
714 AM.SymbolFlags = CP->getTargetFlags();
716 AM.ES = S->getSymbol();
717 AM.SymbolFlags = S->getTargetFlags();
719 AM.JT = J->getIndex();
720 AM.SymbolFlags = J->getTargetFlags();
722 AM.BlockAddr = BA->getBlockAddress();
723 AM.Disp += BA->getOffset();
724 AM.SymbolFlags = BA->getTargetFlags();
736 bool X86DAGToDAGISel::MatchAddress(SDValue N, X86ISelAddressMode &AM) {
737 if (MatchAddressRecursively(N, AM, 0))
742 if (AM.Scale == 2 &&
743 AM.BaseType == X86ISelAddressMode::RegBase &&
744 AM.Base_Reg.getNode() == nullptr) {
745 AM.Base_Reg = AM.IndexReg;
746 AM.Scale = 1;
754 AM.Scale == 1 &&
755 AM.BaseType == X86ISelAddressMode::RegBase &&
756 AM.Base_Reg.getNode() == nullptr &&
757 AM.IndexReg.getNode() == nullptr &&
758 AM.SymbolFlags == X86II::MO_NO_FLAG &&
759 AM.hasSymbolicDisplacement())
760 AM.Base_Reg = CurDAG->getRegister(X86::RIP, MVT::i64);
784 X86ISelAddressMode &AM) {
816 AM.IndexReg = And;
817 AM.Scale = (1 << ScaleLog);
827 X86ISelAddressMode &AM) {
859 AM.Scale = 1 << ShiftAmt;
860 AM.IndexReg = NewAnd;
894 X86ISelAddressMode &AM) {
967 AM.Scale = 1 << AMShiftAmt;
968 AM.IndexReg = NewSRL;
972 bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
977 AM.dump();
981 return MatchAddressBase(N, AM);
986 if (AM.isRIPRelative()) {
990 if (!AM.ES && AM.JT != -1) return true;
993 if (!FoldOffsetIntoAddress(Cst->getSExtValue(), AM))
1002 if (!FoldOffsetIntoAddress(Val, AM))
1009 if (!MatchWrapper(N, AM))
1014 if (!MatchLoadInAddress(cast<LoadSDNode>(N), AM))
1019 if (AM.BaseType == X86ISelAddressMode::RegBase &&
1020 AM.Base_Reg.getNode() == nullptr &&
1021 (!Subtarget->is64Bit() || isDispSafeForFrameIndex(AM.Disp))) {
1022 AM.BaseType = X86ISelAddressMode::FrameIndexBase;
1023 AM.Base_FrameIndex = cast<FrameIndexSDNode>(N)->getIndex();
1029 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1)
1040 AM.Scale = 1 << Val;
1047 AM.IndexReg = ShVal.getNode()->getOperand(0);
1051 if (!FoldOffsetIntoAddress(Disp, AM))
1055 AM.IndexReg = ShVal;
1063 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1) break;
1083 if (!FoldMaskAndShiftToScale(*CurDAG, N, Mask, N, X, AM))
1096 if (AM.BaseType == X86ISelAddressMode::RegBase &&
1097 AM.Base_Reg.getNode() == nullptr &&
1098 AM.IndexReg.getNode() == nullptr) {
1103 AM.Scale = unsigned(CN->getZExtValue())-1;
1117 if (FoldOffsetIntoAddress(Disp, AM))
1123 AM.IndexReg = AM.Base_Reg = Reg;
1142 X86ISelAddressMode Backup = AM;
1143 if (MatchAddressRecursively(N.getNode()->getOperand(0), AM, Depth+1)) {
1144 AM = Backup;
1148 if (AM.IndexReg.getNode() || AM.isRIPRelative()) {
1149 AM = Backup;
1167 if ((AM.BaseType == X86ISelAddressMode::RegBase &&
1168 AM.Base_Reg.getNode() &&
1169 !AM.Base_Reg.getNode()->hasOneUse()) ||
1170 AM.BaseType == X86ISelAddressMode::FrameIndexBase)
1174 if ((AM.hasSymbolicDisplacement() && !Backup.hasSymbolicDisplacement()) +
1175 ((AM.Disp != 0) && (Backup.Disp == 0)) +
1176 (AM.Segment.getNode() && !Backup.Segment.getNode()) >= 2)
1180 AM = Backup;
1187 AM.IndexReg = Neg;
1188 AM.Scale = 1;
1201 X86ISelAddressMode Backup = AM;
1202 if (!MatchAddressRecursively(N.getOperand(0), AM, Depth+1) &&
1203 !MatchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth+1))
1205 AM = Backup;
1208 if (!MatchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth+1)&&
1209 !MatchAddressRecursively(Handle.getValue().getOperand(0), AM, Depth+1))
1211 AM = Backup;
1216 if (AM.BaseType == X86ISelAddressMode::RegBase &&
1217 !AM.Base_Reg.getNode() &&
1218 !AM.IndexReg.getNode()) {
1220 AM.Base_Reg = N.getOperand(0);
1221 AM.IndexReg = N.getOperand(1);
1222 AM.Scale = 1;
1232 X86ISelAddressMode Backup = AM;
1236 if (!MatchAddressRecursively(N.getOperand(0), AM, Depth+1) &&
1237 !FoldOffsetIntoAddress(CN->getSExtValue(), AM))
1239 AM = Backup;
1248 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1) break;
1263 if (!FoldMaskAndShiftToExtract(*CurDAG, N, Mask, Shift, X, AM))
1267 if (!FoldMaskAndShiftToScale(*CurDAG, N, Mask, Shift, X, AM))
1272 if (!FoldMaskedShiftToScaledMask(*CurDAG, N, Mask, Shift, X, AM))
1278 return MatchAddressBase(N, AM);
1283 bool X86DAGToDAGISel::MatchAddressBase(SDValue N, X86ISelAddressMode &AM) {
1285 if (AM.BaseType != X86ISelAddressMode::RegBase || AM.Base_Reg.getNode()) {
1287 if (!AM.IndexReg.getNode()) {
1288 AM.IndexReg = N;
1289 AM.Scale = 1;
1298 AM.BaseType = X86ISelAddressMode::RegBase;
1299 AM.Base_Reg = N;
1313 X86ISelAddressMode AM;
1327 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
1329 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
1332 if (MatchAddress(N, AM))
1336 if (AM.BaseType == X86ISelAddressMode::RegBase) {
1337 if (!AM.Base_Reg.getNode())
1338 AM.Base_Reg = CurDAG->getRegister(0, VT);
1341 if (!AM.IndexReg.getNode())
1342 AM.IndexReg = CurDAG->getRegister(0, VT);
1344 getAddressOperands(AM, Base, Scale, Index, Disp, Segment);
1465 X86ISelAddressMode AM;
1467 // Set AM.Segment to prevent MatchAddress from using one. LEA doesn't support
1469 SDValue Copy = AM.Segment;
1471 AM.Segment = T;
1472 if (MatchAddress(N, AM))
1474 assert (T == AM.Segment);
1475 AM.Segment = Copy;
1479 if (AM.BaseType == X86ISelAddressMode::RegBase)
1480 if (AM.Base_Reg.getNode())
1483 AM.Base_Reg = CurDAG->getRegister(0, VT);
1484 else if (AM.BaseType == X86ISelAddressMode::FrameIndexBase)
1487 if (AM.IndexReg.getNode())
1490 AM.IndexReg = CurDAG->getRegister(0, VT);
1494 if (AM.Scale > 1)
1502 if (AM.hasSymbolicDisplacement()) {
1511 if (AM.Disp && (AM.Base_Reg.getNode() || AM.IndexReg.getNode()))
1518 getAddressOperands(AM, Base, Scale, Index, Disp, Segment);
1529 X86ISelAddressMode AM;
1530 AM.GV = GA->getGlobal();
1531 AM.Disp += GA->getOffset();
1532 AM.Base_Reg = CurDAG->getRegister(0, N.getValueType());
1533 AM.SymbolFlags = GA->getTargetFlags();
1536 AM.Scale = 1;
1537 AM.IndexReg = CurDAG->getRegister(X86::EBX, MVT::i32);
1539 AM.IndexReg = CurDAG->getRegister(0, MVT::i64);
1542 getAddressOperands(AM, Base, Scale, Index, Disp, Segment);