Skip to content

Commit 6ef2689

Browse files
committed
[Xtensa] Respect srli assembler semantics
1 parent fe4f10a commit 6ef2689

File tree

4 files changed

+38
-6
lines changed

4 files changed

+38
-6
lines changed

llvm/lib/Target/Xtensa/AsmParser/XtensaAsmParser.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,20 @@ bool XtensaAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
591591
TS.emitLiteral(Value, IDLoc);
592592
}
593593
} break;
594+
case Xtensa::SRLI: {
595+
uint32_t ImmOp32 = static_cast<uint32_t>(Inst.getOperand(2).getImm());
596+
int64_t Imm = ImmOp32;
597+
if (Imm >= 16 && Imm <= 31) {
598+
MCInst TmpInst;
599+
TmpInst.setLoc(IDLoc);
600+
TmpInst.setOpcode(Xtensa::EXTUI);
601+
TmpInst.addOperand(Inst.getOperand(0));
602+
TmpInst.addOperand(Inst.getOperand(1));
603+
TmpInst.addOperand(MCOperand::createImm(Imm));
604+
TmpInst.addOperand(MCOperand::createImm(32 - Imm));
605+
Inst = TmpInst;
606+
}
607+
} break;
594608
default:
595609
break;
596610
}

llvm/lib/Target/Xtensa/XtensaInstrInfo.td

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,23 @@ def SRAI : RRR_Inst<0x00, 0x01, 0x02, (outs AR:$r), (ins AR:$t, uimm5:$sa),
162162
let s = sa{3-0};
163163
}
164164

165-
def SRLI : RRR_Inst<0x00, 0x01, 0x04, (outs AR:$r), (ins AR:$t, uimm4:$sa),
165+
def SRLI : RRR_Inst<0x00, 0x01, 0x04, (outs AR:$r), (ins AR:$t, uimm5:$sa),
166166
"srli\t$r, $t, $sa",
167167
[(set AR:$r, (srl AR:$t, uimm4:$sa))]> {
168168
bits<4> sa;
169169

170170
let s = sa;
171171
}
172172

173+
def _SRLI : RRR_Inst<0x00, 0x01, 0x04, (outs AR:$r), (ins AR:$t, uimm4:$sa),
174+
"_srli\t$r, $t, $sa",
175+
[(set AR:$r, (srl AR:$t, uimm4:$sa))]> {
176+
let DecoderNamespace = "Fallback";
177+
bits<4> sa;
178+
179+
let s = sa;
180+
}
181+
173182
def SLLI : RRR_Inst<0x00, 0x01, 0x00, (outs AR:$r), (ins AR:$s, shimm1_31:$sa),
174183
"slli\t$r, $s, $sa",
175184
[(set AR:$r, (shl AR:$s, shimm1_31:$sa))]> {

llvm/test/MC/Xtensa/Core/invalid.s

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,12 @@ slli a1, a2, 0
2121
# CHECK: :[[#@LINE-1]]:14: error: expected immediate in range [1, 31]
2222

2323
# uimm4
24-
srli a1, a2, 16
25-
# CHECK: :[[#@LINE-1]]:14: error: expected immediate in range [0, 15]
24+
_srli a1, a2, 16
25+
# CHECK: :[[#@LINE-1]]:15: error: expected immediate in range [0, 15]
26+
27+
# uimm5
28+
srli a1, a2, 32
29+
# CHECK: :[[#@LINE-1]]:14: error: expected immediate in range [0, 31]
2630

2731
# uimm5
2832
srai a2, a3, 32

llvm/test/MC/Xtensa/Core/shift.s

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@ src a3, a4, a5
4141
srl a6, a7
4242

4343
# Instruction format RRR
44-
# CHECK-INST: srli a3, a4, 8
45-
# CHECK: encoding: [0x40,0x38,0x41]
46-
srli a3, a4, 8
44+
# CHECK-INST: extui a3, a4, 18, 14
45+
# CHECK: encoding: [0x40,0x32,0xd5]
46+
srli a3, a4, 18
47+
48+
# Instruction format RRR
49+
# CHECK-INST: srli a3, a4, 14
50+
# CHECK: encoding: [0x40,0x3e,0x41]
51+
_srli a3, a4, 14
4752

4853
# Instruction format RRR
4954
# CHECK-INST: ssa8l a14

0 commit comments

Comments
 (0)