diff --git a/src/asmjit/arm/a64rapass.cpp b/src/asmjit/arm/a64rapass.cpp index ad78369..597ae5c 100644 --- a/src/asmjit/arm/a64rapass.cpp +++ b/src/asmjit/arm/a64rapass.cpp @@ -102,7 +102,7 @@ public: // TODO: [ARM] This is just a workaround... static InstControlFlow getControlFlowType(InstId instId) noexcept { - switch (instId) { + switch (BaseInst::extractRealId(instId)) { case Inst::kIdB: case Inst::kIdBr: if (BaseInst::extractARMCondCode(instId) == CondCode::kAL) @@ -127,8 +127,8 @@ static InstControlFlow getControlFlowType(InstId instId) noexcept { Error RACFGBuilder::onInst(InstNode* inst, InstControlFlow& controlType, RAInstBuilder& ib) noexcept { InstRWInfo rwInfo; - InstId instId = inst->id(); - if (Inst::isDefinedId(instId)) { + if (Inst::isDefinedId(inst->realId())) { + InstId instId = inst->id(); uint32_t opCount = inst->opCount(); const Operand* opArray = inst->operands(); ASMJIT_PROPAGATE(InstInternal::queryRWInfo(_arch, inst->baseInst(), opArray, opCount, &rwInfo)); diff --git a/src/asmjit/core/inst.h b/src/asmjit/core/inst.h index 2310631..919fe92 100644 --- a/src/asmjit/core/inst.h +++ b/src/asmjit/core/inst.h @@ -312,6 +312,10 @@ public: return id | (uint32_t(cc) << Support::ConstCTZ::value); } + static inline constexpr InstId extractRealId(uint32_t id) noexcept { + return id & uint32_t(InstIdParts::kRealId); + } + static inline constexpr arm::CondCode extractARMCondCode(uint32_t id) noexcept { return (arm::CondCode)((uint32_t(id) & uint32_t(InstIdParts::kARM_Cond)) >> Support::ConstCTZ::value); }