• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/contrib/llvm-project/llvm/lib/Target/X86/

Lines Matching refs:AM

206     bool foldOffsetIntoAddress(uint64_t Offset, X86ISelAddressMode &AM);
207 bool matchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM);
208 bool matchWrapper(SDValue N, X86ISelAddressMode &AM);
209 bool matchAddress(SDValue N, X86ISelAddressMode &AM);
210 bool matchVectorAddress(SDValue N, X86ISelAddressMode &AM);
211 bool matchAdd(SDValue &N, X86ISelAddressMode &AM, unsigned Depth);
212 bool matchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
214 bool matchAddressBase(SDValue N, X86ISelAddressMode &AM);
260 inline void getAddressOperands(X86ISelAddressMode &AM, const SDLoc &DL,
264 if (AM.BaseType == X86ISelAddressMode::FrameIndexBase)
266 AM.Base_FrameIndex, TLI->getPointerTy(CurDAG->getDataLayout()));
267 else if (AM.Base_Reg.getNode())
268 Base = AM.Base_Reg;
272 Scale = getI8Imm(AM.Scale, DL);
275 if (AM.NegateIndex) {
278 AM.IndexReg), 0);
279 AM.IndexReg = Neg;
282 if (AM.IndexReg.getNode())
283 Index = AM.IndexReg;
289 if (AM.GV)
290 Disp = CurDAG->getTargetGlobalAddress(AM.GV, SDLoc(),
291 MVT::i32, AM.Disp,
292 AM.SymbolFlags);
293 else if (AM.CP)
294 Disp = CurDAG->getTargetConstantPool(AM.CP, MVT::i32, AM.Alignment,
295 AM.Disp, AM.SymbolFlags);
296 else if (AM.ES) {
297 assert(!AM.Disp && "Non-zero displacement is ignored with ES.");
298 Disp = CurDAG->getTargetExternalSymbol(AM.ES, MVT::i32, AM.SymbolFlags);
299 } else if (AM.MCSym) {
300 assert(!AM.Disp && "Non-zero displacement is ignored with MCSym.");
301 assert(AM.SymbolFlags == 0 && "oo");
302 Disp = CurDAG->getMCSymbol(AM.MCSym, MVT::i32);
303 } else if (AM.JT != -1) {
304 assert(!AM.Disp && "Non-zero displacement is ignored with JT.");
305 Disp = CurDAG->getTargetJumpTable(AM.JT, MVT::i32, AM.SymbolFlags);
306 } else if (AM.BlockAddr)
307 Disp = CurDAG->getTargetBlockAddress(AM.BlockAddr, MVT::i32, AM.Disp,
308 AM.SymbolFlags);
310 Disp = CurDAG->getTargetConstant(AM.Disp, DL, MVT::i32);
312 if (AM.Segment.getNode())
313 Segment = AM.Segment;
1522 X86ISelAddressMode &AM) {
1527 int64_t Val = AM.Disp + Offset;
1530 if (Val != 0 && (AM.ES || AM.MCSym))
1537 AM.hasSymbolicDisplacement()))
1541 if (AM.BaseType == X86ISelAddressMode::FrameIndexBase &&
1545 AM.Disp = Val;
1550 bool X86DAGToDAGISel::matchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM){
1560 if (C->getSExtValue() == 0 && AM.Segment.getNode() == nullptr &&
1566 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
1569 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
1581 bool X86DAGToDAGISel::matchWrapper(SDValue N, X86ISelAddressMode &AM) {
1584 if (AM.hasSymbolicDisplacement())
1607 if (IsRIPRel && AM.hasBaseOrIndexReg())
1611 X86ISelAddressMode Backup = AM;
1616 AM.GV = G->getGlobal();
1617 AM.SymbolFlags = G->getTargetFlags();
1620 AM.CP = CP->getConstVal();
1621 AM.Alignment = CP->getAlign();
1622 AM.SymbolFlags = CP->getTargetFlags();
1625 AM.ES = S->getSymbol();
1626 AM.SymbolFlags = S->getTargetFlags();
1628 AM.MCSym = S->getMCSymbol();
1630 AM.JT = J->getIndex();
1631 AM.SymbolFlags = J->getTargetFlags();
1633 AM.BlockAddr = BA->getBlockAddress();
1634 AM.SymbolFlags = BA->getTargetFlags();
1639 if (foldOffsetIntoAddress(Offset, AM)) {
1640 AM = Backup;
1645 AM.setBaseReg(CurDAG->getRegister(X86::RIP, MVT::i64));
1653 bool X86DAGToDAGISel::matchAddress(SDValue N, X86ISelAddressMode &AM) {
1654 if (matchAddressRecursively(N, AM, 0))
1659 if (AM.Scale == 2 &&
1660 AM.BaseType == X86ISelAddressMode::RegBase &&
1661 AM.Base_Reg.getNode() == nullptr) {
1662 AM.Base_Reg = AM.IndexReg;
1663 AM.Scale = 1;
1674 AM.Scale == 1 &&
1675 AM.BaseType == X86ISelAddressMode::RegBase &&
1676 AM.Base_Reg.getNode() == nullptr &&
1677 AM.IndexReg.getNode() == nullptr &&
1678 AM.SymbolFlags == X86II::MO_NO_FLAG &&
1679 AM.hasSymbolicDisplacement())
1680 AM.Base_Reg = CurDAG->getRegister(X86::RIP, MVT::i64);
1687 bool X86DAGToDAGISel::matchAdd(SDValue &N, X86ISelAddressMode &AM,
1693 X86ISelAddressMode Backup = AM;
1694 if (!matchAddressRecursively(N.getOperand(0), AM, Depth+1) &&
1695 !matchAddressRecursively(Handle.getValue().getOperand(1), AM, Depth+1))
1697 AM = Backup;
1700 if (!matchAddressRecursively(Handle.getValue().getOperand(1), AM,
1702 !matchAddressRecursively(Handle.getValue().getOperand(0), AM, Depth + 1))
1704 AM = Backup;
1709 if (AM.BaseType == X86ISelAddressMode::RegBase &&
1710 !AM.Base_Reg.getNode() &&
1711 !AM.IndexReg.getNode()) {
1713 AM.Base_Reg = N.getOperand(0);
1714 AM.IndexReg = N.getOperand(1);
1715 AM.Scale = 1;
1748 X86ISelAddressMode &AM) {
1781 AM.IndexReg = And;
1782 AM.Scale = (1 << ScaleLog);
1790 X86ISelAddressMode &AM) {
1849 AM.Scale = 1 << ShiftAmt;
1850 AM.IndexReg = NewAnd;
1884 X86ISelAddressMode &AM) {
1960 AM.Scale = 1 << AMShiftAmt;
1961 AM.IndexReg = NewSRL;
1971 X86ISelAddressMode &AM,
2019 AM.Scale = 1 << AMShiftAmt;
2020 AM.IndexReg = NewAnd;
2024 bool X86DAGToDAGISel::matchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
2029 AM.dump(CurDAG);
2033 return matchAddressBase(N, AM);
2038 if (AM.isRIPRelative()) {
2042 if (!(AM.ES || AM.MCSym) && AM.JT != -1)
2046 if (!foldOffsetIntoAddress(Cst->getSExtValue(), AM))
2054 if (!AM.hasSymbolicDisplacement() && AM.Disp == 0)
2057 AM.MCSym = ESNode->getMCSymbol();
2064 if (!foldOffsetIntoAddress(Val, AM))
2071 if (!matchWrapper(N, AM))
2076 if (!matchLoadInAddress(cast<LoadSDNode>(N), AM))
2081 if (AM.BaseType == X86ISelAddressMode::RegBase &&
2082 AM.Base_Reg.getNode() == nullptr &&
2083 (!Subtarget->is64Bit() || isDispSafeForFrameIndex(AM.Disp))) {
2084 AM.BaseType = X86ISelAddressMode::FrameIndexBase;
2085 AM.Base_FrameIndex = cast<FrameIndexSDNode>(N)->getIndex();
2091 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1)
2101 AM.Scale = 1 << Val;
2108 AM.IndexReg = ShVal.getOperand(0);
2111 if (!foldOffsetIntoAddress(Disp, AM))
2115 AM.IndexReg = ShVal;
2123 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1) break;
2144 if (!foldMaskAndShiftToScale(*CurDAG, N, Mask, N, X, AM))
2157 if (AM.BaseType == X86ISelAddressMode::RegBase &&
2158 AM.Base_Reg.getNode() == nullptr &&
2159 AM.IndexReg.getNode() == nullptr) {
2163 AM.Scale = unsigned(CN->getZExtValue())-1;
2177 if (foldOffsetIntoAddress(Disp, AM))
2183 AM.IndexReg = AM.Base_Reg = Reg;
2202 X86ISelAddressMode Backup = AM;
2203 if (matchAddressRecursively(N.getOperand(0), AM, Depth+1)) {
2205 AM = Backup;
2210 if (AM.IndexReg.getNode() || AM.isRIPRelative()) {
2211 AM = Backup;
2229 if ((AM.BaseType == X86ISelAddressMode::RegBase && AM.Base_Reg.getNode() &&
2230 !AM.Base_Reg.getNode()->hasOneUse()) ||
2231 AM.BaseType == X86ISelAddressMode::FrameIndexBase)
2235 if ((AM.hasSymbolicDisplacement() && !Backup.hasSymbolicDisplacement()) +
2236 ((AM.Disp != 0) && (Backup.Disp == 0)) +
2237 (AM.Segment.getNode() && !Backup.Segment.getNode()) >= 2)
2241 AM = Backup;
2248 AM.IndexReg = RHS;
2249 AM.NegateIndex = true;
2250 AM.Scale = 1;
2255 if (!matchAdd(N, AM, Depth))
2267 !matchAdd(N, AM, Depth))
2276 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1) break;
2293 if (!foldMaskAndShiftToExtract(*CurDAG, N, Mask, Shift, X, AM))
2297 if (!foldMaskAndShiftToScale(*CurDAG, N, Mask, Shift, X, AM))
2301 if (!foldMaskedShiftToBEXTR(*CurDAG, N, Mask, Shift, X, AM, *Subtarget))
2307 if (!foldMaskedShiftToScaledMask(*CurDAG, N, AM))
2315 if (AM.IndexReg.getNode() != nullptr || AM.Scale != 1)
2340 AM.Scale = 1 << ShAmtC->getZExtValue();
2341 AM.IndexReg = Zext;
2351 return matchAddressBase(N, AM);
2356 bool X86DAGToDAGISel::matchAddressBase(SDValue N, X86ISelAddressMode &AM) {
2358 if (AM.BaseType != X86ISelAddressMode::RegBase || AM.Base_Reg.getNode()) {
2360 if (!AM.IndexReg.getNode()) {
2361 AM.IndexReg = N;
2362 AM.Scale = 1;
2371 AM.BaseType = X86ISelAddressMode::RegBase;
2372 AM.Base_Reg = N;
2379 bool X86DAGToDAGISel::matchVectorAddress(SDValue N, X86ISelAddressMode &AM) {
2384 if (!foldOffsetIntoAddress(Val, AM))
2389 if (!matchWrapper(N, AM))
2394 return matchAddressBase(N, AM);
2402 X86ISelAddressMode AM;
2403 AM.IndexReg = IndexOp;
2404 AM.Scale = cast<ConstantSDNode>(ScaleOp)->getZExtValue();
2408 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
2410 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
2412 AM.Segment = CurDAG->getRegister(X86::SS, MVT::i16);
2418 if (matchVectorAddress(BasePtr, AM))
2421 getAddressOperands(AM, DL, VT, Base, Scale, Index, Disp, Segment);
2435 X86ISelAddressMode AM;
2450 AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
2452 AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
2454 AM.Segment = CurDAG->getRegister(X86::SS, MVT::i16);
2461 if (matchAddress(N, AM))
2464 getAddressOperands(AM, DL, VT, Base, Scale, Index, Disp, Segment);
2534 X86ISelAddressMode AM;
2540 // Set AM.Segment to prevent MatchAddress from using one. LEA doesn't support
2542 SDValue Copy = AM.Segment;
2544 AM.Segment = T;
2545 if (matchAddress(N, AM))
2547 assert (T == AM.Segment);
2548 AM.Segment = Copy;
2551 if (AM.BaseType == X86ISelAddressMode::RegBase && AM.Base_Reg.getNode())
2553 else if (AM.BaseType == X86ISelAddressMode::FrameIndexBase)
2556 if (AM.IndexReg.getNode())
2561 if (AM.Scale > 1)
2569 if (AM.hasSymbolicDisplacement()) {
2608 if (AM.Disp)
2615 getAddressOperands(AM, DL, VT, Base, Scale, Index, Disp, Segment);
2626 X86ISelAddressMode AM;
2627 AM.GV = GA->getGlobal();
2628 AM.Disp += GA->getOffset();
2629 AM.SymbolFlags = GA->getTargetFlags();
2633 AM.Scale = 1;
2634 AM.IndexReg = CurDAG->getRegister(X86::EBX, MVT::i32);
2637 getAddressOperands(AM, SDLoc(N), VT, Base, Scale, Index, Disp, Segment);