@@ -114,14 +114,28 @@ void XtensaInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
114114 const DebugLoc &DL, Register DestReg,
115115 Register SrcReg, bool KillSrc,
116116 bool RenamableDest, bool RenamableSrc) const {
117- // The MOV instruction is not present in core ISA,
118- // so use OR instruction.
119- if (Xtensa::ARRegClass.contains (DestReg, SrcReg))
117+ unsigned Opcode;
118+
119+ // when we are copying a phys reg we want the bits for fp
120+ if (Xtensa::ARRegClass.contains (DestReg, SrcReg)) {
120121 BuildMI (MBB, MBBI, DL, get (Xtensa::OR), DestReg)
121122 .addReg (SrcReg, getKillRegState (KillSrc))
122123 .addReg (SrcReg, getKillRegState (KillSrc));
124+ return ;
125+ } else if (STI.hasSingleFloat () && Xtensa::FPRRegClass.contains (SrcReg) &&
126+ Xtensa::FPRRegClass.contains (DestReg))
127+ Opcode = Xtensa::MOV_S;
128+ else if (STI.hasSingleFloat () && Xtensa::FPRRegClass.contains (SrcReg) &&
129+ Xtensa::ARRegClass.contains (DestReg))
130+ Opcode = Xtensa::RFR;
131+ else if (STI.hasSingleFloat () && Xtensa::ARRegClass.contains (SrcReg) &&
132+ Xtensa::FPRRegClass.contains (DestReg))
133+ Opcode = Xtensa::WFR;
123134 else
124135 report_fatal_error (" Impossible reg-to-reg copy" );
136+
137+ BuildMI (MBB, MBBI, DL, get (Opcode), DestReg)
138+ .addReg (SrcReg, getKillRegState (KillSrc));
125139}
126140
127141void XtensaInstrInfo::storeRegToStackSlot (
0 commit comments