summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp')
-rw-r--r--llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp69
1 files changed, 34 insertions, 35 deletions
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index e98d99fe1d7..2e80dca4540 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -189,18 +189,20 @@ public:
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
@@ -210,7 +212,7 @@ public:
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);
@@ -225,7 +227,7 @@ public:
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;
@@ -275,7 +277,7 @@ public:
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);
@@ -287,7 +289,8 @@ public:
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);
}
@@ -297,7 +300,8 @@ public:
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;
@@ -309,7 +313,7 @@ public:
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;
}
@@ -318,7 +322,7 @@ public:
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;
}
@@ -328,7 +332,7 @@ public:
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;
}
@@ -338,7 +342,7 @@ public:
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;
}
@@ -348,7 +352,7 @@ public:
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;
@@ -359,7 +363,7 @@ public:
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;
}
@@ -369,7 +373,7 @@ public:
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;
}
@@ -379,7 +383,7 @@ public:
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;
}
@@ -391,7 +395,7 @@ public:
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;
}
@@ -401,7 +405,7 @@ public:
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;
}
@@ -412,7 +416,7 @@ public:
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
@@ -429,7 +433,7 @@ public:
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;
}
@@ -440,7 +444,7 @@ public:
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;
}
@@ -451,7 +455,7 @@ public:
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;
@@ -467,7 +471,7 @@ public:
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;
@@ -549,13 +553,8 @@ public:
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));
OpenPOWER on IntegriCloud