From 028d669a74d0ddf5baaa9a02647da876643c39be Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 27 Mar 2025 23:30:49 -0700 Subject: [PATCH 1/3] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?= =?UTF-8?q?itial=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.5-bogner --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 247 ++++++------------ .../Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp | 1 + llvm/test/MC/RISCV/insn.s | 8 +- llvm/test/MC/RISCV/rv32i-aliases-valid.s | 5 +- llvm/test/MC/RISCV/rvd-valid.s | 8 +- llvm/test/MC/RISCV/rvf-valid.s | 4 +- llvm/test/MC/RISCV/rvi-valid.s | 28 +- llvm/test/MC/RISCV/rvzfh-valid.s | 5 +- 8 files changed, 120 insertions(+), 186 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 3c225fb38cb19..a6882fb86ecc7 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -524,15 +524,8 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool isGPRAsFPR32() const { return isGPRF32() && Reg.IsGPRAsFPR; } bool isGPRPairAsFPR64() const { return isGPRPair() && Reg.IsGPRAsFPR; } - static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm, - RISCVMCExpr::Specifier &VK) { - if (auto *RE = dyn_cast(Expr)) { - VK = RE->getSpecifier(); - return RE->evaluateAsConstant(Imm); - } - + static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm) { if (auto CE = dyn_cast(Expr)) { - VK = RISCVMCExpr::VK_None; Imm = CE->getValue(); return true; } @@ -547,7 +540,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); bool IsValid; if (!IsConstantImm) IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); @@ -562,7 +555,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { int64_t Imm; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; // Must be of 'immediate' type but not a constant. - if (!isImm() || evaluateConstantImm(getImm(), Imm, VK)) + if (!isImm() || evaluateConstantImm(getImm(), Imm)) return false; return RISCVAsmParser::classifySymbolRef(getImm(), VK) && VK == RISCVMCExpr::VK_None; @@ -572,7 +565,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { int64_t Imm; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; // Must be of 'immediate' type but not a constant. - if (!isImm() || evaluateConstantImm(getImm(), Imm, VK)) + if (!isImm() || evaluateConstantImm(getImm(), Imm)) return false; return RISCVAsmParser::classifySymbolRef(getImm(), VK) && (VK == RISCVMCExpr::VK_CALL || VK == RISCVMCExpr::VK_CALL_PLT); @@ -582,7 +575,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { int64_t Imm; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; // Must be of 'immediate' type but not a constant. - if (!isImm() || evaluateConstantImm(getImm(), Imm, VK)) + if (!isImm() || evaluateConstantImm(getImm(), Imm)) return false; return RISCVAsmParser::classifySymbolRef(getImm(), VK) && VK == RISCVMCExpr::VK_CALL; @@ -592,7 +585,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { int64_t Imm; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; // Must be of 'immediate' type but not a constant. - if (!isImm() || evaluateConstantImm(getImm(), Imm, VK)) + if (!isImm() || evaluateConstantImm(getImm(), Imm)) return false; return RISCVAsmParser::classifySymbolRef(getImm(), VK) && VK == RISCVMCExpr::VK_TPREL_ADD; @@ -602,7 +595,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { int64_t Imm; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; // Must be of 'immediate' type but not a constant. - if (!isImm() || evaluateConstantImm(getImm(), Imm, VK)) + if (!isImm() || evaluateConstantImm(getImm(), Imm)) return false; return RISCVAsmParser::classifySymbolRef(getImm(), VK) && VK == RISCVMCExpr::VK_TLSDESC_CALL; @@ -612,11 +605,10 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool isVTypeImm(unsigned N) const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isUIntN(N, Imm) && VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isUIntN(N, Imm); } // If the last operand of the vsetvli/vsetvli instruction is a constant @@ -659,7 +651,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); if (VK == RISCVMCExpr::VK_LO || VK == RISCVMCExpr::VK_PCREL_LO || VK == RISCVMCExpr::VK_TLSDESC_LOAD_LO || VK == RISCVMCExpr::VK_TLSDESC_ADD_LO) @@ -676,12 +668,11 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool isImmXLenLI_Restricted() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); // 'la imm' supports constant immediates only. - return IsConstantImm && (VK == RISCVMCExpr::VK_None) && + return IsConstantImm && (isRV64Imm() || (isInt<32>(Imm) || isUInt<32>(Imm))); } @@ -690,7 +681,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - if (!evaluateConstantImm(getImm(), Imm, VK) || VK != RISCVMCExpr::VK_None) + if (!evaluateConstantImm(getImm(), Imm) || VK != RISCVMCExpr::VK_None) return false; return (isRV64Imm() && isUInt<6>(Imm)) || isUInt<5>(Imm); } @@ -700,7 +691,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - if (!evaluateConstantImm(getImm(), Imm, VK) || VK != RISCVMCExpr::VK_None) + if (!evaluateConstantImm(getImm(), Imm) || VK != RISCVMCExpr::VK_None) return false; if (Imm == 0) return false; @@ -712,18 +703,17 @@ struct RISCVOperand final : public MCParsedAsmOperand { RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - if (!evaluateConstantImm(getImm(), Imm, VK) || VK != RISCVMCExpr::VK_None) + if (!evaluateConstantImm(getImm(), Imm) || VK != RISCVMCExpr::VK_None) return false; return (isRV64Imm() && isUInt<5>(Imm)) || isUInt<4>(Imm); } template bool IsUImm() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isUInt(Imm) && VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isUInt(Imm); } bool isUImm1() const { return IsUImm<1>(); } @@ -746,144 +736,116 @@ struct RISCVOperand final : public MCParsedAsmOperand { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isUInt<5>(Imm) && (Imm != 0) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isUInt<5>(Imm) && (Imm != 0); } bool isUImm5GT3() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isUInt<5>(Imm) && (Imm > 3) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isUInt<5>(Imm) && (Imm > 3); } bool isUImm5Plus1() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && ((isUInt<5>(Imm) && (Imm != 0)) || (Imm == 32)) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && ((isUInt<5>(Imm) && (Imm != 0)) || (Imm == 32)); } bool isUImm5GE6Plus1() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && ((isUInt<5>(Imm) && (Imm >= 6)) || (Imm == 32)) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && ((isUInt<5>(Imm) && (Imm >= 6)) || (Imm == 32)); } bool isUImm5Slist() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && ((Imm == 0) || (Imm == 1) || (Imm == 2) || (Imm == 4) || - (Imm == 8) || (Imm == 16) || (Imm == 15) || (Imm == 31)) && - VK == RISCVMCExpr::VK_None; + (Imm == 8) || (Imm == 16) || (Imm == 15) || (Imm == 31)); } bool isUImm8GE32() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isUInt<8>(Imm) && Imm >= 32 && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isUInt<8>(Imm) && Imm >= 32; } bool isRnumArg() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && Imm >= INT64_C(0) && Imm <= INT64_C(10) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && Imm >= INT64_C(0) && Imm <= INT64_C(10); } bool isRnumArg_0_7() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && Imm >= INT64_C(0) && Imm <= INT64_C(7) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && Imm >= INT64_C(0) && Imm <= INT64_C(7); } bool isRnumArg_1_10() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && Imm >= INT64_C(1) && Imm <= INT64_C(10) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && Imm >= INT64_C(1) && Imm <= INT64_C(10); } bool isRnumArg_2_14() const { int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && Imm >= INT64_C(2) && Imm <= INT64_C(14) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && Imm >= INT64_C(2) && Imm <= INT64_C(14); } bool isSImm5() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isInt<5>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isInt<5>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isSImm5NonZero() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && Imm != 0 && - isInt<5>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + isInt<5>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isSImm6() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isInt<6>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isInt<6>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isSImm6NonZero() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && Imm != 0 && - isInt<6>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + isInt<6>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isCLUIImm() const { @@ -891,7 +853,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { return false; int64_t Imm; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && (Imm != 0) && (isUInt<5>(Imm) || (Imm >= 0xfffe0 && Imm <= 0xfffff)) && VK == RISCVMCExpr::VK_None; @@ -901,70 +863,56 @@ struct RISCVOperand final : public MCParsedAsmOperand { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<1, 1>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<1, 1>(Imm); } bool isUImm5Lsb0() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<4, 1>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<4, 1>(Imm); } bool isUImm6Lsb0() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<5, 1>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<5, 1>(Imm); } bool isUImm7Lsb00() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<5, 2>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<5, 2>(Imm); } bool isUImm7Lsb000() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<4, 3>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<4, 3>(Imm); } bool isUImm8Lsb00() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<6, 2>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<6, 2>(Imm); } bool isUImm8Lsb000() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<5, 3>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<5, 3>(Imm); } bool isSImm9Lsb0() const { return isBareSimmNLsb0<9>(); } @@ -973,20 +921,16 @@ struct RISCVOperand final : public MCParsedAsmOperand { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<6, 3>(Imm) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<6, 3>(Imm); } bool isUImm10Lsb00NonZero() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isShiftedUInt<8, 2>(Imm) && (Imm != 0) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isShiftedUInt<8, 2>(Imm) && (Imm != 0); } // If this a RV32 and the immediate is a uimm32, sign extend it to 32 bits. @@ -1000,11 +944,9 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool isSImm11() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isInt<11>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isInt<11>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isSImm12() const { @@ -1013,7 +955,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool IsValid; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); if (!IsConstantImm) IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); else @@ -1031,12 +973,10 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool isSImm12Lsb00000() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && - isShiftedInt<7, 5>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + isShiftedInt<7, 5>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isSImm13Lsb0() const { return isBareSimmNLsb0<13>(); } @@ -1045,32 +985,26 @@ struct RISCVOperand final : public MCParsedAsmOperand { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && (Imm != 0) && - isShiftedInt<6, 4>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + isShiftedInt<6, 4>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isSImm16NonZero() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && Imm != 0 && - isInt<16>(fixImmediateForRV32(Imm, isRV64Imm())) && - VK == RISCVMCExpr::VK_None; + isInt<16>(fixImmediateForRV32(Imm, isRV64Imm())); } bool isUImm16NonZero() const { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && isUInt<16>(Imm) && (Imm != 0) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isUInt<16>(Imm) && (Imm != 0); } bool isUImm20LUI() const { @@ -1079,7 +1013,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool IsValid; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); if (!IsConstantImm) { IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); return IsValid && @@ -1097,7 +1031,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool IsValid; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); if (!IsConstantImm) { IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); return IsValid && @@ -1120,20 +1054,16 @@ struct RISCVOperand final : public MCParsedAsmOperand { if (!isImm()) return false; int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && (Imm == 0) && VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && Imm == 0; } bool isSImm5Plus1() const { if (!isImm()) return false; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); - return IsConstantImm && - isInt<5>(fixImmediateForRV32(Imm, isRV64Imm()) - 1) && - VK == RISCVMCExpr::VK_None; + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); + return IsConstantImm && isInt<5>(fixImmediateForRV32(Imm, isRV64Imm()) - 1); } bool isSImm20() const { @@ -1141,7 +1071,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { return false; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && (VK == RISCVMCExpr::VK_None) && isInt<20>(fixImmediateForRV32(Imm, isRV64Imm())); } @@ -1151,7 +1081,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { return false; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && (VK == RISCVMCExpr::VK_None) && isInt<26>(fixImmediateForRV32(Imm, isRV64Imm())); } @@ -1161,7 +1091,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && isInt<32>(fixImmediateForRV32(Imm, isRV64Imm())) && VK == RISCVMCExpr::VK_None; } @@ -1171,7 +1101,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { return false; RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; int64_t Imm; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK); + bool IsConstantImm = evaluateConstantImm(getImm(), Imm); return IsConstantImm && isShiftedInt<31, 1>(fixImmediateForRV32(Imm, isRV64Imm())) && VK == RISCVMCExpr::VK_None; @@ -1385,8 +1315,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { static void addExpr(MCInst &Inst, const MCExpr *Expr, bool IsRV64Imm) { assert(Expr && "Expr shouldn't be null!"); int64_t Imm = 0; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - bool IsConstant = evaluateConstantImm(Expr, Imm, VK); + bool IsConstant = evaluateConstantImm(Expr, Imm); if (IsConstant) Inst.addOperand( @@ -1435,9 +1364,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { assert(N == 1 && "Invalid number of operands!"); int64_t Imm = 0; if (Kind == KindTy::Immediate) { - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; - [[maybe_unused]] bool IsConstantImm = - evaluateConstantImm(getImm(), Imm, VK); + [[maybe_unused]] bool IsConstantImm = evaluateConstantImm(getImm(), Imm); assert(IsConstantImm && "Invalid VTypeI Operand!"); } else { Imm = getVType(); diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp index b73496beba7e0..060f2fca84dd1 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp @@ -169,6 +169,7 @@ bool RISCVMCExpr::evaluateAsConstant(int64_t &Res) const { MCValue Value; if (specifier != VK_LO && specifier != VK_HI) return false; + return false; if (!getSubExpr()->evaluateAsRelocatable(Value, nullptr)) return false; diff --git a/llvm/test/MC/RISCV/insn.s b/llvm/test/MC/RISCV/insn.s index b1ef2511b96c6..7edde9ef451f3 100644 --- a/llvm/test/MC/RISCV/insn.s +++ b/llvm/test/MC/RISCV/insn.s @@ -146,12 +146,12 @@ target: # CHECK-OBJ: fmadd.s fa0, fa1, fa2, fa3, rne .insn r4 MADD, 0, 0, fa0, fa1, fa2, fa3 -# CHECK-ASM: .insn i 3, 5, t1, -2048(t2) -# CHECK-ASM: encoding: [0x03,0xd3,0x03,0x80] +# CHECK-ASM: .insn i 3, 5, t1, %lo(2048)(t2) +# CHECK-ASM: encoding: [0x03,0xd3,0bAAAA0011,A] # CHECK-OBJ: lhu t1, -0x800(t2) .insn i 0x3, 0x5, x6, %lo(2048)(x7) -# CHECK-ASM: .insn i 3, 5, t1, -2048(t2) -# CHECK-ASM: encoding: [0x03,0xd3,0x03,0x80] +# CHECK-ASM: .insn i 3, 5, t1, %lo(2048)(t2) +# CHECK-ASM: encoding: [0x03,0xd3,0bAAAA0011,A] # CHECK-OBJ: lhu t1, -0x800(t2) .insn i LOAD, 0x5, x6, %lo(2048)(x7) diff --git a/llvm/test/MC/RISCV/rv32i-aliases-valid.s b/llvm/test/MC/RISCV/rv32i-aliases-valid.s index 20deda4ec5eaf..4ebbac4aab983 100644 --- a/llvm/test/MC/RISCV/rv32i-aliases-valid.s +++ b/llvm/test/MC/RISCV/rv32i-aliases-valid.s @@ -83,8 +83,9 @@ li x12, 0x80000000 # CHECK-ALIAS: li a2, -1 li x12, 0xFFFFFFFF -# CHECK-INST: addi a0, zero, 1110 -# CHECK-ALIAS: li a0, 1110 +# CHECK-ASM-NOALIAS: addi a0, zero, %lo(1193046) +# CHECK-OBJ-NOALIAS: addi a0, zero, 1110 +# CHECK-ASM: addi a0, zero, %lo(1193046) li a0, %lo(0x123456) # CHECK-OBJ-NOALIAS: addi a0, zero, 0 diff --git a/llvm/test/MC/RISCV/rvd-valid.s b/llvm/test/MC/RISCV/rvd-valid.s index 5135562352a0f..81abedd74c286 100644 --- a/llvm/test/MC/RISCV/rvd-valid.s +++ b/llvm/test/MC/RISCV/rvd-valid.s @@ -23,8 +23,8 @@ fld f1, +4(ra) # CHECK-ASM-AND-OBJ: fld ft2, -2048(a3) # CHECK-ASM: encoding: [0x07,0xb1,0x06,0x80] fld f2, -2048(x13) -# CHECK-ASM-AND-OBJ: fld ft3, -2048(s1) -# CHECK-ASM: encoding: [0x87,0xb1,0x04,0x80] +# CHECK-ASM: fld ft3, %lo(2048)(s1) # encoding: [0x87,0xb1,0bAAAA0100,A] +# CHECK-OBJ: fld ft3, -2048(s1) fld f3, %lo(2048)(s1) # CHECK-ASM-AND-OBJ: fld ft4, 2047(s2) # CHECK-ASM: encoding: [0x07,0x32,0xf9,0x7f] @@ -39,8 +39,8 @@ fsd f6, 2047(s4) # CHECK-ASM-AND-OBJ: fsd ft7, -2048(s5) # CHECK-ASM: encoding: [0x27,0xb0,0x7a,0x80] fsd f7, -2048(s5) -# CHECK-ASM-AND-OBJ: fsd fs0, -2048(s6) -# CHECK-ASM: encoding: [0x27,0x30,0x8b,0x80] +# CHECK-ASM: fsd fs0, %lo(2048)(s6) # encoding: [0x27'A',0x30'A',0x8b'A',A] +# CHECK-OBJ: fsd fs0, -2048(s6) fsd f8, %lo(2048)(s6) # CHECK-ASM-AND-OBJ: fsd fs1, 999(s7) # CHECK-ASM: encoding: [0xa7,0xb3,0x9b,0x3e] diff --git a/llvm/test/MC/RISCV/rvf-valid.s b/llvm/test/MC/RISCV/rvf-valid.s index 49b67a0e9db94..29969118ffd04 100644 --- a/llvm/test/MC/RISCV/rvf-valid.s +++ b/llvm/test/MC/RISCV/rvf-valid.s @@ -18,8 +18,8 @@ flw f1, +4(ra) # CHECK-ASM-AND-OBJ: flw ft2, -2048(a3) # CHECK-ASM: encoding: [0x07,0xa1,0x06,0x80] flw f2, -2048(x13) -# CHECK-ASM-AND-OBJ: flw ft3, -2048(s1) -# CHECK-ASM: encoding: [0x87,0xa1,0x04,0x80] +# CHECK-ASM: flw ft0, %lo(2048)(s6) # encoding: [0x27'A',0x20'A',0x8b'A',A] +# CHECK-OBJ: flw ft3, -2048(s1) flw f3, %lo(2048)(s1) # CHECK-ASM-AND-OBJ: flw ft4, 2047(s2) # CHECK-ASM: encoding: [0x07,0x22,0xf9,0x7f] diff --git a/llvm/test/MC/RISCV/rvi-valid.s b/llvm/test/MC/RISCV/rvi-valid.s index 25b72d479bc6c..f91f363703269 100644 --- a/llvm/test/MC/RISCV/rvi-valid.s +++ b/llvm/test/MC/RISCV/rvi-valid.s @@ -20,14 +20,15 @@ lui a0, 2 # CHECK-ASM-AND-OBJ: lui s11, 552960 # CHECK-ASM: encoding: [0xb7,0x0d,0x00,0x87] lui s11, (0x87000000>>12) -# CHECK-ASM-AND-OBJ: lui a0, 0 -# CHECK-ASM: encoding: [0x37,0x05,0x00,0x00] +# CHECK-ASM: lui a0, %hi(2) # encoding: [0x37,0bAAAA0101,A,A] +# CHECK-OBJ: lui a0, 0 lui a0, %hi(2) # CHECK-ASM-AND-OBJ: lui s11, 552960 # CHECK-ASM: encoding: [0xb7,0x0d,0x00,0x87] lui s11, (0x87000000>>12) -# CHECK-ASM-AND-OBJ: lui s11, 552960 -# CHECK-ASM: encoding: [0xb7,0x0d,0x00,0x87] +# CHECK-ASM: lui s11, %hi(2264924160) +# CHECK-OBJ: lui s11, 552960 +# CHECK-ASM: encoding: [0xb7,0bAAAA1101,A,A] lui s11, %hi(0x87000000) # CHECK-ASM-AND-OBJ: lui t0, 1048575 # CHECK-ASM: encoding: [0xb7,0xf2,0xff,0xff] @@ -104,8 +105,9 @@ jal zero, . # CHECK-ASM-AND-OBJ: jalr a0, -2048(a1) # CHECK-ASM: encoding: [0x67,0x85,0x05,0x80] jalr a0, -2048(a1) -# CHECK-ASM-AND-OBJ: jalr a0, -2048(a1) -# CHECK-ASM: encoding: [0x67,0x85,0x05,0x80] +# CHECK-ASM: jalr a0, %lo(2048)(a1) +# CHECK-ASM: encoding: [0x67,0x85,0bAAAA0101,A] +# CHECK-OBJ: jalr a0, -2048(a1) jalr a0, %lo(2048)(a1) # CHECK-ASM-AND-OBJ: jalr t2, 2047(t1) # CHECK-ASM: encoding: [0xe7,0x03,0xf3,0x7f] @@ -162,8 +164,9 @@ lh t1, ~2047(zero) # CHECK-ASM-AND-OBJ: lh t1, 0(zero) # CHECK-ASM: encoding: [0x03,0x13,0x00,0x00] lh t1, !1(zero) -# CHECK-ASM-AND-OBJ: lh t1, -2048(zero) -# CHECK-ASM: encoding: [0x03,0x13,0x00,0x80] +# CHECK-ASM: lh t1, %lo(2048)(zero) +# CHECK-ASM: encoding: [0x03,0x13,0bAAAA0000,A] +# CHECK-OBJ: lh t1, -2048(zero) lh t1, %lo(2048)(zero) # CHECK-ASM-AND-OBJ: lh sp, 2047(a0) # CHECK-ASM: encoding: [0x03,0x11,0xf5,0x7f] @@ -203,8 +206,9 @@ sh t3, ~2047(t5) # CHECK-ASM-AND-OBJ: sh t3, 0(t5) # CHECK-ASM: encoding: [0x23,0x10,0xcf,0x01] sh t3, !1(t5) -# CHECK-ASM-AND-OBJ: sh t3, -2048(t5) -# CHECK-ASM: encoding: [0x23,0x10,0xcf,0x81] +# CHECK-ASM: sh t3, %lo(2048)(t5) +# CHECK-ASM: encoding: [0x23'A',0x10'A',0xcf'A',0x01'A'] +# CHECK-OBJ: sh t3, -2048(t5) sh t3, %lo(2048)(t5) # CHECK-ASM-AND-OBJ: sw ra, 999(zero) # CHECK-ASM: encoding: [0xa3,0x23,0x10,0x3e] @@ -254,8 +258,8 @@ ori a0, a1, ~2047 # CHECK-ASM-AND-OBJ: ori a0, a1, 0 # CHECK-ASM: encoding: [0x13,0xe5,0x05,0x00] ori a0, a1, !1 -# CHECK-ASM-AND-OBJ: ori a0, a1, -2048 -# CHECK-ASM: encoding: [0x13,0xe5,0x05,0x80] +# CHECK-ASM: ori a0, a1, %lo(2048) # encoding: [0x13,0xe5,0bAAAA0101,A] +# CHECK-OBJ: ori a0, a1, -2048 ori a0, a1, %lo(2048) # CHECK-ASM-AND-OBJ: andi ra, sp, 2047 # CHECK-ASM: encoding: [0x93,0x70,0xf1,0x7f] diff --git a/llvm/test/MC/RISCV/rvzfh-valid.s b/llvm/test/MC/RISCV/rvzfh-valid.s index ccc6d10188de2..c39eb2dc426c8 100644 --- a/llvm/test/MC/RISCV/rvzfh-valid.s +++ b/llvm/test/MC/RISCV/rvzfh-valid.s @@ -18,8 +18,9 @@ flh f1, +4(ra) # CHECK-ASM-AND-OBJ: flh ft2, -2048(a3) # CHECK-ASM: encoding: [0x07,0x91,0x06,0x80] flh f2, -2048(x13) -# CHECK-ASM-AND-OBJ: flh ft3, -2048(s1) -# CHECK-ASM: encoding: [0x87,0x91,0x04,0x80] +# CHECK-ASM: flh ft3, %lo(2048)(s1) +# CHECCK-ASM: encoding: [0x87,0x91,0xAAAA0100,A] +# CHECK-OBJ: flh ft3, -2048(s1) flh f3, %lo(2048)(s1) # CHECK-ASM-AND-OBJ: flh ft4, 2047(s2) # CHECK-ASM: encoding: [0x07,0x12,0xf9,0x7f] From 037e7fd97cccc3941be14f9f8c79fd51af57b9dc Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 27 Mar 2025 23:33:36 -0700 Subject: [PATCH 2/3] . Created using spr 1.3.5-bogner --- .../Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp index 060f2fca84dd1..15a199a755ad9 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp @@ -164,31 +164,3 @@ StringRef RISCVMCExpr::getSpecifierName(Specifier S) { } llvm_unreachable("Invalid ELF symbol kind"); } - -bool RISCVMCExpr::evaluateAsConstant(int64_t &Res) const { - MCValue Value; - if (specifier != VK_LO && specifier != VK_HI) - return false; - return false; - - if (!getSubExpr()->evaluateAsRelocatable(Value, nullptr)) - return false; - - if (!Value.isAbsolute()) - return false; - - Res = evaluateAsInt64(Value.getConstant()); - return true; -} - -int64_t RISCVMCExpr::evaluateAsInt64(int64_t Value) const { - switch (specifier) { - default: - llvm_unreachable("Invalid kind"); - case VK_LO: - return SignExtend64<12>(Value); - case VK_HI: - // Add 1 if bit 11 is 1, to compensate for low 12 bits being negative. - return ((Value + 0x800) >> 12) & 0xfffff; - } -} From 29b2fbdbefa97bb961f4c96f6a55374c8e2f6e12 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 28 Mar 2025 11:47:47 -0700 Subject: [PATCH 3/3] delete unneeded IsValid Created using spr 1.3.5-bogner --- llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 2d324f18c0a3d..91e6b22075328 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -882,8 +882,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { bool IsConstantImm = evaluateConstantImm(getImm(), Imm); if (IsConstantImm) return isUInt<20>(Imm); - bool IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); - return IsValid && + return RISCVAsmParser::classifySymbolRef(getImm(), VK) && (VK == RISCVMCExpr::VK_HI || VK == RISCVMCExpr::VK_TPREL_HI); } @@ -896,8 +895,7 @@ struct RISCVOperand final : public MCParsedAsmOperand { if (IsConstantImm) return isUInt<20>(Imm); - bool IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); - return IsValid && + return RISCVAsmParser::classifySymbolRef(getImm(), VK) && (VK == RISCVMCExpr::VK_PCREL_HI || VK == RISCVMCExpr::VK_GOT_HI || VK == RISCVMCExpr::VK_TLS_GOT_HI || VK == RISCVMCExpr::VK_TLS_GD_HI ||