xref: /aosp_15_r20/external/llvm/test/TableGen/MultiPat.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker// RUN: llvm-tblgen %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker// XFAIL: vg_leak
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerclass ValueType<int size, int value> {
5*9880d681SAndroid Build Coastguard Worker  int Size = size;
6*9880d681SAndroid Build Coastguard Worker  int Value = value;
7*9880d681SAndroid Build Coastguard Worker}
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdef v2i64  : ValueType<128, 22>;   //  2 x i64 vector value
10*9880d681SAndroid Build Coastguard Workerdef v2f64  : ValueType<128, 28>;   //  2 x f64 vector value
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerclass Intrinsic<string name> {
13*9880d681SAndroid Build Coastguard Worker  string Name = name;
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerclass Pattern<dag patternToMatch, list<dag> resultInstrs> {
17*9880d681SAndroid Build Coastguard Worker  dag             PatternToMatch  = patternToMatch;
18*9880d681SAndroid Build Coastguard Worker  list<dag>       ResultInstrs    = resultInstrs;
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker// Pat - A simple (but common) form of a pattern, which produces a simple result
22*9880d681SAndroid Build Coastguard Worker// not needing a full list.
23*9880d681SAndroid Build Coastguard Workerclass Pat<dag pattern, dag result> : Pattern<pattern, [result]>;
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerclass Inst<bits<8> opcode, dag oopnds, dag iopnds, string asmstr,
26*9880d681SAndroid Build Coastguard Worker           list<dag> pattern> {
27*9880d681SAndroid Build Coastguard Worker  bits<8> Opcode = opcode;
28*9880d681SAndroid Build Coastguard Worker  dag OutOperands = oopnds;
29*9880d681SAndroid Build Coastguard Worker  dag InOperands = iopnds;
30*9880d681SAndroid Build Coastguard Worker  string AssemblyString = asmstr;
31*9880d681SAndroid Build Coastguard Worker  list<dag> Pattern = pattern;
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdef ops;
35*9880d681SAndroid Build Coastguard Workerdef outs;
36*9880d681SAndroid Build Coastguard Workerdef ins;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdef set;
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker// Define registers
41*9880d681SAndroid Build Coastguard Workerclass Register<string n> {
42*9880d681SAndroid Build Coastguard Worker  string Name = n;
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerclass RegisterClass<list<ValueType> regTypes, list<Register> regList> {
46*9880d681SAndroid Build Coastguard Worker  list<ValueType> RegTypes = regTypes;
47*9880d681SAndroid Build Coastguard Worker  list<Register> MemberList = regList;
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdef XMM0: Register<"xmm0">;
51*9880d681SAndroid Build Coastguard Workerdef XMM1: Register<"xmm1">;
52*9880d681SAndroid Build Coastguard Workerdef XMM2: Register<"xmm2">;
53*9880d681SAndroid Build Coastguard Workerdef XMM3: Register<"xmm3">;
54*9880d681SAndroid Build Coastguard Workerdef XMM4: Register<"xmm4">;
55*9880d681SAndroid Build Coastguard Workerdef XMM5: Register<"xmm5">;
56*9880d681SAndroid Build Coastguard Workerdef XMM6: Register<"xmm6">;
57*9880d681SAndroid Build Coastguard Workerdef XMM7: Register<"xmm7">;
58*9880d681SAndroid Build Coastguard Workerdef XMM8:  Register<"xmm8">;
59*9880d681SAndroid Build Coastguard Workerdef XMM9:  Register<"xmm9">;
60*9880d681SAndroid Build Coastguard Workerdef XMM10: Register<"xmm10">;
61*9880d681SAndroid Build Coastguard Workerdef XMM11: Register<"xmm11">;
62*9880d681SAndroid Build Coastguard Workerdef XMM12: Register<"xmm12">;
63*9880d681SAndroid Build Coastguard Workerdef XMM13: Register<"xmm13">;
64*9880d681SAndroid Build Coastguard Workerdef XMM14: Register<"xmm14">;
65*9880d681SAndroid Build Coastguard Workerdef XMM15: Register<"xmm15">;
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdef VR128 : RegisterClass<[v2i64, v2f64],
68*9880d681SAndroid Build Coastguard Worker                          [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
69*9880d681SAndroid Build Coastguard Worker                           XMM8, XMM9, XMM10, XMM11,
70*9880d681SAndroid Build Coastguard Worker                           XMM12, XMM13, XMM14, XMM15]>;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker// Dummy for subst
73*9880d681SAndroid Build Coastguard Workerdef REGCLASS : RegisterClass<[], []>;
74*9880d681SAndroid Build Coastguard Workerdef MNEMONIC;
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerclass decls {
77*9880d681SAndroid Build Coastguard Worker  // Dummy for foreach
78*9880d681SAndroid Build Coastguard Worker  dag pattern;
79*9880d681SAndroid Build Coastguard Worker  int operand;
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdef Decls : decls;
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker// Define intrinsics
85*9880d681SAndroid Build Coastguard Workerdef int_x86_sse2_add_ps : Intrinsic<"addps">;
86*9880d681SAndroid Build Coastguard Workerdef int_x86_sse2_add_pd : Intrinsic<"addpd">;
87*9880d681SAndroid Build Coastguard Workerdef INTRINSIC : Intrinsic<"Dummy">;
88*9880d681SAndroid Build Coastguard Workerdef bitconvert;
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerclass MakePat<list<dag> patterns> : Pat<patterns[0], patterns[1]>;
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerclass Base<bits<8> opcode, dag opnds, dag iopnds, string asmstr, Intrinsic intr,
93*9880d681SAndroid Build Coastguard Worker           list<list<dag>> patterns>
94*9880d681SAndroid Build Coastguard Worker      : Inst<opcode, opnds, iopnds, asmstr,
95*9880d681SAndroid Build Coastguard Worker             !foreach(Decls.pattern, patterns[0],
96*9880d681SAndroid Build Coastguard Worker		      !foreach(Decls.operand, Decls.pattern,
97*9880d681SAndroid Build Coastguard Worker			       !subst(INTRINSIC, intr,
98*9880d681SAndroid Build Coastguard Worker		               !subst(REGCLASS, VR128,
99*9880d681SAndroid Build Coastguard Worker                               !subst(MNEMONIC, set, Decls.operand)))))>,
100*9880d681SAndroid Build Coastguard Worker        MakePat<!foreach(Decls.pattern, patterns[1],
101*9880d681SAndroid Build Coastguard Worker		         !foreach(Decls.operand, Decls.pattern,
102*9880d681SAndroid Build Coastguard Worker			          !subst(INTRINSIC, intr,
103*9880d681SAndroid Build Coastguard Worker				  !subst(REGCLASS, VR128,
104*9880d681SAndroid Build Coastguard Worker                                  !subst(MNEMONIC, set, Decls.operand)))))>;
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workermulticlass arith<bits<8> opcode, string asmstr, string intr, list<list<dag>> patterns> {
107*9880d681SAndroid Build Coastguard Worker  def PS : Base<opcode, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
108*9880d681SAndroid Build Coastguard Worker                 !strconcat(asmstr, "\t$dst, $src1, $src2"), !cast<Intrinsic>(!subst("SUFFIX", "_ps", intr)), patterns>;
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker  def PD : Base<opcode, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
111*9880d681SAndroid Build Coastguard Worker                 !strconcat(asmstr, "\t$dst, $src1, $src2"), !cast<Intrinsic>(!subst("SUFFIX", "_pd", intr)), patterns>;
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefm ADD : arith<0x58, "add", "int_x86_sse2_addSUFFIX",
115*9880d681SAndroid Build Coastguard Worker                  // rr Patterns
116*9880d681SAndroid Build Coastguard Worker                 [[(set REGCLASS:$dst, (INTRINSIC REGCLASS:$src1, REGCLASS:$src2))],
117*9880d681SAndroid Build Coastguard Worker                   [(set REGCLASS:$dst, (bitconvert (INTRINSIC REGCLASS:$src1, REGCLASS:$src2))),
118*9880d681SAndroid Build Coastguard Worker                    (MNEMONIC REGCLASS:$dst, REGCLASS:$src)]]>;
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker// CHECK: [(set VR128:$dst, (int_x86_sse2_add_pd VR128:$src1, VR128:$src2))]
121*9880d681SAndroid Build Coastguard Worker// CHECK: [(set VR128:$dst, (int_x86_sse2_add_ps VR128:$src1, VR128:$src2))]
122