| Index: src/IceInstARM32.cpp
|
| diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp
|
| index b45d2f1ea28872708913803fb94d37e8f1a6f232..7e510ca600406c781e338f5310998597b29dde25 100644
|
| --- a/src/IceInstARM32.cpp
|
| +++ b/src/IceInstARM32.cpp
|
| @@ -592,6 +592,29 @@ void InstARM32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
|
| }
|
| }
|
|
|
| +void InstARM32Mov::emitIASSingleDestSingleSource(const Cfg *Func) const {
|
| + ARM32::AssemblerARM32 *Asm = Func->getAssembler<ARM32::AssemblerARM32>();
|
| + Variable *Dest = getDest();
|
| + Operand *Src0 = getSrc(0);
|
| + // Note: Loop is used so that we can short circuit using break.
|
| + do {
|
| + if (Dest->hasReg()) {
|
| + Type DestTy = Dest->getType();
|
| + const bool DestIsVector = isVectorType(DestTy);
|
| + const bool DestIsScalarFP = isScalarFloatingType(DestTy);
|
| + const bool CoreVFPMove = isMoveBetweenCoreAndVFPRegisters(Dest, Src0);
|
| + if (DestIsVector || DestIsScalarFP || CoreVFPMove)
|
| + break;
|
| + if (const auto *FlexImm = llvm::dyn_cast<OperandARM32FlexImm>(Src0)) {
|
| + Asm->mov(static_cast<RegARM32::GPRRegister>(Dest->getRegNum()),
|
| + *FlexImm, getPredicate());
|
| + return;
|
| + }
|
| + }
|
| + } while (0);
|
| + llvm_unreachable("not yet implemented");
|
| +}
|
| +
|
| void InstARM32Mov::emit(const Cfg *Func) const {
|
| if (!BuildDefs::dump())
|
| return;
|
| @@ -612,7 +635,13 @@ void InstARM32Mov::emit(const Cfg *Func) const {
|
| void InstARM32Mov::emitIAS(const Cfg *Func) const {
|
| assert(getSrcSize() == 1);
|
| (void)Func;
|
| - llvm_unreachable("Not yet implemented");
|
| + assert(!(isMultiDest() && isMultiSource()) && "Invalid vmov type.");
|
| + if (isMultiDest())
|
| + llvm_unreachable("Not yet implemented");
|
| + if (isMultiSource())
|
| + llvm_unreachable("Not yet implemented");
|
| + // Must be single source/dest.
|
| + emitIASSingleDestSingleSource(Func);
|
| }
|
|
|
| void InstARM32Mov::dump(const Cfg *Func) const {
|
|
|