@@ -738,12 +738,17 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
738738 // TODO: Use constant pool for complex constants.
739739 Register DstReg = MI.getOperand (0 ).getReg ();
740740 const APFloat &FPimm = MI.getOperand (1 ).getFPImm ()->getValueAPF ();
741- APInt Imm = FPimm.bitcastToAPInt ();
742741 unsigned Size = MRI->getType (DstReg).getSizeInBits ();
743742 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+ }
747752
748753 unsigned Opcode = Size == 64 ? RISCV::FMV_D_X
749754 : Size == 32 ? RISCV::FMV_W_X
@@ -756,7 +761,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
756761 assert (Size == 64 && !Subtarget->is64Bit () &&
757762 " Unexpected size or subtarget" );
758763
759- if (Imm. isNonNegative () && Imm. isZero ()) {
764+ if (FPimm. isPosZero ()) {
760765 // Optimize +0.0 to use fcvt.d.w
761766 MachineInstrBuilder FCVT =
762767 MIB.buildInstr (RISCV::FCVT_D_W, {DstReg}, {Register (RISCV::X0)})
@@ -771,6 +776,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
771776 // Split into two pieces and build through the stack.
772777 Register GPRRegHigh = MRI->createVirtualRegister (&RISCV::GPRRegClass);
773778 Register GPRRegLow = MRI->createVirtualRegister (&RISCV::GPRRegClass);
779+ APInt Imm = FPimm.bitcastToAPInt ();
774780 if (!materializeImm (GPRRegHigh, Imm.extractBits (32 , 32 ).getSExtValue (),
775781 MIB))
776782 return false ;
0 commit comments