Skip to content

Commit 34b61d6

Browse files
committed
[SystemZ] Add support for .insn directives for vector instructions.
Support VRI, VRR, VRS, VRV, VRX, VSI instruction formats with the .insn directive. Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D88357
1 parent 2573cf3 commit 34b61d6

File tree

4 files changed

+120
-2
lines changed

4 files changed

+120
-2
lines changed

llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ struct InsnMatchEntry {
565565
StringRef Format;
566566
uint64_t Opcode;
567567
int32_t NumOperands;
568-
MatchClassKind OperandKinds[5];
568+
MatchClassKind OperandKinds[7];
569569
};
570570

571571
// For equal_range comparison.
@@ -633,7 +633,20 @@ static struct InsnMatchEntry InsnMatchTable[] = {
633633
{ "sse", SystemZ::InsnSSE, 3,
634634
{ MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12 } },
635635
{ "ssf", SystemZ::InsnSSF, 4,
636-
{ MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } }
636+
{ MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } },
637+
{ "vri", SystemZ::InsnVRI, 6,
638+
{ MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm } },
639+
{ "vrr", SystemZ::InsnVRR, 7,
640+
{ MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_U4Imm,
641+
MCK_U4Imm } },
642+
{ "vrs", SystemZ::InsnVRS, 5,
643+
{ MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_U4Imm } },
644+
{ "vrv", SystemZ::InsnVRV, 4,
645+
{ MCK_U48Imm, MCK_AnyReg, MCK_BDVAddr64Disp12, MCK_U4Imm } },
646+
{ "vrx", SystemZ::InsnVRX, 4,
647+
{ MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp12, MCK_U4Imm } },
648+
{ "vsi", SystemZ::InsnVSI, 4,
649+
{ MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_U8Imm } }
637650
};
638651

639652
static void printMCExpr(const MCExpr *E, raw_ostream &OS) {
@@ -1199,6 +1212,8 @@ bool SystemZAsmParser::ParseDirectiveInsn(SMLoc L) {
11991212
ResTy = parseBDXAddr64(Operands);
12001213
else if (Kind == MCK_BDAddr64Disp12 || Kind == MCK_BDAddr64Disp20)
12011214
ResTy = parseBDAddr64(Operands);
1215+
else if (Kind == MCK_BDVAddr64Disp12)
1216+
ResTy = parseBDVAddr64(Operands);
12021217
else if (Kind == MCK_PCRel32)
12031218
ResTy = parsePCRel32(Operands);
12041219
else if (Kind == MCK_PCRel16)
@@ -1243,6 +1258,8 @@ bool SystemZAsmParser::ParseDirectiveInsn(SMLoc L) {
12431258
ZOperand.addBDAddrOperands(Inst, 2);
12441259
else if (ZOperand.isMem(BDXMem))
12451260
ZOperand.addBDXAddrOperands(Inst, 3);
1261+
else if (ZOperand.isMem(BDVMem))
1262+
ZOperand.addBDVAddrOperands(Inst, 3);
12461263
else if (ZOperand.isImm())
12471264
ZOperand.addImmOperands(Inst, 1);
12481265
else

llvm/lib/Target/SystemZ/SystemZInstrFormats.td

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,6 +1764,55 @@ class DirectiveInsnSSF<dag outs, dag ins, string asmstr, list<dag> pattern>
17641764
let Inst{35-32} = enc{35-32};
17651765
}
17661766

1767+
class DirectiveInsnVRI<dag outs, dag ins, string asmstr, list<dag> pattern>
1768+
: InstVRIe<0, outs, ins, asmstr, pattern> {
1769+
bits<48> enc;
1770+
1771+
let Inst{47-40} = enc{47-40};
1772+
let Inst{7-0} = enc{7-0};
1773+
}
1774+
1775+
class DirectiveInsnVRR<dag outs, dag ins, string asmstr, list<dag> pattern>
1776+
: InstVRRc<0, outs, ins, asmstr, pattern> {
1777+
bits<48> enc;
1778+
1779+
let Inst{47-40} = enc{47-40};
1780+
let Inst{7-0} = enc{7-0};
1781+
}
1782+
1783+
class DirectiveInsnVRS<dag outs, dag ins, string asmstr, list<dag> pattern>
1784+
: InstVRSc<0, outs, ins, asmstr, pattern> {
1785+
bits<48> enc;
1786+
1787+
let Inst{47-40} = enc{47-40};
1788+
let Inst{7-0} = enc{7-0};
1789+
}
1790+
1791+
class DirectiveInsnVRV<dag outs, dag ins, string asmstr, list<dag> pattern>
1792+
: InstVRV<0, outs, ins, asmstr, pattern> {
1793+
bits<48> enc;
1794+
1795+
let Inst{47-40} = enc{47-40};
1796+
let Inst{7-0} = enc{7-0};
1797+
}
1798+
1799+
class DirectiveInsnVRX<dag outs, dag ins, string asmstr, list<dag> pattern>
1800+
: InstVRX<0, outs, ins, asmstr, pattern> {
1801+
bits<48> enc;
1802+
1803+
let Inst{47-40} = enc{47-40};
1804+
let Inst{7-0} = enc{7-0};
1805+
}
1806+
1807+
class DirectiveInsnVSI<dag outs, dag ins, string asmstr, list<dag> pattern>
1808+
: InstVSI<0, outs, ins, asmstr, pattern> {
1809+
bits<48> enc;
1810+
1811+
let Inst{47-40} = enc{47-40};
1812+
let Inst{7-0} = enc{7-0};
1813+
}
1814+
1815+
17671816
//===----------------------------------------------------------------------===//
17681817
// Variants of instructions with condition mask
17691818
//===----------------------------------------------------------------------===//

llvm/lib/Target/SystemZ/SystemZInstrInfo.td

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2246,6 +2246,31 @@ let isCodeGenOnly = 1, hasSideEffects = 1 in {
22462246
(ins imm64zx48:$enc, bdaddr12only:$BD1,
22472247
bdaddr12only:$BD2, AnyReg:$R3),
22482248
".insn ssf,$enc,$BD1,$BD2,$R3", []>;
2249+
def InsnVRI : DirectiveInsnVRI<(outs),
2250+
(ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
2251+
imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
2252+
".insn vri,$enc,$V1,$V2,$I3,$M4,$M5", []>;
2253+
def InsnVRR : DirectiveInsnVRR<(outs),
2254+
(ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
2255+
VR128:$V3, imm32zx4:$M4, imm32zx4:$M5,
2256+
imm32zx4:$M6),
2257+
".insn vrr,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>;
2258+
def InsnVRS : DirectiveInsnVRS<(outs),
2259+
(ins imm64zx48:$enc, AnyReg:$R1, VR128:$V3,
2260+
bdaddr12only:$BD2, imm32zx4:$M4),
2261+
".insn vrs,$enc,$BD2,$M4", []>;
2262+
def InsnVRV : DirectiveInsnVRV<(outs),
2263+
(ins imm64zx48:$enc, VR128:$V1,
2264+
bdvaddr12only:$VBD2, imm32zx4:$M3),
2265+
".insn vrv,$enc,$V1,$VBD2,$M3", []>;
2266+
def InsnVRX : DirectiveInsnVRX<(outs),
2267+
(ins imm64zx48:$enc, VR128:$V1,
2268+
bdxaddr12only:$XBD2, imm32zx4:$M3),
2269+
".insn vrx,$enc,$V1,$XBD2,$M3", []>;
2270+
def InsnVSI : DirectiveInsnVSI<(outs),
2271+
(ins imm64zx48:$enc, VR128:$V1,
2272+
bdaddr12only:$BD2, imm32zx8:$I3),
2273+
".insn vsi,$enc,$V1,$BD2,$I3", []>;
22492274
}
22502275

22512276
//===----------------------------------------------------------------------===//
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# RUN: llvm-mc -triple s390x-linux-gnu -filetype=obj %s | \
2+
# RUN: llvm-objdump --mcpu=z14 -d - | FileCheck %s
3+
4+
# Test the .insn directive for vector instructions.
5+
6+
#CHECK: e7 23 2f ff 10 13 vgef %v2, 4095(%v3,%r2), 1
7+
.insn vrv,0xe70000000013,%v2,4095(%v3,%r2),1
8+
9+
#CHECK: e7 56 ff f1 20 4a vftci %v5, %v6, 4095, 2, 1
10+
.insn vri,0xe7000000004a,%v5,%v6,4095,2,1
11+
12+
#CHECK: e7 20 2f ff 30 06 vl %v2, 4095(%r2), 3
13+
.insn vrx,0xe70000000006,%v2,4095(%r2),3
14+
15+
#CHECK: e7 16 00 01 00 21 vlgvb %r1, %v6, 1
16+
.insn vrs,0xe70000003021,%r1,%v6,1(%r0),0
17+
#CHECK: e7 16 00 00 30 21 vlgvg %r1, %v6, 0
18+
.insn vrs,0xe70000003021,%r1,%v6,0(%r0),3
19+
20+
#CHECK: e7 37 00 00 00 56 vlr %v3, %v7
21+
.insn vrr,0xe70000000056,%v3,%v7,0,0,0,0
22+
#CHECK: e7 37 60 18 30 eb wfchdbs %f3, %f7, %f6
23+
.insn vrr,0xe700000000eb,%v3,%v7,%v6,3,8,1
24+
25+
#CHECK: e6 0c 20 0c 01 35 vlrl %v16, 12(%r2), 12
26+
.insn vsi,0xe60000000035,%v16,12(%r2),12
27+

0 commit comments

Comments
 (0)