bool isImm() const override { return Kind == Immediate; }
bool isMem() const override { return false; }
- bool evaluateConstantImm(int64_t &Imm, RISCVMCExpr::VariantKind &VK) const {
- const MCExpr *Val = getImm();
- bool Ret = false;
- if (auto *RE = dyn_cast<RISCVMCExpr>(Val)) {
- Ret = RE->evaluateAsConstant(Imm);
+ static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm,
+ RISCVMCExpr::VariantKind &VK) {
+ if (auto *RE = dyn_cast<RISCVMCExpr>(Expr)) {
VK = RE->getKind();
- } else if (auto CE = dyn_cast<MCConstantExpr>(Val)) {
- Ret = true;
+ return RE->evaluateAsConstant(Imm);
+ }
+
+ if (auto CE = dyn_cast<MCConstantExpr>(Expr)) {
VK = RISCVMCExpr::VK_RISCV_None;
Imm = CE->getValue();
+ return true;
}
- return Ret;
+
+ return false;
}
// True if operand is a symbol with no modifiers, or a constant with no
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
bool IsValid;
if (!IsConstantImm)
IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm);
int64_t Imm;
RISCVMCExpr::VariantKind VK;
// Must be of 'immediate' type but not a constant.
- if (!isImm() || evaluateConstantImm(Imm, VK))
+ if (!isImm() || evaluateConstantImm(getImm(), Imm, VK))
return false;
return RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
// Given only Imm, ensuring that the actually specified constant is either
// a signed or unsigned 64-bit number is unfortunately impossible.
bool IsInRange = isRV64() ? true : isInt<32>(Imm) || isUInt<32>(Imm);
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- if (!evaluateConstantImm(Imm, VK) || VK != RISCVMCExpr::VK_RISCV_None)
+ if (!evaluateConstantImm(getImm(), Imm, VK) ||
+ VK != RISCVMCExpr::VK_RISCV_None)
return false;
return (isRV64() && isUInt<6>(Imm)) || isUInt<5>(Imm);
}
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- if (!evaluateConstantImm(Imm, VK) || VK != RISCVMCExpr::VK_RISCV_None)
+ if (!evaluateConstantImm(getImm(), Imm, VK) ||
+ VK != RISCVMCExpr::VK_RISCV_None)
return false;
if (Imm == 0)
return false;
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isUInt<5>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
}
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isUInt<5>(Imm) && (Imm != 0) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
RISCVMCExpr::VariantKind VK;
int64_t Imm;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isInt<6>(Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
RISCVMCExpr::VariantKind VK;
int64_t Imm;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isInt<6>(Imm) && (Imm != 0) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && (Imm != 0) &&
(isUInt<5>(Imm) || (Imm >= 0xfffe0 && Imm <= 0xfffff)) &&
VK == RISCVMCExpr::VK_RISCV_None;
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isShiftedUInt<5, 2>(Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isShiftedUInt<6, 2>(Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isShiftedUInt<5, 3>(Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isShiftedUInt<6, 3>(Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isShiftedUInt<8, 2>(Imm) && (Imm != 0) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
bool IsValid;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
if (!IsConstantImm)
IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm);
else
RISCVMCExpr::VariantKind VK;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isUInt<12>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
}
return false;
int64_t Imm;
RISCVMCExpr::VariantKind VK;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && (Imm != 0) && isShiftedInt<6, 4>(Imm) &&
VK == RISCVMCExpr::VK_RISCV_None;
}
bool IsValid;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
if (!IsConstantImm) {
IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm);
return IsValid && VK == RISCVMCExpr::VK_RISCV_HI;
bool IsValid;
if (!isImm())
return false;
- bool IsConstantImm = evaluateConstantImm(Imm, VK);
+ bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
if (!IsConstantImm) {
IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm);
return IsValid && VK == RISCVMCExpr::VK_RISCV_PCREL_HI;
void addExpr(MCInst &Inst, const MCExpr *Expr) const {
assert(Expr && "Expr shouldn't be null!");
int64_t Imm = 0;
- bool IsConstant = false;
- if (auto *RE = dyn_cast<RISCVMCExpr>(Expr)) {
- IsConstant = RE->evaluateAsConstant(Imm);
- } else if (auto *CE = dyn_cast<MCConstantExpr>(Expr)) {
- IsConstant = true;
- Imm = CE->getValue();
- }
+ RISCVMCExpr::VariantKind VK;
+ bool IsConstant = evaluateConstantImm(Expr, Imm, VK);
if (IsConstant)
Inst.addOperand(MCOperand::createImm(Imm));