@@ -86,44 +86,13 @@ bool ExegesisRISCVTarget::matchesArch(Triple::ArchType Arch) const {
86
86
// Stores constant value to a general-purpose (integer) register.
87
87
static std::vector<MCInst> loadIntReg (const MCSubtargetInfo &STI, unsigned Reg,
88
88
const APInt &Value) {
89
- RISCVMatInt::InstSeq InstSeq =
90
- RISCVMatInt::generateInstSeq (Value.getSExtValue (), STI);
91
- // First instruction has form 'Op DestReg, X0, Imm'
92
- MCRegister SrcReg = RISCV::X0;
93
- MCRegister DestReg = Reg;
89
+ SmallVector<MCInst, 8 > MCInstSeq;
94
90
std::vector<MCInst> MatIntInstrs;
95
- MatIntInstrs.reserve (InstSeq.size ());
96
- for (const RISCVMatInt::Inst &Inst : InstSeq) {
97
- switch (Inst.getOpndKind ()) {
98
- case RISCVMatInt::Imm:
99
- MatIntInstrs.push_back (MCInstBuilder (Inst.getOpcode ())
100
- .addReg (DestReg)
101
- .addImm (Inst.getImm ()));
102
- break ;
103
- case RISCVMatInt::RegX0:
104
- MatIntInstrs.push_back (MCInstBuilder (Inst.getOpcode ())
105
- .addReg (DestReg)
106
- .addReg (SrcReg)
107
- .addReg (RISCV::X0));
108
- break ;
109
- case RISCVMatInt::RegReg:
110
- MatIntInstrs.push_back (MCInstBuilder (Inst.getOpcode ())
111
- .addReg (DestReg)
112
- .addReg (SrcReg)
113
- .addReg (SrcReg));
114
- break ;
115
- case RISCVMatInt::RegImm:
116
- MatIntInstrs.push_back (MCInstBuilder (Inst.getOpcode ())
117
- .addReg (DestReg)
118
- .addReg (SrcReg)
119
- .addImm (Inst.getImm ()));
120
- break ;
121
- default :
122
- llvm_unreachable (" Unexpected kind!" );
123
- }
124
- // Further instructions have form 'Op DestReg, DestReg, Imm'
125
- SrcReg = DestReg;
126
- }
91
+ MCRegister DestReg = Reg;
92
+
93
+ RISCVMatInt::generateMCInstSeq (Value.getSExtValue (), STI, DestReg, MCInstSeq);
94
+ std::copy (MCInstSeq.begin (), MCInstSeq.end (), MatIntInstrs.begin ());
95
+
127
96
return MatIntInstrs;
128
97
}
129
98
0 commit comments