150
|
1 // RUN: llvm-tblgen -gen-dag-isel -I %p/../../include %s 2>&1 | FileCheck -check-prefix=SDAG %s
|
|
2 // RUN: llvm-tblgen -gen-global-isel -optimize-match-table=false -I %p/../../include %s -o - < %s | FileCheck -check-prefix=GISEL %s
|
|
3
|
|
4 include "llvm/Target/Target.td"
|
|
5
|
|
6 def TestTargetInstrInfo : InstrInfo;
|
|
7
|
|
8
|
|
9 def TestTarget : Target {
|
|
10 let InstructionSet = TestTargetInstrInfo;
|
|
11 }
|
|
12
|
|
13 def R0 : Register<"r0"> { let Namespace = "MyTarget"; }
|
|
14 def GPR32 : RegisterClass<"MyTarget", [i32], 32, (add R0)>;
|
|
15
|
|
16
|
|
17 // With one address space
|
|
18 def pat_frag_a : PatFrag <(ops node:$ptr), (load node:$ptr), [{}]> {
|
|
19 let AddressSpaces = [ 999 ];
|
|
20 let IsLoad = 1; // FIXME: Can this be inferred?
|
|
21 let MemoryVT = i32;
|
|
22 let MinAlignment = 2;
|
|
23 }
|
|
24
|
|
25 // With multiple address spaces
|
|
26 def pat_frag_b : PatFrag <(ops node:$ptr), (load node:$ptr), [{}]> {
|
|
27 let AddressSpaces = [ 123, 455 ];
|
|
28 let IsLoad = 1; // FIXME: Can this be inferred?
|
|
29 let MemoryVT = i32;
|
|
30 }
|
|
31
|
|
32 def inst_a : Instruction {
|
|
33 let OutOperandList = (outs GPR32:$dst);
|
|
34 let InOperandList = (ins GPR32:$src);
|
|
35 }
|
|
36
|
|
37 def inst_b : Instruction {
|
|
38 let OutOperandList = (outs GPR32:$dst);
|
|
39 let InOperandList = (ins GPR32:$src);
|
|
40 }
|
|
41
|
|
42 def inst_c : Instruction {
|
|
43 let OutOperandList = (outs);
|
|
44 let InOperandList = (ins GPR32:$src0, GPR32:$src1);
|
|
45 }
|
|
46
|
|
47 def inst_d : Instruction {
|
|
48 let OutOperandList = (outs);
|
|
49 let InOperandList = (ins GPR32:$src0, GPR32:$src1);
|
|
50 }
|
|
51
|
|
52 // SDAG: case 2: {
|
|
53 // SDAG-NEXT: // Predicate_pat_frag_b
|
|
54 // SDAG-NEXT: SDNode *N = Node;
|
|
55 // SDAG-NEXT: (void)N;
|
|
56 // SDAG-NEXT: unsigned AddrSpace = cast<MemSDNode>(N)->getAddressSpace();
|
|
57 // SDAG-NEXT: if (AddrSpace != 123 && AddrSpace != 455)
|
|
58 // SDAG-NEXT: return false;
|
|
59 // SDAG-NEXT: if (cast<MemSDNode>(N)->getMemoryVT() != MVT::i32) return false;
|
|
60 // SDAG-NEXT: return true;
|
|
61
|
|
62
|
|
63 // GISEL: GIM_Try, /*On fail goto*//*Label 0*/ {{[0-9]+}}, // Rule ID 0 //
|
|
64 // GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
|
|
65 // GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_LOAD,
|
|
66 // GISEL-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,
|
|
67 // GISEL-NEXT: GIM_CheckMemoryAddressSpace, /*MI*/0, /*MMO*/0, /*NumAddrSpace*/2, /*AddrSpace*/123, /*AddrSpace*/455,
|
|
68 // GISEL-NEXT: GIM_CheckMemorySizeEqualTo, /*MI*/0, /*MMO*/0, /*Size*/4,
|
|
69 // GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(int64_t)AtomicOrdering::NotAtomic,
|
|
70 def : Pat <
|
|
71 (pat_frag_b GPR32:$src),
|
|
72 (inst_b GPR32:$src)
|
|
73 >;
|
|
74
|
|
75
|
|
76 // SDAG: case 3: {
|
|
77 // SDAG: // Predicate_pat_frag_a
|
|
78 // SDAG-NEXT: SDNode *N = Node;
|
|
79 // SDAG-NEXT: (void)N;
|
|
80 // SDAG-NEXT: unsigned AddrSpace = cast<MemSDNode>(N)->getAddressSpace();
|
|
81
|
|
82 // SDAG-NEXT: if (AddrSpace != 999)
|
|
83 // SDAG-NEXT: return false;
|
173
|
84 // SDAG-NEXT: if (cast<MemSDNode>(N)->getAlign() < Align(2))
|
150
|
85 // SDAG-NEXT: return false;
|
|
86 // SDAG-NEXT: if (cast<MemSDNode>(N)->getMemoryVT() != MVT::i32) return false;
|
|
87 // SDAG-NEXT: return true;
|
|
88
|
|
89 // GISEL: GIM_Try, /*On fail goto*//*Label 1*/ {{[0-9]+}}, // Rule ID 1 //
|
|
90 // GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
|
|
91 // GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_LOAD,
|
|
92 // GISEL-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,
|
|
93 // GISEL-NEXT: GIM_CheckMemoryAddressSpace, /*MI*/0, /*MMO*/0, /*NumAddrSpace*/1, /*AddrSpace*/999,
|
|
94 // GISEL-NEXT: GIM_CheckMemoryAlignment, /*MI*/0, /*MMO*/0, /*MinAlign*/2,
|
|
95 // GISEL-NEXT: GIM_CheckMemorySizeEqualTo, /*MI*/0, /*MMO*/0, /*Size*/4,
|
|
96 // GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(int64_t)AtomicOrdering::NotAtomic,
|
|
97 def : Pat <
|
|
98 (pat_frag_a GPR32:$src),
|
|
99 (inst_a GPR32:$src)
|
|
100 >;
|
|
101
|
|
102
|
|
103 def truncstorei16_addrspace : PatFrag<(ops node:$val, node:$ptr),
|
|
104 (truncstore node:$val, node:$ptr)> {
|
|
105 let IsStore = 1;
|
|
106 let MemoryVT = i16;
|
|
107 let AddressSpaces = [ 123, 455 ];
|
|
108 }
|
|
109
|
|
110 // Test truncstore without a specific MemoryVT
|
|
111 // GISEL: GIM_Try, /*On fail goto*//*Label 2*/ {{[0-9]+}}, // Rule ID 2 //
|
|
112 // GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
|
|
113 // GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_STORE,
|
|
114 // GISEL-NEXT: GIM_CheckMemorySizeLessThanLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,
|
|
115 // GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(int64_t)AtomicOrdering::NotAtomic,
|
|
116 // GISEL-NEXT: // MIs[0] src0
|
|
117 // GISEL-NEXT: GIM_CheckType, /*MI*/0, /*Op*/0, /*Type*/GILLT_s32,
|
|
118 def : Pat <
|
|
119 (truncstore GPR32:$src0, GPR32:$src1),
|
|
120 (inst_c GPR32:$src0, GPR32:$src1)
|
|
121 >;
|
|
122
|
|
123 // Test non-truncstore has a size equal to LLT check.
|
|
124 // GISEL: GIM_Try, /*On fail goto*//*Label 3*/ {{[0-9]+}}, // Rule ID 3 //
|
|
125 // GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
|
|
126 // GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_STORE,
|
|
127 // GISEL-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,
|
|
128 def : Pat <
|
|
129 (store GPR32:$src0, GPR32:$src1),
|
|
130 (inst_d GPR32:$src0, GPR32:$src1)
|
|
131 >;
|
|
132
|
|
133 // Test truncstore with specific MemoryVT
|
|
134 // GISEL: GIM_Try, /*On fail goto*//*Label 4*/ {{[0-9]+}}, // Rule ID 4 //
|
|
135 // GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
|
|
136 // GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_STORE,
|
|
137 // GISEL-NEXT: GIM_CheckMemorySizeLessThanLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,
|
|
138 // GISEL-NEXT: GIM_CheckMemoryAddressSpace, /*MI*/0, /*MMO*/0, /*NumAddrSpace*/2, /*AddrSpace*/123, /*AddrSpace*/455,
|
|
139 // GISEL-NEXT: GIM_CheckMemorySizeEqualTo, /*MI*/0, /*MMO*/0, /*Size*/2,
|
|
140 def : Pat <
|
|
141 (truncstorei16_addrspace GPR32:$src0, GPR32:$src1),
|
|
142 (inst_c GPR32:$src0, GPR32:$src1)
|
|
143 >;
|