summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/NEONMoveFix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/ARM/NEONMoveFix.cpp')
-rw-r--r--llvm/lib/Target/ARM/NEONMoveFix.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/NEONMoveFix.cpp b/llvm/lib/Target/ARM/NEONMoveFix.cpp
index 97e54bfaed9..e8393c53dd8 100644
--- a/llvm/lib/Target/ARM/NEONMoveFix.cpp
+++ b/llvm/lib/Target/ARM/NEONMoveFix.cpp
@@ -35,6 +35,7 @@ namespace {
private:
const TargetRegisterInfo *TRI;
const ARMBaseInstrInfo *TII;
+ bool isA8;
typedef DenseMap<unsigned, const MachineInstr*> RegMap;
@@ -43,6 +44,16 @@ namespace {
char NEONMoveFixPass::ID = 0;
}
+static bool inNEONDomain(unsigned Domain, bool isA8) {
+ if (Domain & ARMII::DomainNEON) {
+ // Some instructions only go down NEON pipeline when executed on CortexA8.
+ if (Domain & ARMII::DomainNEONA8)
+ return isA8;
+ return true;
+ }
+ return false;
+}
+
bool NEONMoveFixPass::InsertMoves(MachineBasicBlock &MBB) {
RegMap Defs;
bool Modified = false;
@@ -70,7 +81,7 @@ bool NEONMoveFixPass::InsertMoves(MachineBasicBlock &MBB) {
Domain = ARMII::DomainNEON;
}
- if (Domain & ARMII::DomainNEON) {
+ if (inNEONDomain(Domain, isA8)) {
// Convert VMOVD to VMOVDneon
unsigned DestReg = MI->getOperand(0).getReg();
@@ -123,6 +134,7 @@ bool NEONMoveFixPass::runOnMachineFunction(MachineFunction &Fn) {
TRI = TM.getRegisterInfo();
TII = static_cast<const ARMBaseInstrInfo*>(TM.getInstrInfo());
+ isA8 = TM.getSubtarget<ARMSubtarget>().isCortexA8();
bool Modified = false;
for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
OpenPOWER on IntegriCloud