diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_insn.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_insn.h index 6b6b0b5a4d34435d21d02f25112c7b2fa8c4f751..2b44aeb30e03fdd1f3a7e1f2ddba0174b4810ca1 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_insn.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_insn.h @@ -222,6 +222,21 @@ class AArch64VectorInsn : public AArch64Insn { return ret; } + int GetNumOfRegSpec() const { + if (IsVectorOp() && !regSpecList.empty()) { + return regSpecList.size(); + } + return 0; + } + + MapleVector &GetRegSpecList() { + return regSpecList; + } + + void SetRegSpecList(MapleVector &vec) { + regSpecList = vec; + } + void PushRegSpecEntry(VectorRegSpec *v) { regSpecList.emplace(regSpecList.begin(), v); /* add at front */ } diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_insn.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_insn.cpp index af84671c3c42a1503d9c50770492436943b8c0a8..ce95a257ebc3dbce95f5f6a8b7d28b64c98c3a57 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_insn.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_insn.cpp @@ -1830,6 +1830,13 @@ void AArch64Insn::Dump() const { opnd.Dump(); LogInfo::MapleLogger() << ")"; } + + if (IsVectorOp()) { + const AArch64VectorInsn *vInsn = static_cast(this); + if (vInsn->GetNumOfRegSpec() != 0) { + LogInfo::MapleLogger() << " (vecSpec: " << vInsn->GetNumOfRegSpec() << ")"; + } + } LogInfo::MapleLogger() << "\n"; } diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_optimize_common.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_optimize_common.cpp index b219063de0256cfb38ff35f4d9e1c3bfc89b921e..7ae00b38be1a91a34dc3e9154730c798086f9ab3 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_optimize_common.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_optimize_common.cpp @@ -57,7 +57,13 @@ void AArch64InsnVisitor::ModifyJumpTarget(BB &newTarget, BB &bb) { Insn *AArch64InsnVisitor::CloneInsn(Insn &originalInsn) { MemPool *memPool = const_cast(CG::GetCurCGFunc()->GetMemoryPool()); if (originalInsn.IsTargetInsn()) { - return memPool->Clone(*static_cast(&originalInsn)); + if (!originalInsn.IsVectorOp()) { + return memPool->Clone(*static_cast(&originalInsn)); + } else { + AArch64VectorInsn *insn = memPool->Clone(*static_cast(&originalInsn)); + insn->SetRegSpecList(static_cast(originalInsn).GetRegSpecList()); + return insn; + } } else if (originalInsn.IsCfiInsn()) { return memPool->Clone(*static_cast(&originalInsn)); } else if (originalInsn.IsDbgInsn()) {