Skip to content

Commit 373d80f

Browse files
committed
[Xtensa] Fix S32C1I instruction encoding and copyPhysReg.
Fix S21C1I instruction encoding.Fix special registers parsing for S32C1I feature. Fix copyPhysReg function for f32 registers copy.
1 parent a975e64 commit 373d80f

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCCodeEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ XtensaMCCodeEmitter::getMemRegEncoding(const MCInst &MI, unsigned OpNo,
320320
case Xtensa::SSIP:
321321
case Xtensa::LSI:
322322
case Xtensa::LSIP:
323-
323+
case Xtensa::S32C1I:
324324
if (Res & 0x3) {
325325
report_fatal_error("Unexpected operand value!");
326326
}

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCTargetDesc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ bool Xtensa::checkRegister(MCRegister RegNo, const FeatureBitset &FeatureBits,
202202
return FeatureBits[Xtensa::FeatureWindowed];
203203
case Xtensa::ATOMCTL:
204204
case Xtensa::SCOMPARE1:
205-
return FeatureBits[Xtensa::FeatureWindowed];
205+
return FeatureBits[Xtensa::FeatureS32C1I];
206206
case Xtensa::NoRegister:
207207
return false;
208208
}

llvm/lib/Target/Xtensa/XtensaInstrInfo.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

127141
void XtensaInstrInfo::storeRegToStackSlot(

0 commit comments

Comments
 (0)