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