Home | History | Annotate | Download | only in Scalar

Lines Matching refs:AM

215   /// AM - This is used to represent complex addressing, as well as other kinds
217 TargetLowering::AddrMode AM;
220 /// non-empty, AM.HasBaseReg should be set to true.
224 /// when AM.Scale is not zero.
318 AM.HasBaseReg = true;
324 AM.HasBaseReg = true;
340 AM.BaseGV ? AM.BaseGV->getType() :
373 if (AM.BaseGV) {
375 WriteAsOperand(OS, AM.BaseGV, /*PrintType=*/false);
377 if (AM.BaseOffs != 0) {
379 OS << AM.BaseOffs;
386 if (AM.HasBaseReg && BaseRegs.empty()) {
389 } else if (!AM.HasBaseReg && !BaseRegs.empty()) {
393 if (AM.Scale != 0) {
395 OS << AM.Scale << "*reg(";
839 int64_t Offset = (uint64_t)*I + F.AM.BaseOffs;
840 if (F.AM.BaseGV)
1175 /// isLegalUse - Test whether the use described by AM is "legal", meaning it can
1178 static bool isLegalUse(const TargetLowering::AddrMode &AM,
1185 if (TLI) return TLI->isLegalAddressingMode(AM, AccessTy);
1188 return !AM.BaseGV && AM.BaseOffs == 0 && AM.Scale <= 1;
1193 if (AM.BaseGV)
1197 if (AM.Scale != 0 && AM.HasBaseReg && AM.BaseOffs != 0)
1202 if (AM.Scale != 0 && AM.Scale != -1)
1207 if (AM.BaseOffs != 0) {
1208 if (TLI) return TLI->isLegalICmpImmediate(-(uint64_t)AM.BaseOffs);
1216 return !AM.BaseGV && AM.Scale == 0 && AM.BaseOffs == 0;
1220 return AM.Scale == 0 || AM.Scale == -1;
1226 static bool isLegalUse(TargetLowering::AddrMode AM,
1231 if (((int64_t)((uint64_t)AM.BaseOffs + MinOffset) > AM.BaseOffs) !=
1234 AM.BaseOffs = (uint64_t)AM.BaseOffs + MinOffset;
1235 if (isLegalUse(AM, Kind, AccessTy, TLI)) {
1236 AM.BaseOffs = (uint64_t)AM.BaseOffs - MinOffset;
1238 if (((int64_t)((uint64_t)AM.BaseOffs + MaxOffset) > AM.BaseOffs) !=
1241 AM.BaseOffs = (uint64_t)AM.BaseOffs + MaxOffset;
1242 return isLegalUse(AM, Kind, AccessTy, TLI);
1257 TargetLowering::AddrMode AM;
1258 AM.BaseOffs = BaseOffs;
1259 AM.BaseGV = BaseGV;
1260 AM.HasBaseReg = HasBaseReg;
1261 AM.Scale = Kind == LSRUse::ICmpZero ? -1 : 1;
1265 if (!AM.HasBaseReg && AM.Scale == 1) {
1266 AM.Scale = 0;
1267 AM.HasBaseReg = true;
1270 return isLegalUse(AM, Kind, AccessTy, TLI);
1295 TargetLowering::AddrMode AM;
1296 AM.BaseOffs = BaseOffs;
1297 AM.BaseGV = BaseGV;
1298 AM.HasBaseReg = HasBaseReg;
1299 AM.Scale = Kind == LSRUse::ICmpZero ? -1 : 1;
1301 return isLegalUse(AM, MinOffset, MaxOffset, Kind, AccessTy, TLI);
1836 TargetLowering::AddrMode AM;
1837 AM.Scale = C->getSExtValue();
1838 if (TLI->isLegalAddressingMode(AM, AccessTy))
1840 AM.Scale = -AM.Scale;
1841 if (TLI->isLegalAddressingMode(AM, AccessTy))
2014 F.AM.BaseGV == OrigF.AM.BaseGV &&
2015 F.AM.Scale == OrigF.AM.Scale &&
2017 if (F.AM.BaseOffs == 0)
2187 F.AM.HasBaseReg = true;
2454 if (Base.AM.BaseGV) return;
2462 F.AM.BaseGV = GV;
2463 if (!isLegalUse(F.AM, LU.MinOffset, LU.MaxOffset,
2487 F.AM.BaseOffs = (uint64_t)Base.AM.BaseOffs - *I;
2488 if (isLegalUse(F.AM, LU.MinOffset - *I, LU.MaxOffset - *I,
2507 F.AM.BaseOffs = (uint64_t)F.AM.BaseOffs + Imm;
2508 if (!isLegalUse(F.AM, LU.MinOffset, LU.MaxOffset,
2530 assert(!Base.AM.BaseGV && "ICmpZero use is not legal!");
2538 if (Base.AM.BaseOffs == INT64_MIN && Factor == -1)
2540 int64_t NewBaseOffs = (uint64_t)Base.AM.BaseOffs * Factor;
2541 if (NewBaseOffs / Factor != Base.AM.BaseOffs)
2553 F.AM.BaseOffs = NewBaseOffs;
2556 if (!isLegalUse(F.AM, Offset, Offset, LU.Kind, LU.AccessTy, TLI))
2560 F.AM.BaseOffs = (uint64_t)F.AM.BaseOffs + Offset - LU.MinOffset;
2601 if (Base.AM.Scale != 0) return;
2608 Base.AM.Scale = Factor;
2609 Base.AM.HasBaseReg = Base.BaseRegs.size() > 1;
2611 if (!isLegalUse(Base.AM, LU.MinOffset, LU.MaxOffset,
2616 isLegalUse(Base.AM, LU.MinOffset, LU.MaxOffset,
2626 !Base.AM.HasBaseReg && Base.AM.BaseOffs == 0 && !Base.AM.BaseGV)
2654 if (Base.AM.BaseGV) return;
2809 int64_t Offs = (uint64_t)F.AM.BaseOffs +
2810 Imm * (uint64_t)F.AM.Scale;
2816 NewF.AM.BaseOffs = Offs;
2817 if (!isLegalUse(NewF.AM, LU.MinOffset, LU.MaxOffset,
2827 (NewF.AM.BaseOffs < 0) &&
2828 (C->getValue()->getValue().abs() * APInt(BitWidth, F.AM.Scale))
2829 .ule(abs64(NewF.AM.BaseOffs)))
2841 NewF.AM.BaseOffs = (uint64_t)NewF.AM.BaseOffs + Imm;
2842 if (!isLegalUse(NewF.AM, LU.MinOffset, LU.MaxOffset,
2859 if ((C->getValue()->getValue() + NewF.AM.BaseOffs).abs().slt(
2860 abs64(NewF.AM.BaseOffs)) &&
2862 NewF.AM.BaseOffs).countTrailingZeros() >=
2863 CountTrailingZeros_64(NewF.AM.BaseOffs))
3040 NewF.AM.BaseOffs += C->getValue()->getSExtValue();
3053 if (!F.AM.BaseGV) {
3055 NewF.AM.BaseGV = GV;
3098 if (F.AM.BaseOffs != 0 && F.AM.Scale == 0) {
3100 AM.BaseOffs,
3114 Fixup.Offset += F.AM.BaseOffs;
3134 if (!isLegalUse(F.AM,
3548 if (F.AM.Scale != 0) {
3561 assert(F.AM.Scale == -1 &&
3569 SE.getConstant(ScaledS->getType(), F.AM.Scale));
3580 if (F.AM.BaseGV) {
3581 Ops.push_back(SE.getUnknown(F.AM.BaseGV));
3590 int64_t Offset = (uint64_t)F.AM.BaseOffs + LF.Offset;
3631 assert(!F.AM.BaseGV && "ICmp does not support folding a global value and "
3633 if (F.AM.Scale == -1) {
3643 assert(F.AM.Scale == 0 &&
3870 assert(isLegalUse(J->AM, LU.MinOffset, LU.MaxOffset,