Skip to content

Commit 80f8c3b

Browse files
committed
Address comments
1 parent 5b538f8 commit 80f8c3b

File tree

4 files changed

+27
-24
lines changed

4 files changed

+27
-24
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -740,24 +740,33 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
740740
const APFloat &FPimm = MI.getOperand(1).getFPImm()->getValueAPF();
741741
APInt Imm = FPimm.bitcastToAPInt();
742742
unsigned Size = MRI->getType(DstReg).getSizeInBits();
743+
744+
if (!Subtarget->hasStdExtF() &&
745+
(Size == 32 || (Size == 64 && Subtarget->is64Bit()))) {
746+
// No fp extension, so we need to go through GPRs.
747+
Register GPRReg = MRI->createVirtualRegister(&RISCV::GPRRegClass);
748+
if (!materializeImm(GPRReg, Imm.getSExtValue(), MIB))
749+
return false;
750+
751+
unsigned Opcode =
752+
(Subtarget->is64Bit() && Size == 32) ? RISCV::ADDW : RISCV::ADD;
753+
auto MV = MIB.buildInstr(Opcode, {DstReg}, {GPRReg, Register(RISCV::X0)});
754+
if (!MV.constrainAllUses(TII, TRI, RBI))
755+
return false;
756+
757+
MI.eraseFromParent();
758+
return true;
759+
}
760+
743761
if (Size == 16 || Size == 32 || (Size == 64 && Subtarget->is64Bit())) {
744762
Register GPRReg = MRI->createVirtualRegister(&RISCV::GPRRegClass);
745763
if (!materializeImm(GPRReg, Imm.getSExtValue(), MIB))
746764
return false;
747765

748-
unsigned Opcode = RISCV::INIT_UNDEF;
749-
MachineInstrBuilder FMV;
750-
if (Subtarget->hasStdExtF() || Subtarget->hasStdExtD() ||
751-
Subtarget->hasStdExtZfh()) {
752-
Opcode = Size == 64 ? RISCV::FMV_D_X
753-
: Size == 32 ? RISCV::FMV_W_X
754-
: RISCV::FMV_H_X;
755-
FMV = MIB.buildInstr(Opcode, {DstReg}, {GPRReg});
756-
} else {
757-
Opcode =
758-
(Subtarget->is64Bit() && Size == 32) ? RISCV::ADDW : RISCV::ADD;
759-
FMV = MIB.buildInstr(Opcode, {DstReg}, {GPRReg, Register(RISCV::X0)});
760-
}
766+
unsigned Opcode = Size == 64 ? RISCV::FMV_D_X
767+
: Size == 32 ? RISCV::FMV_W_X
768+
: RISCV::FMV_H_X;
769+
auto FMV = MIB.buildInstr(Opcode, {DstReg}, {GPRReg});
761770
if (!FMV.constrainAllUses(TII, TRI, RBI))
762771
return false;
763772
} else {

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -871,12 +871,6 @@ bool RISCVLegalizerInfo::shouldBeInConstantPool(const APInt &APImm,
871871
return !(!SeqLo.empty() && (SeqLo.size() + 2) <= STI.getMaxBuildIntsCost());
872872
}
873873

874-
bool RISCVLegalizerInfo::shouldBeInFConstantPool(const APFloat &APImm) const {
875-
if (APImm.isZero() || APImm.isExactlyValue(1.0))
876-
return false;
877-
return true;
878-
}
879-
880874
bool RISCVLegalizerInfo::legalizeVScale(MachineInstr &MI,
881875
MachineIRBuilder &MIB) const {
882876
const LLT XLenTy(STI.getXLenVT());
@@ -1368,7 +1362,9 @@ bool RISCVLegalizerInfo::legalizeCustom(
13681362
return Helper.lowerAbsToMaxNeg(MI);
13691363
case TargetOpcode::G_FCONSTANT: {
13701364
const ConstantFP *ConstVal = MI.getOperand(1).getFPImm();
1371-
if (!shouldBeInFConstantPool(ConstVal->getValue()))
1365+
bool ShouldOptForSize = MF.getFunction().hasOptSize();
1366+
if (!shouldBeInConstantPool(ConstVal->getValue().bitcastToAPInt(),
1367+
ShouldOptForSize))
13721368
return true;
13731369
return Helper.lowerFConstant(MI);
13741370
}

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class RISCVLegalizerInfo : public LegalizerInfo {
3939

4040
private:
4141
bool shouldBeInConstantPool(const APInt &APImm, bool ShouldOptForSize) const;
42-
bool shouldBeInFConstantPool(const APFloat &APImm) const;
4342
bool legalizeShlAshrLshr(MachineInstr &MI, MachineIRBuilder &MIRBuilder,
4443
GISelChangeObserver &Observer) const;
4544

llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,8 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
220220
const TargetSubtargetInfo &STI = MF.getSubtarget();
221221
const TargetRegisterInfo &TRI = *STI.getRegisterInfo();
222222

223-
bool HasFPExt = STI.hasFeature(RISCV::FeatureStdExtF) ||
224-
STI.hasFeature(RISCV::FeatureStdExtD) ||
225-
STI.hasFeature(RISCV::FeatureStdExtZfh);
223+
// D and Zfh extension implies F.
224+
bool HasFPExt = STI.hasFeature(RISCV::FeatureStdExtF);
226225

227226
unsigned GPRSize = getMaximumSize(RISCV::GPRBRegBankID);
228227
assert((GPRSize == 32 || GPRSize == 64) && "Unexpected GPR size");

0 commit comments

Comments
 (0)