@@ -150,6 +150,87 @@ static std::vector<MCInst> loadFP64RegBits32(const MCSubtargetInfo &STI,
150150 return Instrs;
151151}
152152=======
153+ static std::vector<MCInst> loadIntImmediate (const MCSubtargetInfo &STI,
154+ unsigned Reg,
155+ const APInt &Value) {
156+ // Lower to materialization sequence.
157+ RISCVMatInt::InstSeq Seq =
158+ RISCVMatInt::generateInstSeq (Value.getSExtValue (), STI);
159+ assert (!Seq.empty ());
160+
161+ Register DstReg = Reg;
162+ Register SrcReg = RISCV::X0;
163+
164+ std::vector<MCInst> Insts;
165+ for (const RISCVMatInt::Inst &Inst : Seq) {
166+ switch (Inst.getOpndKind ()) {
167+ case RISCVMatInt::Imm:
168+ Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
169+ .addReg (DstReg)
170+ .addImm (Inst.getImm ()));
171+ break ;
172+ case RISCVMatInt::RegX0:
173+ Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
174+ .addReg (DstReg)
175+ .addReg (SrcReg)
176+ .addReg (RISCV::X0));
177+ break ;
178+ case RISCVMatInt::RegReg:
179+ Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
180+ .addReg (DstReg)
181+ .addReg (SrcReg)
182+ .addReg (SrcReg));
183+ break ;
184+ case RISCVMatInt::RegImm:
185+ Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
186+ .addReg (DstReg)
187+ .addReg (SrcReg)
188+ .addImm (Inst.getImm ()));
189+ break ;
190+ }
191+
192+ // Only the first instruction has X0 as its source.
193+ SrcReg = DstReg;
194+ }
195+ return Insts;
196+ }
197+
198+ // Note that we assume the given APInt is an integer rather than a bit-casted
199+ // floating point value.
200+ static std::vector<MCInst> loadFPImmediate (unsigned FLen,
201+ const MCSubtargetInfo &STI,
202+ unsigned Reg, const APInt &Value) {
203+ // Try FLI from the Zfa extension.
204+ if (STI.hasFeature (RISCV::FeatureStdExtZfa)) {
205+ APFloat FloatVal (FLen == 32 ? APFloat::IEEEsingle ()
206+ : APFloat::IEEEdouble ());
207+ if (FloatVal.convertFromAPInt (Value, /* IsSigned=*/ Value.isSignBitSet (),
208+ APFloat::rmNearestTiesToEven) ==
209+ APFloat::opOK) {
210+ int Idx = RISCVLoadFPImm::getLoadFPImm (FloatVal);
211+ if (Idx >= 0 )
212+ return {MCInstBuilder (FLen == 32 ? RISCV::FLI_S : RISCV::FLI_D)
213+ .addReg (Reg)
214+ .addImm (static_cast <uint64_t >(Idx))};
215+ }
216+ }
217+
218+ // Otherwise, move the value to a GPR (t0) first.
219+ assert (Reg != RISCV::X5);
220+ auto ImmSeq = loadIntImmediate (STI, RISCV::X5, Value);
221+
222+ // Then, use FCVT.
223+ unsigned Opcode;
224+ if (FLen == 32 )
225+ Opcode = Value.getBitWidth () <= 32 ? RISCV::FCVT_S_W : RISCV::FCVT_S_L;
226+ else
227+ Opcode = Value.getBitWidth () <= 32 ? RISCV::FCVT_D_W : RISCV::FCVT_D_L;
228+ ImmSeq.emplace_back (
229+ MCInstBuilder (Opcode).addReg (Reg).addReg (RISCV::X5).addImm (
230+ RISCVFPRndMode::RNE));
231+
232+ return ImmSeq;
233+ }
153234>>>>>>>
154235
155236static MCInst nop () {
@@ -160,6 +241,7 @@ static MCInst nop() {
160241 .addImm (0 );
161242}
162243
244+ <<<<<<<
163245static bool isVectorRegList (MCRegister Reg) {
164246 return RISCV::VRM2RegClass.contains (Reg) ||
165247 RISCV::VRM4RegClass.contains (Reg) ||
@@ -778,7 +860,6 @@ class ExegesisRISCVTarget : public ExegesisTarget {
778860
779861 MCRegister getDefaultLoopCounterRegister (const Triple &) const override ;
780862
781- <<<<<<<
782863 MCRegister getScratchMemoryRegister (const Triple &TT) const override ;
783864
784865 void fillMemoryOperands (InstructionTemplate &IT, MCRegister Reg,
@@ -797,8 +878,6 @@ class ExegesisRISCVTarget : public ExegesisTarget {
797878 std::vector<InstructionTemplate>
798879 generateInstructionVariants (const Instruction &Instr,
799880 unsigned MaxConfigsPerOpcode) const override ;
800- =======
801- >>>>>>>
802881
803882<<<<<<<
804883=======
@@ -808,18 +887,7 @@ class ExegesisRISCVTarget : public ExegesisTarget {
808887 RegisterValue assignInitialRegisterValue (const Instruction &I,
809888 const Operand &Op,
810889 unsigned Reg) const override ;
811-
812- static std::vector<MCInst> loadIntImmediate (const MCSubtargetInfo &STI,
813- unsigned Reg,
814- const APInt &Value);
815-
816- // Note that we assume the given APInt is an integer rather than a bit-casted
817- // floating point value.
818- static std::vector<MCInst> loadFPImmediate (unsigned FLen,
819- const MCSubtargetInfo &STI,
820- unsigned Reg, const APInt &Value);
821-
822- >>>>>>> bcced4b0d15c ([Exegesis][RISCV] RVV support for llvm-exegesis)
890+ >>>>>>>
823891
824892 void decrementLoopCounterAndJump (MachineBasicBlock &MBB,
825893 MachineBasicBlock &TargetMBB,
@@ -953,10 +1021,10 @@ ExegesisRISCVTarget::getDefaultLoopCounterRegister(const Triple &) const {
9531021 return DefaultLoopCounterReg;
9541022}
9551023
956- <<<<<<<
9571024void ExegesisRISCVTarget::decrementLoopCounterAndJump (
9581025 MachineBasicBlock &MBB, MachineBasicBlock &TargetMBB,
9591026 const MCInstrInfo &MII, MCRegister LoopRegister) const {
1027+ <<<<<<<
9601028 BuildMI (&MBB, DebugLoc (), MII.get (RISCV::ADDI))
9611029 .addDef (LoopRegister)
9621030 .addUse (LoopRegister)
@@ -965,11 +1033,7 @@ void ExegesisRISCVTarget::decrementLoopCounterAndJump(
9651033 .addUse (LoopRegister)
9661034 .addUse (RISCV::X0)
9671035 .addMBB (&TargetMBB);
968- }
9691036=======
970- void ExegesisRISCVTarget::decrementLoopCounterAndJump (
971- MachineBasicBlock &MBB, MachineBasicBlock &TargetMBB,
972- const MCInstrInfo &MII, unsigned LoopRegister) const {
9731037 MIMetadata MIMD;
9741038 BuildMI (MBB, MBB.end (), MIMD, MII.get (RISCV::ADDI), LoopRegister)
9751039 .addUse (LoopRegister)
@@ -978,8 +1042,8 @@ void ExegesisRISCVTarget::decrementLoopCounterAndJump(
9781042 .addUse (LoopRegister)
9791043 .addUse (RISCV::X0)
9801044 .addMBB (&TargetMBB);
981- }
9821045>>>>>>> bcced4b0d15c ([Exegesis][RISCV] RVV support for llvm-exegesis)
1046+ }
9831047
9841048<<<<<<<
9851049MCRegister
@@ -1106,91 +1170,6 @@ bool ExegesisRISCVTarget::isOpcodeSupported(const MCInstrDesc &Desc) const {
11061170 return ExegesisTarget::isOpcodeSupported (Desc);
11071171}
11081172
1109-
1110- std::vector<MCInst>
1111- ExegesisRISCVTarget::loadIntImmediate (const MCSubtargetInfo &STI,
1112- unsigned Reg,
1113- const APInt &Value) {
1114- // Lower to materialization sequence.
1115- RISCVMatInt::InstSeq Seq =
1116- RISCVMatInt::generateInstSeq (Value.getSExtValue (), STI);
1117- assert (!Seq.empty ());
1118-
1119- Register DstReg = Reg;
1120- Register SrcReg = RISCV::X0;
1121-
1122- std::vector<MCInst> Insts;
1123- for (const RISCVMatInt::Inst &Inst : Seq) {
1124- switch (Inst.getOpndKind ()) {
1125- case RISCVMatInt::Imm:
1126- Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
1127- .addReg (DstReg)
1128- .addImm (Inst.getImm ()));
1129- break ;
1130- case RISCVMatInt::RegX0:
1131- Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
1132- .addReg (DstReg)
1133- .addReg (SrcReg)
1134- .addReg (RISCV::X0));
1135- break ;
1136- case RISCVMatInt::RegReg:
1137- Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
1138- .addReg (DstReg)
1139- .addReg (SrcReg)
1140- .addReg (SrcReg));
1141- break ;
1142- case RISCVMatInt::RegImm:
1143- Insts.emplace_back (MCInstBuilder (Inst.getOpcode ())
1144- .addReg (DstReg)
1145- .addReg (SrcReg)
1146- .addImm (Inst.getImm ()));
1147- break ;
1148- }
1149-
1150- // Only the first instruction has X0 as its source.
1151- SrcReg = DstReg;
1152- }
1153- return Insts;
1154- }
1155-
1156-
1157- std::vector<MCInst>
1158- ExegesisRISCVTarget::loadFPImmediate (unsigned FLen,
1159- const MCSubtargetInfo &STI,
1160- unsigned Reg, const APInt &Value) {
1161- // Try FLI from the Zfa extension.
1162- if (STI.hasFeature (RISCV::FeatureStdExtZfa)) {
1163- APFloat FloatVal (FLen == 32 ? APFloat::IEEEsingle ()
1164- : APFloat::IEEEdouble ());
1165- if (FloatVal.convertFromAPInt (Value, /* IsSigned=*/ Value.isSignBitSet (),
1166- APFloat::rmNearestTiesToEven) ==
1167- APFloat::opOK) {
1168- int Idx = RISCVLoadFPImm::getLoadFPImm (FloatVal);
1169- if (Idx >= 0 )
1170- return {MCInstBuilder (FLen == 32 ? RISCV::FLI_S : RISCV::FLI_D)
1171- .addReg (Reg)
1172- .addImm (static_cast <uint64_t >(Idx))};
1173- }
1174- }
1175-
1176- // Otherwise, move the value to a GPR (t0) first.
1177- assert (Reg != RISCV::X5);
1178- auto ImmSeq = loadIntImmediate (STI, RISCV::X5, Value);
1179-
1180- // Then, use FCVT.
1181- unsigned Opcode;
1182- if (FLen == 32 )
1183- Opcode = Value.getBitWidth () <= 32 ? RISCV::FCVT_S_W : RISCV::FCVT_S_L;
1184- else
1185- Opcode = Value.getBitWidth () <= 32 ? RISCV::FCVT_D_W : RISCV::FCVT_D_L;
1186- ImmSeq.emplace_back (
1187- MCInstBuilder (Opcode).addReg (Reg).addReg (RISCV::X5).addImm (
1188- RISCVFPRndMode::RNE));
1189-
1190- return ImmSeq;
1191- }
1192-
1193-
11941173RegisterValue
11951174ExegesisRISCVTarget::assignInitialRegisterValue (const Instruction &I,
11961175 const Operand &Op,
@@ -1229,7 +1208,6 @@ ExegesisRISCVTarget::assignInitialRegisterValue(const Instruction &I,
12291208 return ExegesisTarget::assignInitialRegisterValue (I, Op, Reg);
12301209 }
12311210}
1232-
12331211>>>>>>>
12341212
12351213} // anonymous namespace
0 commit comments