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 f32 : ValueType<32, 1>; // 2 x i64 vector value 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerclass Intrinsic<string name> { 12*9880d681SAndroid Build Coastguard Worker string Name = name; 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerclass Inst<bits<8> opcode, dag oopnds, dag iopnds, string asmstr, 16*9880d681SAndroid Build Coastguard Worker list<dag> pattern> { 17*9880d681SAndroid Build Coastguard Worker bits<8> Opcode = opcode; 18*9880d681SAndroid Build Coastguard Worker dag OutOperands = oopnds; 19*9880d681SAndroid Build Coastguard Worker dag InOperands = iopnds; 20*9880d681SAndroid Build Coastguard Worker string AssemblyString = asmstr; 21*9880d681SAndroid Build Coastguard Worker list<dag> Pattern = pattern; 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdef ops; 25*9880d681SAndroid Build Coastguard Workerdef outs; 26*9880d681SAndroid Build Coastguard Workerdef ins; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdef set; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker// Define registers 31*9880d681SAndroid Build Coastguard Workerclass Register<string n> { 32*9880d681SAndroid Build Coastguard Worker string Name = n; 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerclass RegisterClass<list<ValueType> regTypes, list<Register> regList> { 36*9880d681SAndroid Build Coastguard Worker list<ValueType> RegTypes = regTypes; 37*9880d681SAndroid Build Coastguard Worker list<Register> MemberList = regList; 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdef XMM0: Register<"xmm0">; 41*9880d681SAndroid Build Coastguard Workerdef XMM1: Register<"xmm1">; 42*9880d681SAndroid Build Coastguard Workerdef XMM2: Register<"xmm2">; 43*9880d681SAndroid Build Coastguard Workerdef XMM3: Register<"xmm3">; 44*9880d681SAndroid Build Coastguard Workerdef XMM4: Register<"xmm4">; 45*9880d681SAndroid Build Coastguard Workerdef XMM5: Register<"xmm5">; 46*9880d681SAndroid Build Coastguard Workerdef XMM6: Register<"xmm6">; 47*9880d681SAndroid Build Coastguard Workerdef XMM7: Register<"xmm7">; 48*9880d681SAndroid Build Coastguard Workerdef XMM8: Register<"xmm8">; 49*9880d681SAndroid Build Coastguard Workerdef XMM9: Register<"xmm9">; 50*9880d681SAndroid Build Coastguard Workerdef XMM10: Register<"xmm10">; 51*9880d681SAndroid Build Coastguard Workerdef XMM11: Register<"xmm11">; 52*9880d681SAndroid Build Coastguard Workerdef XMM12: Register<"xmm12">; 53*9880d681SAndroid Build Coastguard Workerdef XMM13: Register<"xmm13">; 54*9880d681SAndroid Build Coastguard Workerdef XMM14: Register<"xmm14">; 55*9880d681SAndroid Build Coastguard Workerdef XMM15: Register<"xmm15">; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdef FR32 : RegisterClass<[f32], 58*9880d681SAndroid Build Coastguard Worker [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, 59*9880d681SAndroid Build Coastguard Worker XMM8, XMM9, XMM10, XMM11, 60*9880d681SAndroid Build Coastguard Worker XMM12, XMM13, XMM14, XMM15]>; 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerclass SDNode {} 63*9880d681SAndroid Build Coastguard Workerdef not : SDNode; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workermulticlass scalar<bits<8> opcode, string asmstr = "", list<list<dag>> patterns = []> { 66*9880d681SAndroid Build Coastguard Worker def SSrr : Inst<opcode, (outs FR32:$dst), (ins FR32:$src), 67*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t$dst, $src"), 68*9880d681SAndroid Build Coastguard Worker !if(!empty(patterns),[]<dag>,patterns[0])>; 69*9880d681SAndroid Build Coastguard Worker def SSrm : Inst<opcode, (outs FR32:$dst), (ins FR32:$src), 70*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t$dst, $src"), 71*9880d681SAndroid Build Coastguard Worker !if(!empty(patterns),[]<dag>,!if(!empty(!tail(patterns)),patterns[0],patterns[1]))>; 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workermulticlass vscalar<bits<8> opcode, string asmstr = "", list<list<dag>> patterns = []> { 75*9880d681SAndroid Build Coastguard Worker def V#NAME#SSrr : Inst<opcode, (outs FR32:$dst), (ins FR32:$src), 76*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t$dst, $src"), 77*9880d681SAndroid Build Coastguard Worker !if(!empty(patterns),[]<dag>,patterns[0])>; 78*9880d681SAndroid Build Coastguard Worker def V#NAME#SSrm : Inst<opcode, (outs FR32:$dst), (ins FR32:$src), 79*9880d681SAndroid Build Coastguard Worker !strconcat(asmstr, "\t$dst, $src"), 80*9880d681SAndroid Build Coastguard Worker !if(!empty(patterns),[]<dag>,!if(!empty(!tail(patterns)),patterns[0],patterns[1]))>; 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workermulticlass myscalar<bits<8> opcode, string asmstr = "", list<list<dag>> patterns = []> : 84*9880d681SAndroid Build Coastguard Worker scalar<opcode, asmstr, patterns>, 85*9880d681SAndroid Build Coastguard Worker vscalar<opcode, asmstr, patterns>; 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefm NOT : myscalar<0x10, "not", [[], [(set FR32:$dst, (f32 (not FR32:$src)))]]>; 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker// CHECK: Pattern = [(set FR32:$dst, (f32 (not FR32:$src)))]; 90*9880d681SAndroid Build Coastguard Worker// CHECK: Pattern = []; 91*9880d681SAndroid Build Coastguard Worker// CHECK: Pattern = [(set FR32:$dst, (f32 (not FR32:$src)))]; 92*9880d681SAndroid Build Coastguard Worker// CHECK: Pattern = []; 93