Skip to content

Commit 262b101

Browse files
Zeaveechencha3
authored andcommitted
[RISCV][NFC] Add generateMCInstSeq in RISCVMatInt (llvm#84462)
This allows to avoid duplicating the code handling the instructions outputted by `generateInstSeq` when emitting `MCInst`s.
1 parent d5ca714 commit 262b101

File tree

3 files changed

+47
-27
lines changed

3 files changed

+47
-27
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3081,34 +3081,11 @@ void RISCVAsmParser::emitToStreamer(MCStreamer &S, const MCInst &Inst) {
30813081

30823082
void RISCVAsmParser::emitLoadImm(MCRegister DestReg, int64_t Value,
30833083
MCStreamer &Out) {
3084-
RISCVMatInt::InstSeq Seq = RISCVMatInt::generateInstSeq(Value, getSTI());
3085-
3086-
MCRegister SrcReg = RISCV::X0;
3087-
for (const RISCVMatInt::Inst &Inst : Seq) {
3088-
switch (Inst.getOpndKind()) {
3089-
case RISCVMatInt::Imm:
3090-
emitToStreamer(Out,
3091-
MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addImm(Inst.getImm()));
3092-
break;
3093-
case RISCVMatInt::RegX0:
3094-
emitToStreamer(
3095-
Out, MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addReg(SrcReg).addReg(
3096-
RISCV::X0));
3097-
break;
3098-
case RISCVMatInt::RegReg:
3099-
emitToStreamer(
3100-
Out, MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addReg(SrcReg).addReg(
3101-
SrcReg));
3102-
break;
3103-
case RISCVMatInt::RegImm:
3104-
emitToStreamer(
3105-
Out, MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addReg(SrcReg).addImm(
3106-
Inst.getImm()));
3107-
break;
3108-
}
3084+
SmallVector<MCInst, 8> Seq;
3085+
RISCVMatInt::generateMCInstSeq(Value, getSTI(), DestReg, Seq);
31093086

3110-
// Only the first instruction has X0 as its source.
3111-
SrcReg = DestReg;
3087+
for (MCInst &Inst : Seq) {
3088+
emitToStreamer(Out, Inst);
31123089
}
31133090
}
31143091

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "RISCVMatInt.h"
1010
#include "MCTargetDesc/RISCVMCTargetDesc.h"
1111
#include "llvm/ADT/APInt.h"
12+
#include "llvm/MC/MCInstBuilder.h"
1213
#include "llvm/Support/MathExtras.h"
1314
using namespace llvm;
1415

@@ -436,6 +437,43 @@ InstSeq generateInstSeq(int64_t Val, const MCSubtargetInfo &STI) {
436437
return Res;
437438
}
438439

440+
void generateMCInstSeq(int64_t Val, const MCSubtargetInfo &STI,
441+
MCRegister DestReg, SmallVectorImpl<MCInst> &Insts) {
442+
RISCVMatInt::InstSeq Seq = RISCVMatInt::generateInstSeq(Val, STI);
443+
444+
MCRegister SrcReg = RISCV::X0;
445+
for (RISCVMatInt::Inst &Inst : Seq) {
446+
switch (Inst.getOpndKind()) {
447+
case RISCVMatInt::Imm:
448+
Insts.push_back(MCInstBuilder(Inst.getOpcode())
449+
.addReg(DestReg)
450+
.addImm(Inst.getImm()));
451+
break;
452+
case RISCVMatInt::RegX0:
453+
Insts.push_back(MCInstBuilder(Inst.getOpcode())
454+
.addReg(DestReg)
455+
.addReg(SrcReg)
456+
.addReg(RISCV::X0));
457+
break;
458+
case RISCVMatInt::RegReg:
459+
Insts.push_back(MCInstBuilder(Inst.getOpcode())
460+
.addReg(DestReg)
461+
.addReg(SrcReg)
462+
.addReg(SrcReg));
463+
break;
464+
case RISCVMatInt::RegImm:
465+
Insts.push_back(MCInstBuilder(Inst.getOpcode())
466+
.addReg(DestReg)
467+
.addReg(SrcReg)
468+
.addImm(Inst.getImm()));
469+
break;
470+
}
471+
472+
// Only the first instruction has X0 as its source.
473+
SrcReg = DestReg;
474+
}
475+
}
476+
439477
InstSeq generateTwoRegInstSeq(int64_t Val, const MCSubtargetInfo &STI,
440478
unsigned &ShiftAmt, unsigned &AddOpc) {
441479
int64_t LoVal = SignExtend64<32>(Val);

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_MATINT_H
1111

1212
#include "llvm/ADT/SmallVector.h"
13+
#include "llvm/MC/MCRegister.h"
1314
#include "llvm/MC/MCSubtargetInfo.h"
1415
#include <cstdint>
1516

@@ -48,6 +49,10 @@ using InstSeq = SmallVector<Inst, 8>;
4849
// instruction selection.
4950
InstSeq generateInstSeq(int64_t Val, const MCSubtargetInfo &STI);
5051

52+
// Helper to generate the generateInstSeq instruction sequence using MCInsts
53+
void generateMCInstSeq(int64_t Val, const MCSubtargetInfo &STI,
54+
MCRegister DestReg, SmallVectorImpl<MCInst> &Insts);
55+
5156
// Helper to generate an instruction sequence that can materialize the given
5257
// immediate value into a register using an additional temporary register. This
5358
// handles cases where the constant can be generated by (ADD (SLLI X, C), X) or

0 commit comments

Comments
 (0)