16
16
#include " llvm/ADT/STLExtras.h"
17
17
#include " llvm/ADT/SmallVector.h"
18
18
#include " llvm/ADT/StringSwitch.h"
19
+ #include " llvm/CodeGen/Register.h"
19
20
#include " llvm/MC/MCAssembler.h"
20
21
#include " llvm/MC/MCContext.h"
21
22
#include " llvm/MC/MCExpr.h"
@@ -79,7 +80,7 @@ class RISCVAsmParser : public MCTargetAsmParser {
79
80
80
81
// Helper to emit a combination of LUI, ADDI(W), and SLLI instructions that
81
82
// synthesize the desired immedate value into the destination register.
82
- void emitLoadImm (unsigned DestReg, int64_t Value, MCStreamer &Out);
83
+ void emitLoadImm (Register DestReg, int64_t Value, MCStreamer &Out);
83
84
84
85
// Helper to emit a combination of AUIPC and SecondOpcode. Used to implement
85
86
// helpers such as emitLoadLocalAddress and emitLoadAddress.
@@ -194,7 +195,7 @@ class RISCVAsmParser : public MCTargetAsmParser {
194
195
// / instruction
195
196
struct RISCVOperand : public MCParsedAsmOperand {
196
197
197
- enum KindTy {
198
+ enum class KindTy {
198
199
Token,
199
200
Register,
200
201
Immediate,
@@ -204,7 +205,7 @@ struct RISCVOperand : public MCParsedAsmOperand {
204
205
bool IsRV64;
205
206
206
207
struct RegOp {
207
- unsigned RegNum;
208
+ Register RegNum;
208
209
};
209
210
210
211
struct ImmOp {
@@ -236,26 +237,26 @@ struct RISCVOperand : public MCParsedAsmOperand {
236
237
StartLoc = o.StartLoc ;
237
238
EndLoc = o.EndLoc ;
238
239
switch (Kind) {
239
- case Register:
240
+ case KindTy:: Register:
240
241
Reg = o.Reg ;
241
242
break ;
242
- case Immediate:
243
+ case KindTy:: Immediate:
243
244
Imm = o.Imm ;
244
245
break ;
245
- case Token:
246
+ case KindTy:: Token:
246
247
Tok = o.Tok ;
247
248
break ;
248
- case SystemRegister:
249
+ case KindTy:: SystemRegister:
249
250
SysReg = o.SysReg ;
250
251
break ;
251
252
}
252
253
}
253
254
254
- bool isToken () const override { return Kind == Token; }
255
- bool isReg () const override { return Kind == Register; }
256
- bool isImm () const override { return Kind == Immediate; }
255
+ bool isToken () const override { return Kind == KindTy:: Token; }
256
+ bool isReg () const override { return Kind == KindTy:: Register; }
257
+ bool isImm () const override { return Kind == KindTy:: Immediate; }
257
258
bool isMem () const override { return false ; }
258
- bool isSystemRegister () const { return Kind == SystemRegister; }
259
+ bool isSystemRegister () const { return Kind == KindTy:: SystemRegister; }
259
260
260
261
static bool evaluateConstantImm (const MCExpr *Expr, int64_t &Imm,
261
262
RISCVMCExpr::VariantKind &VK) {
@@ -593,46 +594,46 @@ struct RISCVOperand : public MCParsedAsmOperand {
593
594
bool isRV64 () const { return IsRV64; }
594
595
595
596
unsigned getReg () const override {
596
- assert (Kind == Register && " Invalid type access!" );
597
- return Reg.RegNum ;
597
+ assert (Kind == KindTy:: Register && " Invalid type access!" );
598
+ return Reg.RegNum . id () ;
598
599
}
599
600
600
601
StringRef getSysReg () const {
601
- assert (Kind == SystemRegister && " Invalid access!" );
602
+ assert (Kind == KindTy:: SystemRegister && " Invalid access!" );
602
603
return StringRef (SysReg.Data , SysReg.Length );
603
604
}
604
605
605
606
const MCExpr *getImm () const {
606
- assert (Kind == Immediate && " Invalid type access!" );
607
+ assert (Kind == KindTy:: Immediate && " Invalid type access!" );
607
608
return Imm.Val ;
608
609
}
609
610
610
611
StringRef getToken () const {
611
- assert (Kind == Token && " Invalid type access!" );
612
+ assert (Kind == KindTy:: Token && " Invalid type access!" );
612
613
return Tok;
613
614
}
614
615
615
616
void print (raw_ostream &OS) const override {
616
617
switch (Kind) {
617
- case Immediate:
618
+ case KindTy:: Immediate:
618
619
OS << *getImm ();
619
620
break ;
620
- case Register:
621
+ case KindTy:: Register:
621
622
OS << " <register x" ;
622
623
OS << getReg () << " >" ;
623
624
break ;
624
- case Token:
625
+ case KindTy:: Token:
625
626
OS << " '" << getToken () << " '" ;
626
627
break ;
627
- case SystemRegister:
628
+ case KindTy:: SystemRegister:
628
629
OS << " <sysreg: " << getSysReg () << ' >' ;
629
630
break ;
630
631
}
631
632
}
632
633
633
634
static std::unique_ptr<RISCVOperand> createToken (StringRef Str, SMLoc S,
634
635
bool IsRV64) {
635
- auto Op = std::make_unique<RISCVOperand>(Token);
636
+ auto Op = std::make_unique<RISCVOperand>(KindTy:: Token);
636
637
Op->Tok = Str;
637
638
Op->StartLoc = S;
638
639
Op->EndLoc = S;
@@ -642,7 +643,7 @@ struct RISCVOperand : public MCParsedAsmOperand {
642
643
643
644
static std::unique_ptr<RISCVOperand> createReg (unsigned RegNo, SMLoc S,
644
645
SMLoc E, bool IsRV64) {
645
- auto Op = std::make_unique<RISCVOperand>(Register);
646
+ auto Op = std::make_unique<RISCVOperand>(KindTy:: Register);
646
647
Op->Reg .RegNum = RegNo;
647
648
Op->StartLoc = S;
648
649
Op->EndLoc = E;
@@ -652,7 +653,7 @@ struct RISCVOperand : public MCParsedAsmOperand {
652
653
653
654
static std::unique_ptr<RISCVOperand> createImm (const MCExpr *Val, SMLoc S,
654
655
SMLoc E, bool IsRV64) {
655
- auto Op = std::make_unique<RISCVOperand>(Immediate);
656
+ auto Op = std::make_unique<RISCVOperand>(KindTy:: Immediate);
656
657
Op->Imm .Val = Val;
657
658
Op->StartLoc = S;
658
659
Op->EndLoc = E;
@@ -662,7 +663,7 @@ struct RISCVOperand : public MCParsedAsmOperand {
662
663
663
664
static std::unique_ptr<RISCVOperand>
664
665
createSysReg (StringRef Str, SMLoc S, unsigned Encoding, bool IsRV64) {
665
- auto Op = std::make_unique<RISCVOperand>(SystemRegister);
666
+ auto Op = std::make_unique<RISCVOperand>(KindTy:: SystemRegister);
666
667
Op->SysReg .Data = Str.data ();
667
668
Op->SysReg .Length = Str.size ();
668
669
Op->SysReg .Encoding = Encoding;
@@ -743,7 +744,7 @@ struct RISCVOperand : public MCParsedAsmOperand {
743
744
// Return the matching FPR64 register for the given FPR32.
744
745
// FIXME: Ideally this function could be removed in favour of using
745
746
// information from TableGen.
746
- unsigned convertFPR32ToFPR64 (unsigned Reg) {
747
+ Register convertFPR32ToFPR64 (Register Reg) {
747
748
switch (Reg) {
748
749
default :
749
750
llvm_unreachable (" Not a recognised FPR32 register" );
@@ -788,7 +789,7 @@ unsigned RISCVAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp,
788
789
if (!Op.isReg ())
789
790
return Match_InvalidOperand;
790
791
791
- unsigned Reg = Op.getReg ();
792
+ Register Reg = Op.getReg ();
792
793
bool IsRegFPR32 =
793
794
RISCVMCRegisterClasses[RISCV::FPR32RegClassID].contains (Reg);
794
795
bool IsRegFPR32C =
@@ -978,7 +979,7 @@ bool RISCVAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
978
979
// alternative ABI names), setting RegNo to the matching register. Upon
979
980
// failure, returns true and sets RegNo to 0. If IsRV32E then registers
980
981
// x16-x31 will be rejected.
981
- static bool matchRegisterNameHelper (bool IsRV32E, unsigned &RegNo,
982
+ static bool matchRegisterNameHelper (bool IsRV32E, Register &RegNo,
982
983
StringRef Name) {
983
984
RegNo = MatchRegisterName (Name);
984
985
if (RegNo == 0 )
@@ -996,7 +997,7 @@ bool RISCVAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
996
997
RegNo = 0 ;
997
998
StringRef Name = getLexer ().getTok ().getIdentifier ();
998
999
999
- if (matchRegisterNameHelper (isRV32E (), RegNo, Name))
1000
+ if (matchRegisterNameHelper (isRV32E (), (Register&) RegNo, Name))
1000
1001
return Error (StartLoc, " invalid register name" );
1001
1002
1002
1003
getParser ().Lex (); // Eat identifier token.
@@ -1028,7 +1029,7 @@ OperandMatchResultTy RISCVAsmParser::parseRegister(OperandVector &Operands,
1028
1029
return MatchOperand_NoMatch;
1029
1030
case AsmToken::Identifier:
1030
1031
StringRef Name = getLexer ().getTok ().getIdentifier ();
1031
- unsigned RegNo;
1032
+ Register RegNo;
1032
1033
matchRegisterNameHelper (isRV32E (), RegNo, Name);
1033
1034
1034
1035
if (RegNo == 0 ) {
@@ -1618,12 +1619,12 @@ void RISCVAsmParser::emitToStreamer(MCStreamer &S, const MCInst &Inst) {
1618
1619
S.EmitInstruction ((Res ? CInst : Inst), getSTI ());
1619
1620
}
1620
1621
1621
- void RISCVAsmParser::emitLoadImm (unsigned DestReg, int64_t Value,
1622
+ void RISCVAsmParser::emitLoadImm (Register DestReg, int64_t Value,
1622
1623
MCStreamer &Out) {
1623
1624
RISCVMatInt::InstSeq Seq;
1624
1625
RISCVMatInt::generateInstSeq (Value, isRV64 (), Seq);
1625
1626
1626
- unsigned SrcReg = RISCV::X0;
1627
+ Register SrcReg = RISCV::X0;
1627
1628
for (RISCVMatInt::Inst &Inst : Seq) {
1628
1629
if (Inst.Opc == RISCV::LUI) {
1629
1630
emitToStreamer (
@@ -1777,7 +1778,7 @@ bool RISCVAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
1777
1778
default :
1778
1779
break ;
1779
1780
case RISCV::PseudoLI: {
1780
- unsigned Reg = Inst.getOperand (0 ).getReg ();
1781
+ Register Reg = Inst.getOperand (0 ).getReg ();
1781
1782
const MCOperand &Op1 = Inst.getOperand (1 );
1782
1783
if (Op1.isExpr ()) {
1783
1784
// We must have li reg, %lo(sym) or li reg, %pcrel_lo(sym) or similar.
0 commit comments