@@ -1367,6 +1367,59 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
1367
1367
MBB.erase (I);
1368
1368
}
1369
1369
1370
+
1371
+ int64_t ARMBaseRegisterInfo::
1372
+ getFrameIndexInstrOffset (MachineInstr *MI, int Idx) const {
1373
+ const TargetInstrDesc &Desc = MI->getDesc ();
1374
+ unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
1375
+ int64_t InstrOffs = 0 ;;
1376
+ int Scale = 1 ;
1377
+ unsigned ImmIdx = 0 ;
1378
+ switch (AddrMode) {
1379
+ case ARMII::AddrModeT2_i8:
1380
+ case ARMII::AddrModeT2_i12:
1381
+ // i8 supports only negative, and i12 supports only positive, so
1382
+ // based on Offset sign, consider the appropriate instruction
1383
+ InstrOffs = MI->getOperand (Idx+1 ).getImm ();
1384
+ Scale = 1 ;
1385
+ break ;
1386
+ case ARMII::AddrMode5: {
1387
+ // VFP address mode.
1388
+ const MachineOperand &OffOp = MI->getOperand (Idx+1 );
1389
+ int InstrOffs = ARM_AM::getAM5Offset (OffOp.getImm ());
1390
+ if (ARM_AM::getAM5Op (OffOp.getImm ()) == ARM_AM::sub)
1391
+ InstrOffs = -InstrOffs;
1392
+ Scale = 4 ;
1393
+ break ;
1394
+ }
1395
+ case ARMII::AddrMode2: {
1396
+ ImmIdx = Idx+2 ;
1397
+ InstrOffs = ARM_AM::getAM2Offset (MI->getOperand (ImmIdx).getImm ());
1398
+ if (ARM_AM::getAM2Op (MI->getOperand (ImmIdx).getImm ()) == ARM_AM::sub)
1399
+ InstrOffs = -InstrOffs;
1400
+ break ;
1401
+ }
1402
+ case ARMII::AddrMode3: {
1403
+ ImmIdx = Idx+2 ;
1404
+ InstrOffs = ARM_AM::getAM3Offset (MI->getOperand (ImmIdx).getImm ());
1405
+ if (ARM_AM::getAM3Op (MI->getOperand (ImmIdx).getImm ()) == ARM_AM::sub)
1406
+ InstrOffs = -InstrOffs;
1407
+ break ;
1408
+ }
1409
+ case ARMII::AddrModeT1_s: {
1410
+ ImmIdx = Idx+1 ;
1411
+ InstrOffs = MI->getOperand (ImmIdx).getImm ();
1412
+ Scale = 4 ;
1413
+ break ;
1414
+ }
1415
+ default :
1416
+ llvm_unreachable (" Unsupported addressing mode!" );
1417
+ break ;
1418
+ }
1419
+
1420
+ return InstrOffs * Scale;
1421
+ }
1422
+
1370
1423
// / needsFrameBaseReg - Returns true if the instruction's frame index
1371
1424
// / reference would be better served by a base register other than FP
1372
1425
// / or SP. Used by LocalStackFrameAllocation to determine which frame index
@@ -1404,16 +1457,16 @@ needsFrameBaseReg(MachineInstr *MI, unsigned operand) const {
1404
1457
// / materializeFrameBaseRegister - Insert defining instruction(s) for
1405
1458
// / BaseReg to be a pointer to FrameIdx before insertion point I.
1406
1459
void ARMBaseRegisterInfo::
1407
- materializeFrameBaseRegister (MachineBasicBlock::iterator I,
1408
- unsigned BaseReg, int FrameIdx ) const {
1460
+ materializeFrameBaseRegister (MachineBasicBlock::iterator I, unsigned BaseReg,
1461
+ int FrameIdx, int64_t Offset ) const {
1409
1462
ARMFunctionInfo *AFI =
1410
1463
I->getParent ()->getParent ()->getInfo <ARMFunctionInfo>();
1411
1464
unsigned ADDriOpc = !AFI->isThumbFunction () ? ARM::ADDri :
1412
1465
(AFI->isThumb1OnlyFunction () ? ARM::tADDrSPi : ARM::t2ADDri);
1413
1466
1414
1467
MachineInstrBuilder MIB =
1415
1468
BuildMI (*I->getParent (), I, I->getDebugLoc (), TII.get (ADDriOpc), BaseReg)
1416
- .addFrameIndex (FrameIdx).addImm (0 );
1469
+ .addFrameIndex (FrameIdx).addImm (Offset );
1417
1470
if (!AFI->isThumb1OnlyFunction ())
1418
1471
AddDefaultCC (AddDefaultPred (MIB));
1419
1472
}
@@ -1445,8 +1498,8 @@ ARMBaseRegisterInfo::resolveFrameIndex(MachineBasicBlock::iterator I,
1445
1498
assert (Done && " Unable to resolve frame index!" );
1446
1499
}
1447
1500
1448
- bool ARMBaseRegisterInfo::isBaseRegInRange (const MachineInstr *MI,
1449
- unsigned Reg, int64_t Offset) const {
1501
+ bool ARMBaseRegisterInfo::isFrameOffsetLegal (const MachineInstr *MI,
1502
+ int64_t Offset) const {
1450
1503
const TargetInstrDesc &Desc = MI->getDesc ();
1451
1504
unsigned AddrMode = (Desc.TSFlags & ARMII::AddrModeMask);
1452
1505
unsigned i = 0 ;
@@ -1464,6 +1517,7 @@ bool ARMBaseRegisterInfo::isBaseRegInRange(const MachineInstr *MI,
1464
1517
unsigned Scale = 1 ;
1465
1518
unsigned ImmIdx = 0 ;
1466
1519
int InstrOffs = 0 ;;
1520
+ bool isSigned = true ;
1467
1521
switch (AddrMode) {
1468
1522
case ARMII::AddrModeT2_i8:
1469
1523
case ARMII::AddrModeT2_i12:
@@ -1509,6 +1563,7 @@ bool ARMBaseRegisterInfo::isBaseRegInRange(const MachineInstr *MI,
1509
1563
InstrOffs = MI->getOperand (ImmIdx).getImm ();
1510
1564
NumBits = 5 ;
1511
1565
Scale = 4 ;
1566
+ isSigned = false ;
1512
1567
break ;
1513
1568
}
1514
1569
default :
@@ -1518,7 +1573,7 @@ bool ARMBaseRegisterInfo::isBaseRegInRange(const MachineInstr *MI,
1518
1573
1519
1574
Offset += InstrOffs * Scale;
1520
1575
assert ((Offset & (Scale-1 )) == 0 && " Can't encode this offset!" );
1521
- if (Offset < 0 )
1576
+ if (isSigned && Offset < 0 )
1522
1577
Offset = -Offset;
1523
1578
1524
1579
unsigned Mask = (1 << NumBits) - 1 ;
0 commit comments