Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Unified Diff: src/IceInstARM32.cpp

Issue 1415953007: Fixes LDR and STR instructions. Two types of mistakes were being made. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceAssemblerARM32.cpp ('k') | src/IceTargetLoweringARM32.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « src/IceAssemblerARM32.cpp ('k') | src/IceTargetLoweringARM32.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698