[PATCH] D149931: [RISCV] Rework how implied SP operands work in the disassembler. NFC
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 5 00:03:18 PDT 2023
craig.topper created this revision.
craig.topper added reviewers: asb, jrtc27, kito-cheng, luismarques.
Herald added subscribers: jobnoorman, luke, VincentWu, vkmr, frasercrmck, evandro, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, hiraditya, arichardson.
Herald added a project: All.
craig.topper requested review of this revision.
Herald added subscribers: pcwang-thead, eopXD, MaskRay.
Herald added a project: LLVM.
Previously we added the SP operands when an immediate operand was added
to certain opcodes.
This patch moves it to a post processing step using the information
in MCInstrDesc. This avoids an explicit opcode list in RISCVDisassembler.cpp.
In considered using a custom DecoderMethod, but the bit swizzling we
need to do for the immediates on these instructions made that
unattractive.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D149931
Files:
llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
Index: llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
===================================================================
--- llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -41,6 +41,9 @@
DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
ArrayRef<uint8_t> Bytes, uint64_t Address,
raw_ostream &CStream) const override;
+
+private:
+ void addSPOperands(MCInst &MI) const;
};
} // end anonymous namespace
@@ -256,30 +259,11 @@
return MCDisassembler::Success;
}
-// Add implied SP operand for instructions *SP compressed instructions. The SP
-// operand isn't explicitly encoded in the instruction.
-static void addImplySP(MCInst &Inst) {
- if (Inst.getOpcode() == RISCV::C_LWSP || Inst.getOpcode() == RISCV::C_SWSP ||
- Inst.getOpcode() == RISCV::C_LDSP || Inst.getOpcode() == RISCV::C_SDSP ||
- Inst.getOpcode() == RISCV::C_FLWSP ||
- Inst.getOpcode() == RISCV::C_FSWSP ||
- Inst.getOpcode() == RISCV::C_FLDSP ||
- Inst.getOpcode() == RISCV::C_FSDSP ||
- Inst.getOpcode() == RISCV::C_ADDI4SPN) {
- Inst.addOperand(MCOperand::createReg(RISCV::X2));
- }
- if (Inst.getOpcode() == RISCV::C_ADDI16SP) {
- Inst.addOperand(MCOperand::createReg(RISCV::X2));
- Inst.addOperand(MCOperand::createReg(RISCV::X2));
- }
-}
-
template <unsigned N>
static DecodeStatus decodeUImmOperand(MCInst &Inst, uint32_t Imm,
int64_t Address,
const MCDisassembler *Decoder) {
assert(isUInt<N>(Imm) && "Invalid immediate");
- addImplySP(Inst);
Inst.addOperand(MCOperand::createImm(Imm));
return MCDisassembler::Success;
}
@@ -298,7 +282,6 @@
int64_t Address,
const MCDisassembler *Decoder) {
assert(isUInt<N>(Imm) && "Invalid immediate");
- addImplySP(Inst);
// Sign-extend the number in the bottom N bits of Imm
Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm)));
return MCDisassembler::Success;
@@ -456,6 +439,15 @@
return MCDisassembler::Success;
}
+// Add implied SP operand for instructions *SP compressed instructions. The SP
+// operand isn't explicitly encoded in the instruction.
+void RISCVDisassembler::addSPOperands(MCInst &MI) const {
+ const MCInstrDesc &MCID = MCII->get(MI.getOpcode());
+ for (unsigned i = 0; i < MCID.getNumOperands(); i++)
+ if (MCID.operands()[i].RegClass == RISCV::SPRegClassID)
+ MI.insert(MI.begin() + i, MCOperand::createReg(RISCV::X2));
+}
+
DecodeStatus RISCVDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
ArrayRef<uint8_t> Bytes,
uint64_t Address,
@@ -601,11 +593,17 @@
// Calling the auto-generated decoder function.
Result = decodeInstruction(DecoderTableRISCV32Only_16, MI, Insn, Address,
this, STI);
- if (Result != MCDisassembler::Fail)
+ if (Result != MCDisassembler::Fail) {
+ addSPOperands(MI);
return Result;
+ }
}
LLVM_DEBUG(dbgs() << "Trying RISCV_C table (16-bit Instruction):\n");
// Calling the auto-generated decoder function.
- return decodeInstruction(DecoderTable16, MI, Insn, Address, this, STI);
+ Result = decodeInstruction(DecoderTable16, MI, Insn, Address, this, STI);
+ if (Result != MCDisassembler::Fail)
+ addSPOperands(MI);
+
+ return Result;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149931.519752.patch
Type: text/x-patch
Size: 3595 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230505/182fbebf/attachment.bin>
More information about the llvm-commits
mailing list