@@ -114,14 +114,31 @@ 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,
117+ unsigned Opcode;
118+
119+ // The MOV instruction is not present in core ISA for AR registers,
118120 // so use OR instruction.
119- if (Xtensa::ARRegClass.contains (DestReg, SrcReg))
121+ if (Xtensa::ARRegClass.contains (DestReg, SrcReg)) {
120122 BuildMI (MBB, MBBI, DL, get (Xtensa::OR), DestReg)
121123 .addReg (SrcReg, getKillRegState (KillSrc))
122124 .addReg (SrcReg, getKillRegState (KillSrc));
125+ return ;
126+ }
127+
128+ if (STI.hasSingleFloat () && Xtensa::FPRRegClass.contains (SrcReg) &&
129+ Xtensa::FPRRegClass.contains (DestReg))
130+ Opcode = Xtensa::MOV_S;
131+ else if (STI.hasSingleFloat () && Xtensa::FPRRegClass.contains (SrcReg) &&
132+ Xtensa::ARRegClass.contains (DestReg))
133+ Opcode = Xtensa::RFR;
134+ else if (STI.hasSingleFloat () && Xtensa::ARRegClass.contains (SrcReg) &&
135+ Xtensa::FPRRegClass.contains (DestReg))
136+ Opcode = Xtensa::WFR;
123137 else
124138 report_fatal_error (" Impossible reg-to-reg copy" );
139+
140+ BuildMI (MBB, MBBI, DL, get (Opcode), DestReg)
141+ .addReg (SrcReg, getKillRegState (KillSrc));
125142}
126143
127144void XtensaInstrInfo::storeRegToStackSlot (
0 commit comments