Index: src/IceInstARM32.cpp |
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
index 9e6a4809a93b92b13eeaa11bbdb18d50f0897cb5..376a2cfc643160c1d4f23d0217b911643886f975 100644 |
--- a/src/IceInstARM32.cpp |
+++ b/src/IceInstARM32.cpp |
@@ -700,15 +700,14 @@ void InstARM32Mov::emitSingleDestSingleSource(const Cfg *Func) const { |
Variable *Dest = getDest(); |
if (Dest->hasReg()) { |
- Type DestTy = Dest->getType(); |
+ Type Ty = Dest->getType(); |
Operand *Src0 = getSrc(0); |
- const bool DestIsVector = isVectorType(DestTy); |
- const bool DestIsScalarFP = isScalarFloatingType(Dest->getType()); |
+ const bool IsVector = isVectorType(Ty); |
+ const bool IsScalarFP = isScalarFloatingType(Ty); |
const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0); |
- const char *LoadOpcode = |
- DestIsVector ? "vld1" : (DestIsScalarFP ? "vldr" : "ldr"); |
- const char *RegMovOpcode = |
- (DestIsVector || DestIsScalarFP || CoreVFPMove) ? "vmov" : "mov"; |
+ const char *LoadOpcode = IsVector ? "vld1" : (IsScalarFP ? "vldr" : "ldr"); |
+ const bool IsVMove = (IsVector || IsScalarFP || CoreVFPMove); |
+ const char *RegMovOpcode = IsVMove ? "vmov" : "mov"; |
const char *ActualOpcode = isMemoryAccess(Src0) ? LoadOpcode : RegMovOpcode; |
// when vmov{c}'ing, we need to emit a width string. Otherwise, the |
// assembler might be tempted to assume we want a vector vmov{c}, and that |
@@ -716,24 +715,36 @@ void InstARM32Mov::emitSingleDestSingleSource(const Cfg *Func) const { |
const char *NoWidthString = ""; |
const char *WidthString = |
isMemoryAccess(Src0) |
- ? (DestIsVector ? ".64" : NoWidthString) |
- : (!CoreVFPMove ? getVecWidthString(DestTy) : NoWidthString); |
- |
- Str << "\t" << ActualOpcode << getPredicate() << WidthString << "\t"; |
+ ? (IsVector ? ".64" : getWidthString(Ty)) |
+ : (!CoreVFPMove ? getVecWidthString(Ty) : NoWidthString); |
+ Str << "\t" << ActualOpcode; |
+ const bool IsVInst = IsVMove || IsVector || IsScalarFP; |
+ if (IsVInst) { |
+ Str << getPredicate() << WidthString; |
+ } else { |
+ Str << WidthString << getPredicate(); |
+ } |
+ Str << "\t"; |
Dest->emit(Func); |
Str << ", "; |
Src0->emit(Func); |
} else { |
Variable *Src0 = llvm::cast<Variable>(getSrc(0)); |
assert(Src0->hasReg()); |
+ Type Ty = Src0->getType(); |
+ const bool IsVector = isVectorType(Ty); |
+ const bool IsScalarFP = isScalarFloatingType(Ty); |
const char *ActualOpcode = |
- isVectorType(Src0->getType()) |
- ? "vst1" |
- : (isScalarFloatingType(Src0->getType()) ? "vstr" : "str"); |
- const char *NoWidthString = ""; |
- const char *WidthString = |
- isVectorType(Src0->getType()) ? ".64" : NoWidthString; |
- Str << "\t" << ActualOpcode << getPredicate() << WidthString << "\t"; |
+ IsVector ? "vst1" : (IsScalarFP ? "vstr" : "str"); |
+ const char *WidthString = IsVector ? ".64" : getWidthString(Ty); |
+ Str << "\t" << ActualOpcode; |
+ const bool IsVInst = IsVector || IsScalarFP; |
+ if (IsVInst) { |
+ Str << getPredicate() << WidthString; |
+ } else { |
+ Str << WidthString << getPredicate(); |
+ } |
+ Str << "\t"; |
Src0->emit(Func); |
Str << ", "; |
Dest->emit(Func); |
@@ -955,15 +966,21 @@ template <> void InstARM32Ldr::emit(const Cfg *Func) const { |
assert(getSrcSize() == 1); |
assert(getDest()->hasReg()); |
Variable *Dest = getDest(); |
- Type DestTy = Dest->getType(); |
- const bool DestIsVector = isVectorType(DestTy); |
- const bool DestIsScalarFloat = isScalarFloatingType(DestTy); |
+ Type Ty = Dest->getType(); |
+ const bool IsVector = isVectorType(Ty); |
+ const bool IsScalarFloat = isScalarFloatingType(Ty); |
const char *ActualOpcode = |
- DestIsVector ? "vld1" : (DestIsScalarFloat ? "vldr" : "ldr"); |
- const char *VectorMarker = DestIsVector ? ".64" : ""; |
- const char *WidthString = DestIsVector ? "" : getWidthString(DestTy); |
- Str << "\t" << ActualOpcode << WidthString << getPredicate() << VectorMarker |
- << "\t"; |
+ IsVector ? "vld1" : (IsScalarFloat ? "vldr" : "ldr"); |
+ const char *VectorMarker = IsVector ? ".64" : ""; |
+ const char *WidthString = IsVector ? "" : getWidthString(Ty); |
+ Str << "\t" << ActualOpcode; |
+ const bool IsVInst = IsVector || IsScalarFloat; |
+ if (IsVInst) { |
+ Str << getPredicate() << WidthString; |
+ } else { |
+ Str << WidthString << getPredicate(); |
+ } |
+ Str << VectorMarker << "\t"; |
getDest()->emit(Func); |
Str << ", "; |
getSrc(0)->emit(Func); |
@@ -1270,11 +1287,18 @@ void InstARM32Str::emit(const Cfg *Func) const { |
assert(getSrcSize() == 2); |
Type Ty = getSrc(0)->getType(); |
const bool IsVectorStore = isVectorType(Ty); |
+ const bool IsScalarFloat = isScalarFloatingType(Ty); |
const char *Opcode = |
- IsVectorStore ? "vst1" : (isScalarFloatingType(Ty) ? "vstr" : "str"); |
+ IsVectorStore ? "vst1" : (IsScalarFloat ? "vstr" : "str"); |
const char *VecEltWidthString = IsVectorStore ? ".64" : ""; |
- Str << "\t" << Opcode << getWidthString(Ty) << getPredicate() |
- << VecEltWidthString << "\t"; |
+ Str << "\t" << Opcode; |
+ const bool IsVInst = IsVectorStore || IsScalarFloat; |
+ if (IsVInst) { |
+ Str << getPredicate() << getWidthString(Ty); |
+ } else { |
+ Str << getWidthString(Ty) << getPredicate(); |
+ } |
+ Str << VecEltWidthString << "\t"; |
getSrc(0)->emit(Func); |
Str << ", "; |
getSrc(1)->emit(Func); |