| Index: src/IceInstARM32.cpp
|
| diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp
|
| index 4c4a01d09ab06fbda5a4114a9936bbb5ea249662..401b381e45c41f3e618aadb275bdd2187e464b9f 100644
|
| --- a/src/IceInstARM32.cpp
|
| +++ b/src/IceInstARM32.cpp
|
| @@ -765,7 +765,7 @@ void InstARM32Mov::emitSingleDestMultiSource(const Cfg *Func) const {
|
| namespace {
|
|
|
| bool isVariableWithoutRegister(const Operand *Op) {
|
| - if (const auto *OpV = llvm::dyn_cast<const Variable>(Op)) {
|
| + if (const auto *OpV = llvm::dyn_cast<Variable>(Op)) {
|
| return !OpV->hasReg();
|
| }
|
| return false;
|
| @@ -789,84 +789,57 @@ void InstARM32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| Variable *Dest = getDest();
|
|
|
| - if (Dest->hasReg()) {
|
| - Type Ty = Dest->getType();
|
| - Operand *Src0 = getSrc(0);
|
| - const bool IsVector = isVectorType(Ty);
|
| - const bool IsScalarFP = isScalarFloatingType(Ty);
|
| - const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
|
| - 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
|
| - // is disallowed because ARM.
|
| - const char *NoWidthString = "";
|
| - const char *WidthString =
|
| - isMemoryAccess(Src0)
|
| - ? (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);
|
| + if (!Dest->hasReg()) {
|
| + llvm::report_fatal_error("mov can't store.");
|
| + }
|
| +
|
| + Operand *Src0 = getSrc(0);
|
| + if (isMemoryAccess(Src0)) {
|
| + llvm::report_fatal_error("mov can't load.");
|
| + }
|
| +
|
| + Type Ty = Dest->getType();
|
| + const bool IsVector = isVectorType(Ty);
|
| + const bool IsScalarFP = isScalarFloatingType(Ty);
|
| + const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
|
| + const bool IsVMove = (IsVector || IsScalarFP || CoreVFPMove);
|
| + const char *Opcode = IsVMove ? "vmov" : "mov";
|
| + // 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
|
| + // is disallowed because ARM.
|
| + const char *WidthString = !CoreVFPMove ? getVecWidthString(Ty) : "";
|
| + Str << "\t" << Opcode;
|
| + if (IsVMove) {
|
| + Str << getPredicate() << WidthString;
|
| } 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 =
|
| - 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);
|
| + Str << WidthString << getPredicate();
|
| }
|
| + Str << "\t";
|
| + Dest->emit(Func);
|
| + Str << ", ";
|
| + Src0->emit(Func);
|
| }
|
|
|
| void InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const {
|
| auto *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
|
| Variable *Dest = getDest();
|
| Operand *Src0 = getSrc(0);
|
| - if (Dest->hasReg()) {
|
| - const Type DestTy = Dest->getType();
|
| - const bool DestIsVector = isVectorType(DestTy);
|
| - const bool DestIsScalarFP = isScalarFloatingType(DestTy);
|
| - const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
|
| - if (DestIsVector || DestIsScalarFP || CoreVFPMove)
|
| - return Asm->setNeedsTextFixup();
|
| - if (isMemoryAccess(Src0)) {
|
| - // TODO(kschimpf) Figure out how to do ldr on CoreVPFMove? (see
|
| - // emitSingleDestSingleSource, local variable LoadOpcode).
|
| - return Asm->ldr(Dest, Src0, getPredicate(), Func->getTarget());
|
| - }
|
| - return Asm->mov(Dest, Src0, getPredicate());
|
| - } else {
|
| - const Type Src0Type = Src0->getType();
|
| - const bool Src0IsVector = isVectorType(Src0Type);
|
| - const bool Src0IsScalarFP = isScalarFloatingType(Src0Type);
|
| - const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
|
| - if (Src0IsVector || Src0IsScalarFP || CoreVFPMove)
|
| - return Asm->setNeedsTextFixup();
|
| - return Asm->str(Src0, Dest, getPredicate(), Func->getTarget());
|
| +
|
| + if (!Dest->hasReg()) {
|
| + llvm::report_fatal_error("mov can't store.");
|
| + }
|
| +
|
| + if (isMemoryAccess(Src0)) {
|
| + llvm::report_fatal_error("mov can't load.");
|
| }
|
| +
|
| + const Type DestTy = Dest->getType();
|
| + const bool DestIsVector = isVectorType(DestTy);
|
| + const bool DestIsScalarFP = isScalarFloatingType(DestTy);
|
| + const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
|
| + if (DestIsVector || DestIsScalarFP || CoreVFPMove)
|
| + return Asm->setNeedsTextFixup();
|
| + return Asm->mov(Dest, Src0, getPredicate());
|
| }
|
|
|
| void InstARM32Mov::emit(const Cfg *Func) const {
|
|
|