Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 25 additions & 44 deletions llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<RISCVMCExpr>(Expr)) {
VK = RE->getSpecifier();
return RE->evaluateAsConstant(Imm);
}

static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm) {
if (auto CE = dyn_cast<MCConstantExpr>(Expr)) {
VK = RISCVMCExpr::VK_None;
Imm = CE->getValue();
return true;
}
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -650,7 +643,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 ||
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: This if is always false, and I think VK is always none by the time you get to (new) line 654.

VK == RISCVMCExpr::VK_TLSDESC_LOAD_LO ||
VK == RISCVMCExpr::VK_TLSDESC_ADD_LO)
Expand All @@ -667,41 +660,36 @@ 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)));
}

template <unsigned N> 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<N>(Imm) && VK == RISCVMCExpr::VK_None;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm);
return IsConstantImm && isUInt<N>(Imm);
}

template <unsigned N, unsigned S> bool isUImmShifted() const {
int64_t Imm;
RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
if (!isImm())
return false;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isShiftedUInt<N, S>(Imm) &&
VK == RISCVMCExpr::VK_None;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm);
return IsConstantImm && isShiftedUInt<N, S>(Imm);
}

template <class Pred> bool isUImmPred(Pred p) const {
int64_t Imm;
RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
if (!isImm())
return false;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && p(Imm) && VK == RISCVMCExpr::VK_None;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm);
return IsConstantImm && p(Imm);
}

bool isUImmLog2XLen() const {
Expand Down Expand Up @@ -789,22 +777,18 @@ struct RISCVOperand final : public MCParsedAsmOperand {

template <unsigned N> bool isSImm() const {
int64_t Imm;
RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
if (!isImm())
return false;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && isInt<N>(fixImmediateForRV32(Imm, isRV64Imm())) &&
VK == RISCVMCExpr::VK_None;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm);
return IsConstantImm && isInt<N>(fixImmediateForRV32(Imm, isRV64Imm()));
}

template <class Pred> bool isSImmPred(Pred p) const {
int64_t Imm;
RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None;
if (!isImm())
return false;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
return IsConstantImm && p(fixImmediateForRV32(Imm, isRV64Imm())) &&
VK == RISCVMCExpr::VK_None;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm);
return IsConstantImm && p(fixImmediateForRV32(Imm, isRV64Imm()));
}

bool isSImm5() const { return isSImm<5>(); }
Expand Down Expand Up @@ -865,7 +849,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
Expand Down Expand Up @@ -905,7 +889,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 &&
Expand All @@ -923,7 +907,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 &&
Expand Down Expand Up @@ -1163,8 +1147,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(
Expand Down Expand Up @@ -1213,9 +1196,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();
Expand Down
27 changes: 0 additions & 27 deletions llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,30 +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;

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;
}
}
8 changes: 4 additions & 4 deletions llvm/test/MC/RISCV/insn.s
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
5 changes: 3 additions & 2 deletions llvm/test/MC/RISCV/rv32i-aliases-valid.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/MC/RISCV/rv64i-aliases-valid.s
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,8 @@ li x13, 0xffffffff55555556
# CHECK-S-OBJ-NEXT: addi t0, t0, -1365
li x5, -2147485013

# CHECK-INST: addi a0, zero, 1110
# CHECK-ALIAS: li a0, 1110
# CHECK-ASM: addi a0, zero, %lo(1193046)
# CHECK-OBJ: addi a0, zero, %lo(1193046)
li a0, %lo(0x123456)

# CHECK-OBJ-NOALIAS: addi a0, zero, 0
Expand Down
12 changes: 6 additions & 6 deletions llvm/test/MC/RISCV/rv64i-valid.s
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ lwu x2, +4(x3)
# CHECK-ASM-AND-OBJ: lwu tp, -2048(t0)
# CHECK-ASM: encoding: [0x03,0xe2,0x02,0x80]
lwu x4, -2048(x5)
# CHECK-ASM-AND-OBJ: lwu t1, -2048(t2)
# CHECK-ASM: encoding: [0x03,0xe3,0x03,0x80]
# CHECK-ASM: lwu t1, %lo(2048)(t2) # encoding: [0x03,0xe3,0bAAAA0011,A]
# CHECK-OBJ: lwu t1, -2048(t2)
lwu x6, %lo(2048)(x7)
# CHECK-ASM-AND-OBJ: lwu s0, 2047(s1)
# CHECK-ASM: encoding: [0x03,0xe4,0xf4,0x7f]
Expand All @@ -25,8 +25,8 @@ lwu x8, 2047(x9)
# CHECK-ASM-AND-OBJ: ld a0, -2048(a1)
# CHECK-ASM: encoding: [0x03,0xb5,0x05,0x80]
ld x10, -2048(x11)
# CHECK-ASM-AND-OBJ: ld a2, -2048(a3)
# CHECK-ASM: encoding: [0x03,0xb6,0x06,0x80]
# CHECK-ASM: ld a2, %lo(2048)(a3) # encoding: [0x03,0xb6,0bAAAA0110,A]
# CHECK-OBJ: ld a2, -2048(a3)
ld x12, %lo(2048)(x13)
# CHECK-ASM-AND-OBJ: ld a4, 2047(a5)
# CHECK-ASM: encoding: [0x03,0xb7,0xf7,0x7f]
Expand All @@ -35,8 +35,8 @@ ld x14, 2047(x15)
# CHECK-ASM-AND-OBJ: sd a6, -2048(a7)
# CHECK-ASM: encoding: [0x23,0xb0,0x08,0x81]
sd x16, -2048(x17)
# CHECK-ASM-AND-OBJ: sd s2, -2048(s3)
# CHECK-ASM: encoding: [0x23,0xb0,0x29,0x81]
# CHECK-ASM: sd s2, %lo(2048)(s3) # encoding: [0x23'A',0xb0'A',0x29'A',0x01'A']
# CHECK-OBJ: sd s2, -2048(s3)
sd x18, %lo(2048)(x19)
# CHECK-ASM-AND-OBJ: sd s4, 2047(s5)
# CHECK-ASM: encoding: [0xa3,0xbf,0x4a,0x7f]
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/MC/RISCV/rvd-valid.s
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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]
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/MC/RISCV/rvf-valid.s
Original file line number Diff line number Diff line change
Expand Up @@ -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 ft3, %lo(2048)(s1) # encoding: [0x87,0xa1,0bAAAA0100,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]
Expand All @@ -34,8 +34,8 @@ fsw f6, 2047(s4)
# CHECK-ASM-AND-OBJ: fsw ft7, -2048(s5)
# CHECK-ASM: encoding: [0x27,0xa0,0x7a,0x80]
fsw f7, -2048(s5)
# CHECK-ASM-AND-OBJ: fsw fs0, -2048(s6)
# CHECK-ASM: encoding: [0x27,0x20,0x8b,0x80]
# CHECK-ASM: fsw fs0, %lo(2048)(s6) # encoding: [0x27'A',0x20'A',0x8b'A',A]
# CHECK-OBJ: fsw fs0, -2048(s6)
fsw f8, %lo(2048)(s6)
# CHECK-ASM-AND-OBJ: fsw fs1, 999(s7)
# CHECK-ASM: encoding: [0xa7,0xa3,0x9b,0x3e]
Expand Down
Loading
Loading