diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/AsmParser')
| -rw-r--r-- | llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 69 |
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)); |

