mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-16 07:38:43 +00:00
Code clean up and prepare for Thumb2 support. No functionality changes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82805 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
483011018e
commit
eef490f459
@ -1071,6 +1071,7 @@ namespace {
|
|||||||
const TargetRegisterInfo *TRI;
|
const TargetRegisterInfo *TRI;
|
||||||
const ARMSubtarget *STI;
|
const ARMSubtarget *STI;
|
||||||
MachineRegisterInfo *MRI;
|
MachineRegisterInfo *MRI;
|
||||||
|
MachineFunction *MF;
|
||||||
|
|
||||||
virtual bool runOnMachineFunction(MachineFunction &Fn);
|
virtual bool runOnMachineFunction(MachineFunction &Fn);
|
||||||
|
|
||||||
@ -1083,7 +1084,8 @@ namespace {
|
|||||||
unsigned &NewOpc, unsigned &EvenReg,
|
unsigned &NewOpc, unsigned &EvenReg,
|
||||||
unsigned &OddReg, unsigned &BaseReg,
|
unsigned &OddReg, unsigned &BaseReg,
|
||||||
unsigned &OffReg, unsigned &Offset,
|
unsigned &OffReg, unsigned &Offset,
|
||||||
unsigned &PredReg, ARMCC::CondCodes &Pred);
|
unsigned &PredReg, ARMCC::CondCodes &Pred,
|
||||||
|
bool &isT2);
|
||||||
bool RescheduleOps(MachineBasicBlock *MBB,
|
bool RescheduleOps(MachineBasicBlock *MBB,
|
||||||
SmallVector<MachineInstr*, 4> &Ops,
|
SmallVector<MachineInstr*, 4> &Ops,
|
||||||
unsigned Base, bool isLd,
|
unsigned Base, bool isLd,
|
||||||
@ -1099,6 +1101,7 @@ bool ARMPreAllocLoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
|
|||||||
TRI = Fn.getTarget().getRegisterInfo();
|
TRI = Fn.getTarget().getRegisterInfo();
|
||||||
STI = &Fn.getTarget().getSubtarget<ARMSubtarget>();
|
STI = &Fn.getTarget().getSubtarget<ARMSubtarget>();
|
||||||
MRI = &Fn.getRegInfo();
|
MRI = &Fn.getRegInfo();
|
||||||
|
MF = &Fn;
|
||||||
|
|
||||||
bool Modified = false;
|
bool Modified = false;
|
||||||
for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
|
for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
|
||||||
@ -1162,15 +1165,29 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
|
|||||||
unsigned &OddReg, unsigned &BaseReg,
|
unsigned &OddReg, unsigned &BaseReg,
|
||||||
unsigned &OffReg, unsigned &Offset,
|
unsigned &OffReg, unsigned &Offset,
|
||||||
unsigned &PredReg,
|
unsigned &PredReg,
|
||||||
ARMCC::CondCodes &Pred) {
|
ARMCC::CondCodes &Pred,
|
||||||
|
bool &isT2) {
|
||||||
// FIXME: FLDS / FSTS -> FLDD / FSTD
|
// FIXME: FLDS / FSTS -> FLDD / FSTD
|
||||||
|
unsigned Scale = 1;
|
||||||
unsigned Opcode = Op0->getOpcode();
|
unsigned Opcode = Op0->getOpcode();
|
||||||
if (Opcode == ARM::LDR)
|
if (Opcode == ARM::LDR)
|
||||||
NewOpc = ARM::LDRD;
|
NewOpc = ARM::LDRD;
|
||||||
else if (Opcode == ARM::STR)
|
else if (Opcode == ARM::STR)
|
||||||
NewOpc = ARM::STRD;
|
NewOpc = ARM::STRD;
|
||||||
else
|
else if (Opcode == ARM::t2LDRi8 || Opcode == ARM::t2LDRi12) {
|
||||||
return 0;
|
NewOpc = ARM::t2LDRDi8;
|
||||||
|
Scale = 4;
|
||||||
|
isT2 = true;
|
||||||
|
} else if (Opcode == ARM::t2STRi8 || Opcode == ARM::t2STRi12) {
|
||||||
|
NewOpc = ARM::t2STRDi8;
|
||||||
|
Scale = 4;
|
||||||
|
isT2 = true;
|
||||||
|
} else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!isT2 &&
|
||||||
|
(Op0->getOperand(2).getReg() != Op1->getOperand(2).getReg()))
|
||||||
|
return false;
|
||||||
|
|
||||||
// Must sure the base address satisfies i64 ld / st alignment requirement.
|
// Must sure the base address satisfies i64 ld / st alignment requirement.
|
||||||
if (!Op0->hasOneMemOperand() ||
|
if (!Op0->hasOneMemOperand() ||
|
||||||
@ -1179,10 +1196,10 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned Align = (*Op0->memoperands_begin())->getAlignment();
|
unsigned Align = (*Op0->memoperands_begin())->getAlignment();
|
||||||
|
Function *Func = MF->getFunction();
|
||||||
unsigned ReqAlign = STI->hasV6Ops()
|
unsigned ReqAlign = STI->hasV6Ops()
|
||||||
? TD->getPrefTypeAlignment(
|
? TD->getPrefTypeAlignment(Type::getInt64Ty(Func->getContext()))
|
||||||
Type::getInt64Ty(Op0->getParent()->getParent()->getFunction()->getContext()))
|
: 8; // Pre-v6 need 8-byte align
|
||||||
: 8; // Pre-v6 need 8-byte align
|
|
||||||
if (Align < ReqAlign)
|
if (Align < ReqAlign)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1193,16 +1210,21 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
|
|||||||
AddSub = ARM_AM::sub;
|
AddSub = ARM_AM::sub;
|
||||||
OffImm = - OffImm;
|
OffImm = - OffImm;
|
||||||
}
|
}
|
||||||
if (OffImm >= 256) // 8 bits
|
int Limit = (1 << 8) * Scale;
|
||||||
|
if (OffImm >= Limit || (OffImm & (Scale-1)))
|
||||||
return false;
|
return false;
|
||||||
Offset = ARM_AM::getAM3Opc(AddSub, OffImm);
|
|
||||||
|
|
||||||
|
if (isT2)
|
||||||
|
Offset = OffImm;
|
||||||
|
else
|
||||||
|
Offset = ARM_AM::getAM3Opc(AddSub, OffImm);
|
||||||
EvenReg = Op0->getOperand(0).getReg();
|
EvenReg = Op0->getOperand(0).getReg();
|
||||||
OddReg = Op1->getOperand(0).getReg();
|
OddReg = Op1->getOperand(0).getReg();
|
||||||
if (EvenReg == OddReg)
|
if (EvenReg == OddReg)
|
||||||
return false;
|
return false;
|
||||||
BaseReg = Op0->getOperand(1).getReg();
|
BaseReg = Op0->getOperand(1).getReg();
|
||||||
OffReg = Op0->getOperand(2).getReg();
|
if (!isT2)
|
||||||
|
OffReg = Op0->getOperand(2).getReg();
|
||||||
Pred = llvm::getInstrPredicate(Op0, PredReg);
|
Pred = llvm::getInstrPredicate(Op0, PredReg);
|
||||||
dl = Op0->getDebugLoc();
|
dl = Op0->getDebugLoc();
|
||||||
return true;
|
return true;
|
||||||
@ -1255,7 +1277,7 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
|||||||
LastOffset = Offset;
|
LastOffset = Offset;
|
||||||
LastBytes = Bytes;
|
LastBytes = Bytes;
|
||||||
LastOpcode = Opcode;
|
LastOpcode = Opcode;
|
||||||
if (++NumMove == 8) // FIXME: Tune
|
if (++NumMove == 8) // FIXME: Tune this limit.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1291,29 +1313,36 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
|
|||||||
unsigned EvenReg = 0, OddReg = 0;
|
unsigned EvenReg = 0, OddReg = 0;
|
||||||
unsigned BaseReg = 0, OffReg = 0, PredReg = 0;
|
unsigned BaseReg = 0, OffReg = 0, PredReg = 0;
|
||||||
ARMCC::CondCodes Pred = ARMCC::AL;
|
ARMCC::CondCodes Pred = ARMCC::AL;
|
||||||
|
bool isT2 = false;
|
||||||
unsigned NewOpc = 0;
|
unsigned NewOpc = 0;
|
||||||
unsigned Offset = 0;
|
unsigned Offset = 0;
|
||||||
DebugLoc dl;
|
DebugLoc dl;
|
||||||
if (NumMove == 2 && CanFormLdStDWord(Op0, Op1, dl, NewOpc,
|
if (NumMove == 2 && CanFormLdStDWord(Op0, Op1, dl, NewOpc,
|
||||||
EvenReg, OddReg, BaseReg, OffReg,
|
EvenReg, OddReg, BaseReg, OffReg,
|
||||||
Offset, PredReg, Pred)) {
|
Offset, PredReg, Pred, isT2)) {
|
||||||
Ops.pop_back();
|
Ops.pop_back();
|
||||||
Ops.pop_back();
|
Ops.pop_back();
|
||||||
|
|
||||||
// Form the pair instruction.
|
// Form the pair instruction.
|
||||||
if (isLd) {
|
if (isLd) {
|
||||||
BuildMI(*MBB, InsertPos, dl, TII->get(NewOpc))
|
MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos,
|
||||||
|
dl, TII->get(NewOpc))
|
||||||
.addReg(EvenReg, RegState::Define)
|
.addReg(EvenReg, RegState::Define)
|
||||||
.addReg(OddReg, RegState::Define)
|
.addReg(OddReg, RegState::Define)
|
||||||
.addReg(BaseReg).addReg(0).addImm(Offset)
|
.addReg(BaseReg);
|
||||||
.addImm(Pred).addReg(PredReg);
|
if (!isT2)
|
||||||
|
MIB.addReg(OffReg);
|
||||||
|
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
|
||||||
++NumLDRDFormed;
|
++NumLDRDFormed;
|
||||||
} else {
|
} else {
|
||||||
BuildMI(*MBB, InsertPos, dl, TII->get(NewOpc))
|
MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos,
|
||||||
|
dl, TII->get(NewOpc))
|
||||||
.addReg(EvenReg)
|
.addReg(EvenReg)
|
||||||
.addReg(OddReg)
|
.addReg(OddReg)
|
||||||
.addReg(BaseReg).addReg(0).addImm(Offset)
|
.addReg(BaseReg);
|
||||||
.addImm(Pred).addReg(PredReg);
|
if (!isT2)
|
||||||
|
MIB.addReg(OffReg);
|
||||||
|
MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
|
||||||
++NumSTRDFormed;
|
++NumSTRDFormed;
|
||||||
}
|
}
|
||||||
MBB->erase(Op0);
|
MBB->erase(Op0);
|
||||||
@ -1369,9 +1398,8 @@ ARMPreAllocLoadStoreOpt::RescheduleLoadStoreInstrs(MachineBasicBlock *MBB) {
|
|||||||
if (llvm::getInstrPredicate(MI, PredReg) != ARMCC::AL)
|
if (llvm::getInstrPredicate(MI, PredReg) != ARMCC::AL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int Opcode = MI->getOpcode();
|
int Opc = MI->getOpcode();
|
||||||
bool isLd = Opcode == ARM::LDR ||
|
bool isLd = isi32Load(Opc) || Opc == ARM::FLDS || Opc == ARM::FLDD;
|
||||||
Opcode == ARM::FLDS || Opcode == ARM::FLDD;
|
|
||||||
unsigned Base = MI->getOperand(1).getReg();
|
unsigned Base = MI->getOperand(1).getReg();
|
||||||
int Offset = getMemoryOpOffset(MI);
|
int Offset = getMemoryOpOffset(MI);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user