@@ -738,12 +738,17 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
738
738
// TODO: Use constant pool for complex constants.
739
739
Register DstReg = MI.getOperand (0 ).getReg ();
740
740
const APFloat &FPimm = MI.getOperand (1 ).getFPImm ()->getValueAPF ();
741
- APInt Imm = FPimm.bitcastToAPInt ();
742
741
unsigned Size = MRI->getType (DstReg).getSizeInBits ();
743
742
if (Size == 16 || Size == 32 || (Size == 64 && Subtarget->is64Bit ())) {
744
- Register GPRReg = MRI->createVirtualRegister (&RISCV::GPRRegClass);
745
- if (!materializeImm (GPRReg, Imm.getSExtValue (), MIB))
746
- return false ;
743
+ Register GPRReg;
744
+ if (FPimm.isPosZero ()) {
745
+ GPRReg = RISCV::X0;
746
+ } else {
747
+ GPRReg = MRI->createVirtualRegister (&RISCV::GPRRegClass);
748
+ APInt Imm = FPimm.bitcastToAPInt ();
749
+ if (!materializeImm (GPRReg, Imm.getSExtValue (), MIB))
750
+ return false ;
751
+ }
747
752
748
753
unsigned Opcode = Size == 64 ? RISCV::FMV_D_X
749
754
: Size == 32 ? RISCV::FMV_W_X
@@ -756,7 +761,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
756
761
assert (Size == 64 && !Subtarget->is64Bit () &&
757
762
" Unexpected size or subtarget" );
758
763
759
- if (Imm. isNonNegative () && Imm. isZero ()) {
764
+ if (FPimm. isPosZero ()) {
760
765
// Optimize +0.0 to use fcvt.d.w
761
766
MachineInstrBuilder FCVT =
762
767
MIB.buildInstr (RISCV::FCVT_D_W, {DstReg}, {Register (RISCV::X0)})
@@ -771,6 +776,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
771
776
// Split into two pieces and build through the stack.
772
777
Register GPRRegHigh = MRI->createVirtualRegister (&RISCV::GPRRegClass);
773
778
Register GPRRegLow = MRI->createVirtualRegister (&RISCV::GPRRegClass);
779
+ APInt Imm = FPimm.bitcastToAPInt ();
774
780
if (!materializeImm (GPRRegHigh, Imm.extractBits (32 , 32 ).getSExtValue (),
775
781
MIB))
776
782
return false ;
0 commit comments