Index: src/IceInstARM32.cpp |
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp |
index 99584dc010349319244437752d2b19b0ba99b2e3..6cea487c4c8a55dd81827ef5fac598829ccb3d90 100644 |
--- a/src/IceInstARM32.cpp |
+++ b/src/IceInstARM32.cpp |
@@ -380,6 +380,28 @@ InstARM32Vcvt::InstARM32Vcvt(Cfg *Func, Variable *Dest, Variable *Src, |
addSource(Src); |
} |
+InstARM32Mov::InstARM32Mov(Cfg *Func, Variable *Dest, Operand *Src, |
+ CondARM32::Cond Predicate) |
+ : InstARM32Pred(Func, InstARM32::Mov, 2, Dest, Predicate) { |
+ auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest); |
+ auto *Src64 = llvm::dyn_cast<Variable64On32>(Src); |
+ |
+ assert(Dest64 == nullptr || Src64 == nullptr); |
+ |
+ if (Dest64 != nullptr) { |
+ // this-> is needed below because there is a parameter named Dest. |
+ this->Dest = Dest64->getLo(); |
+ DestHi = Dest64->getHi(); |
+ } |
+ |
+ if (Src64 == nullptr) { |
+ addSource(Src); |
+ } else { |
+ addSource(Src64->getLo()); |
+ addSource(Src64->getHi()); |
+ } |
+} |
+ |
InstARM32Vcmp::InstARM32Vcmp(Cfg *Func, Variable *Src0, Variable *Src1, |
CondARM32::Cond Predicate) |
: InstARM32Pred(Func, InstARM32::Vcmp, 2, nullptr, Predicate) { |
@@ -451,19 +473,19 @@ void InstARM32Mov::emitMultiDestSingleSource(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
- auto *Dest = llvm::cast<Variable64On32>(getDest()); |
- Operand *Src = getSrc(0); |
+ Variable *DestLo = getDest(); |
+ Variable *DestHi = getDestHi(); |
+ auto *Src = llvm::cast<Variable>(getSrc(0)); |
- assert(Dest->getType() == IceType_i64); |
- assert(Dest->getHi()->hasReg()); |
- assert(Dest->getLo()->hasReg()); |
- assert(!llvm::isa<OperandARM32Mem>(Src)); |
+ assert(DestHi->hasReg()); |
+ assert(DestLo->hasReg()); |
+ assert(llvm::isa<Variable>(Src) && Src->hasReg()); |
Str << "\t" |
<< "vmov" << getPredicate() << "\t"; |
- Dest->getLo()->emit(Func); |
+ DestLo->emit(Func); |
Str << ", "; |
- Dest->getHi()->emit(Func); |
+ DestHi->emit(Func); |
Str << ", "; |
Src->emit(Func); |
} |
@@ -473,20 +495,20 @@ void InstARM32Mov::emitSingleDestMultiSource(const Cfg *Func) const { |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
Variable *Dest = getDest(); |
- auto *Src = llvm::cast<Variable64On32>(getSrc(0)); |
+ Variable *SrcLo = llvm::cast<Variable>(getSrc(0)); |
+ Variable *SrcHi = llvm::cast<Variable>(getSrc(1)); |
- assert(Src->getType() == IceType_i64); |
- assert(Src->getHi()->hasReg()); |
- assert(Src->getLo()->hasReg()); |
+ assert(SrcHi->hasReg()); |
+ assert(SrcLo->hasReg()); |
assert(Dest->hasReg()); |
Str << "\t" |
<< "vmov" << getPredicate() << "\t"; |
Dest->emit(Func); |
Str << ", "; |
- Src->getLo()->emit(Func); |
+ SrcLo->emit(Func); |
Str << ", "; |
- Src->getHi()->emit(Func); |
+ SrcHi->emit(Func); |
} |
namespace { |
@@ -583,28 +605,20 @@ void InstARM32Mov::emitIAS(const Cfg *Func) const { |
void InstARM32Mov::dump(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
- assert(getSrcSize() == 1); |
+ assert(getSrcSize() == 1 || getSrcSize() == 2); |
Ostream &Str = Func->getContext()->getStrDump(); |
Variable *Dest = getDest(); |
- if (auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest)) { |
- Dest64->getLo()->dump(Func); |
+ Variable *DestHi = getDestHi(); |
+ Dest->dump(Func); |
+ if (DestHi) { |
Str << ", "; |
- Dest64->getHi()->dump(Func); |
- } else { |
- Dest->dump(Func); |
+ DestHi->dump(Func); |
} |
dumpOpcodePred(Str, " = mov", getDest()->getType()); |
Str << " "; |
- Operand *Src = getSrc(0); |
- if (auto *Src64 = llvm::dyn_cast<Variable64On32>(Src)) { |
- Src64->getLo()->dump(Func); |
- Str << ", "; |
- Src64->getHi()->dump(Func); |
- } else { |
- Src->dump(Func); |
- } |
+ dumpSources(Func); |
} |
void InstARM32Br::emit(const Cfg *Func) const { |