Skip to content

Commit cb41408

Browse files
authored
[Xtensa] Fix S32C1I instruction encoding and copyPhysReg. (#165174)
Fix S21C1I instruction encoding.Fix special registers parsing for S32C1I feature. Fix copyPhysReg function for f32 registers copy.
1 parent f60e693 commit cb41408

File tree

5 files changed

+41
-4
lines changed

5 files changed

+41
-4
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: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

127144
void XtensaInstrInfo::storeRegToStackSlot(

llvm/test/CodeGen/Xtensa/s32c1i.ll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
; RUN: llc -mtriple=xtensa -mattr=+s32c1i -filetype=obj %s -o - | llvm-objdump --arch=xtensa --mattr=s32c1i -d - | FileCheck %s -check-prefix=XTENSA
2+
3+
define i32 @constraint_i(i32 %a) {
4+
; XTENSA: 0: 22 e2 01 s32c1i a2, a2, 4
5+
%res = tail call i32 asm "s32c1i $0, $1, $2", "=r,r,i"(i32 %a, i32 4)
6+
ret i32 %res
7+
}

llvm/test/MC/Xtensa/s32c1i.s

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# RUN: llvm-mc %s -triple=xtensa -show-encoding --mattr=+s32c1i \
2+
# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s
3+
4+
.align 4
5+
LBL0:
6+
7+
# CHECK-INST: xsr a3, atomctl
8+
# CHECK: # encoding: [0x30,0x63,0x61]
9+
xsr a3, atomctl
10+
11+
# CHECK-INST: xsr a3, scompare1
12+
# CHECK: # encoding: [0x30,0x0c,0x61]
13+
xsr a3, scompare1

0 commit comments

Comments
 (0)