From 96ed75d066bf1ff27816c4898effb3eb6786dddf Mon Sep 17 00:00:00 2001 From: Alex Bradbury Date: Thu, 20 Sep 2018 11:40:43 +0000 Subject: [PATCH] [RISCV][MC] Modify evaluateConstantImm interface to allow reuse from addExpr This is a trivial refactoring that I'm committing now as it makes a patch I'm about to post for review easier to follow. There is some overlap between evaluateConstantImm and addExpr in RISCVAsmParser. This patch allows evaluateConstantImm to be reused from addExpr to remove this overlap. The benefit will be greater when a future patch adds extra code to allows immediates to be evaluated from constant symbols (e.g. `.equ CONST, 0x1234`). No functional change intended. llvm-svn: 342641 --- llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 69 +++++++++++----------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index e98d99f..2e80dca 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(Val)) { - Ret = RE->evaluateAsConstant(Imm); + static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm, + RISCVMCExpr::VariantKind &VK) { + if (auto *RE = dyn_cast(Expr)) { VK = RE->getKind(); - } else if (auto CE = dyn_cast(Val)) { - Ret = true; + return RE->evaluateAsConstant(Imm); + } + + if (auto CE = dyn_cast(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(Expr)) { - IsConstant = RE->evaluateAsConstant(Imm); - } else if (auto *CE = dyn_cast(Expr)) { - IsConstant = true; - Imm = CE->getValue(); - } + RISCVMCExpr::VariantKind VK; + bool IsConstant = evaluateConstantImm(Expr, Imm, VK); if (IsConstant) Inst.addOperand(MCOperand::createImm(Imm)); -- 2.7.4