Skip to content

Commit 16168af

Browse files
committed
extraft load* functions from ExegesisRISCVTarget
1 parent 147aba3 commit 16168af

File tree

1 file changed

+85
-107
lines changed

1 file changed

+85
-107
lines changed

llvm/tools/llvm-exegesis/lib/RISCV/Target.cpp

Lines changed: 85 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -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

155236
static MCInst nop() {
@@ -160,6 +241,7 @@ static MCInst nop() {
160241
.addImm(0);
161242
}
162243

244+
<<<<<<<
163245
static 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-
<<<<<<<
9571024
void 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
<<<<<<<
9851049
MCRegister
@@ -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-
11941173
RegisterValue
11951174
ExegesisRISCVTarget::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

Comments
 (0)