Index: src/IceInstARM32.cpp |
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
index c4d9ebc10a72bb751f177c6bde3775d9d943f48b..d84c6882088cbaf8adb9f74d72e16daa223562e4 100644 |
--- a/src/IceInstARM32.cpp |
+++ b/src/IceInstARM32.cpp |
@@ -623,7 +623,22 @@ void InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const { |
const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0); |
if (DestIsVector || DestIsScalarFP || CoreVFPMove) |
break; |
- Asm->mov(Dest, Src0, getPredicate()); |
+ if (isMemoryAccess(Src0)) { |
+ // TODO(kschimpf) Figure out how to do ldr on CoreVPFMove? (see |
+ // emitSingleDestSingleSource, local variable LoadOpcode). |
+ Asm->ldr(Dest, Src0, getPredicate()); |
+ } else { |
+ Asm->mov(Dest, Src0, getPredicate()); |
+ } |
+ return; |
+ } else { |
+ Type Src0Type = Src0->getType(); |
+ const bool Src0IsVector = isVectorType(Src0Type); |
+ const bool Src0IsScalarFP = isScalarFloatingType(Src0Type); |
+ const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0); |
+ if (Src0IsVector || Src0IsScalarFP || CoreVFPMove) |
+ break; |
+ Asm->str(Src0, Dest, getPredicate()); |
return; |
} |
} while (0); |