@@ -127,6 +127,7 @@ namespace {
127127class RISCVMCInstrAnalysis : public MCInstrAnalysis {
128128 int64_t GPRState[31 ] = {};
129129 std::bitset<31 > GPRValidMask;
130+ int ArchRegWidth;
130131
131132 static bool isGPR (MCRegister Reg) {
132133 return Reg >= RISCV::X0 && Reg <= RISCV::X31;
@@ -163,8 +164,8 @@ class RISCVMCInstrAnalysis : public MCInstrAnalysis {
163164 }
164165
165166public:
166- explicit RISCVMCInstrAnalysis (const MCInstrInfo *Info)
167- : MCInstrAnalysis(Info) {}
167+ explicit RISCVMCInstrAnalysis (const MCInstrInfo *Info, int ArchRegWidth )
168+ : MCInstrAnalysis(Info), ArchRegWidth(ArchRegWidth) {}
168169
169170 void resetState () override { GPRValidMask.reset (); }
170171
@@ -180,35 +181,28 @@ class RISCVMCInstrAnalysis : public MCInstrAnalysis {
180181 }
181182
182183 switch (Inst.getOpcode ()) {
183- case RISCV::LUI: {
184- setGPRState (Inst.getOperand (0 ).getReg (),
185- SignExtend64<32 >(Inst.getOperand (1 ).getImm () << 12 ));
186- break ;
187- }
188- case RISCV::C_LUI: {
189- MCRegister Reg = Inst.getOperand (0 ).getReg ();
190- if (Reg == RISCV::X2)
191- break ;
192- setGPRState (Reg, SignExtend64<18 >(Inst.getOperand (1 ).getImm () << 12 ));
193- break ;
194-
195- }
196- case RISCV::AUIPC: {
197- setGPRState (Inst.getOperand (0 ).getReg (),
198- Addr + SignExtend64<32 >(Inst.getOperand (1 ).getImm () << 12 ));
199- break ;
200- }
201- default : {
202- // Clear the state of all defined registers for instructions that we don't
203- // explicitly support.
204- auto NumDefs = Info->get (Inst.getOpcode ()).getNumDefs ();
205- for (unsigned I = 0 ; I < NumDefs; ++I) {
206- auto DefReg = Inst.getOperand (I).getReg ();
207- if (isGPR (DefReg))
208- setGPRState (DefReg, std::nullopt );
209- }
210- break ;
184+ case RISCV::C_LUI:
185+ case RISCV::LUI: {
186+ setGPRState (Inst.getOperand (0 ).getReg (),
187+ SignExtend64<32 >(Inst.getOperand (1 ).getImm () << 12 ));
188+ break ;
189+ }
190+ case RISCV::AUIPC: {
191+ setGPRState (Inst.getOperand (0 ).getReg (),
192+ Addr + SignExtend64<32 >(Inst.getOperand (1 ).getImm () << 12 ));
193+ break ;
194+ }
195+ default : {
196+ // Clear the state of all defined registers for instructions that we don't
197+ // explicitly support.
198+ auto NumDefs = Info->get (Inst.getOpcode ()).getNumDefs ();
199+ for (unsigned I = 0 ; I < NumDefs; ++I) {
200+ auto DefReg = Inst.getOperand (I).getReg ();
201+ if (isGPR (DefReg))
202+ setGPRState (DefReg, std::nullopt );
211203 }
204+ break ;
205+ }
212206 }
213207 }
214208
@@ -247,90 +241,59 @@ class RISCVMCInstrAnalysis : public MCInstrAnalysis {
247241 }
248242
249243 bool evaluateInstruction (const MCInst &Inst, uint64_t Addr, uint64_t Size,
250- uint64_t &Target, int ArchRegWidth ) const override {
244+ uint64_t &Target, raw_ostream *TargetOS ) const override {
251245 switch (Inst.getOpcode ()) {
252- default :
253- return false ;
254- case RISCV::ADDI: {
255- if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
256- uint64_t Mask = ~((uint64_t )0 ) >> (64 - ArchRegWidth);
257- Target = *TargetRegState + SignExtend64<12 >(Inst.getOperand (2 ).getImm ());
258- Target &= Mask;
259- return true ;
260- }
261- break ;
262- }
263- case RISCV::ADDIW: {
264- if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
265- uint64_t Mask = ~((uint64_t )0 ) >> 32 ;
266- Target = *TargetRegState + SignExtend64<12 >(Inst.getOperand (2 ).getImm ());
267- Target &= Mask;
268- Target = SignExtend64<32 >(Target);
269- return true ;
270- }
271- break ;
272- }
273- case RISCV::C_ADDI: {
274- int64_t Offset = Inst.getOperand (2 ).getImm ();
275- if (Offset == 0 )
276- break ;
277- if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
278- Target = *TargetRegState + SignExtend64<6 >(Offset);
279- return true ;
280- }
281- break ;
282- }
283- case RISCV::C_ADDIW: {
284- int64_t Offset = Inst.getOperand (2 ).getImm ();
285- if (Offset == 0 )
286- break ;
287- if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
288- uint64_t Mask = ~((uint64_t )0 ) >> 32 ;
289- Target &= Mask;
290- Target = *TargetRegState + SignExtend64<6 >(Offset);
291- Target = SignExtend64<32 >(Target);
292- return true ;
293- }
294- break ;
246+ default :
247+ return false ;
248+ case RISCV::C_ADDI:
249+ case RISCV::ADDI: {
250+ if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
251+ Target = *TargetRegState + Inst.getOperand (2 ).getImm ();
252+ Target &= maskTrailingOnes<uint64_t >(ArchRegWidth);
253+ return true ;
295254 }
296- case RISCV::LB:
297- case RISCV::LH:
298- case RISCV::LD:
299- case RISCV::LW:
300- case RISCV::LBU:
301- case RISCV::LHU:
302- case RISCV::LWU:
303- case RISCV::SB:
304- case RISCV::SH:
305- case RISCV::SW:
306- case RISCV::SD:
307- case RISCV::FLH:
308- case RISCV::FLW:
309- case RISCV::FLD:
310- case RISCV::FSH:
311- case RISCV::FSW:
312- case RISCV::FSD: {
313- int64_t Offset = SignExtend64<12 >(Inst.getOperand (2 ).getImm ());
314- if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ()))
315- Target = *TargetRegState + Offset;
316- else
317- Target = Offset;
255+ break ;
256+ }
257+ case RISCV::C_ADDIW:
258+ case RISCV::ADDIW: {
259+ if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
260+ Target = *TargetRegState + Inst.getOperand (2 ).getImm ();
261+ Target = SignExtend64<32 >(Target);
318262 return true ;
319263 }
320- case RISCV::C_LD:
321- case RISCV::C_SD:
322- case RISCV::C_FLD:
323- case RISCV::C_FSD:
324- case RISCV::C_SW:
325- case RISCV::C_LW:
326- case RISCV::C_FSW:
327- case RISCV::C_FLW: {
328- if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
329- Target = *TargetRegState + Inst.getOperand (2 ).getImm ();
330- return true ;
331- }
332- break ;
264+ break ;
265+ }
266+ case RISCV::LB:
267+ case RISCV::LH:
268+ case RISCV::LD:
269+ case RISCV::LW:
270+ case RISCV::LBU:
271+ case RISCV::LHU:
272+ case RISCV::LWU:
273+ case RISCV::SB:
274+ case RISCV::SH:
275+ case RISCV::SW:
276+ case RISCV::SD:
277+ case RISCV::FLH:
278+ case RISCV::FLW:
279+ case RISCV::FLD:
280+ case RISCV::FSH:
281+ case RISCV::FSW:
282+ case RISCV::FSD:
283+ case RISCV::C_LD:
284+ case RISCV::C_SD:
285+ case RISCV::C_FLD:
286+ case RISCV::C_FSD:
287+ case RISCV::C_SW:
288+ case RISCV::C_LW:
289+ case RISCV::C_FSW:
290+ case RISCV::C_FLW: {
291+ if (auto TargetRegState = getGPRState (Inst.getOperand (1 ).getReg ())) {
292+ Target = *TargetRegState + Inst.getOperand (2 ).getImm ();
293+ return true ;
333294 }
295+ break ;
296+ }
334297 }
335298 return false ;
336299 }
@@ -428,8 +391,12 @@ class RISCVMCInstrAnalysis : public MCInstrAnalysis {
428391
429392} // end anonymous namespace
430393
431- static MCInstrAnalysis *createRISCVInstrAnalysis (const MCInstrInfo *Info) {
432- return new RISCVMCInstrAnalysis (Info);
394+ static MCInstrAnalysis *createRISCV32InstrAnalysis (const MCInstrInfo *Info) {
395+ return new RISCVMCInstrAnalysis (Info, 32 );
396+ }
397+
398+ static MCInstrAnalysis *createRISCV64InstrAnalysis (const MCInstrInfo *Info) {
399+ return new RISCVMCInstrAnalysis (Info, 64 );
433400}
434401
435402namespace {
@@ -455,12 +422,12 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTargetMC() {
455422 TargetRegistry::RegisterELFStreamer (*T, createRISCVELFStreamer);
456423 TargetRegistry::RegisterObjectTargetStreamer (
457424 *T, createRISCVObjectTargetStreamer);
458- TargetRegistry::RegisterMCInstrAnalysis (*T, createRISCVInstrAnalysis);
459-
460425 // Register the asm target streamer.
461426 TargetRegistry::RegisterAsmTargetStreamer (*T, createRISCVAsmTargetStreamer);
462427 // Register the null target streamer.
463428 TargetRegistry::RegisterNullTargetStreamer (*T,
464429 createRISCVNullTargetStreamer);
465430 }
431+ TargetRegistry::RegisterMCInstrAnalysis (getTheRISCV32Target (), createRISCV32InstrAnalysis);
432+ TargetRegistry::RegisterMCInstrAnalysis (getTheRISCV64Target (), createRISCV64InstrAnalysis);
466433}
0 commit comments