blob: 534483401638293a269520c4e415341d69ee50ec [file] [log] [blame]
Wei Ding1041a642016-08-24 14:59:47 +00001; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
2
3; GCN-LABEL: {{^}}v_sad_u32_pat1:
4; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
5define void @v_sad_u32_pat1(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
6 %icmp0 = icmp ugt i32 %a, %b
7 %t0 = select i1 %icmp0, i32 %a, i32 %b
8
9 %icmp1 = icmp ule i32 %a, %b
10 %t1 = select i1 %icmp1, i32 %a, i32 %b
11
12 %ret0 = sub i32 %t0, %t1
13 %ret = add i32 %ret0, %c
14
15 store i32 %ret, i32 addrspace(1)* %out
16 ret void
17}
18
19; GCN-LABEL: {{^}}v_sad_u32_constant_pat1:
20; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, 20
21define void @v_sad_u32_constant_pat1(i32 addrspace(1)* %out, i32 %a) {
22 %icmp0 = icmp ugt i32 %a, 90
23 %t0 = select i1 %icmp0, i32 %a, i32 90
24
25 %icmp1 = icmp ule i32 %a, 90
26 %t1 = select i1 %icmp1, i32 %a, i32 90
27
28 %ret0 = sub i32 %t0, %t1
29 %ret = add i32 %ret0, 20
30
31 store i32 %ret, i32 addrspace(1)* %out
32 ret void
33}
34
35; GCN-LABEL: {{^}}v_sad_u32_pat2:
36; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
37define void @v_sad_u32_pat2(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
38 %icmp0 = icmp ugt i32 %a, %b
39 %sub0 = sub i32 %a, %b
40 %sub1 = sub i32 %b, %a
41 %ret0 = select i1 %icmp0, i32 %sub0, i32 %sub1
42
43 %ret = add i32 %ret0, %c
44
45 store i32 %ret, i32 addrspace(1)* %out
46 ret void
47}
48
49; GCN-LABEL: {{^}}v_sad_u32_multi_use_sub_pat1:
50; GCN: s_max_u32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
51; GCN: s_min_u32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
52; GCN: s_sub_i32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
53; GCN: s_add_i32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
54define void @v_sad_u32_multi_use_sub_pat1(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
55 %icmp0 = icmp ugt i32 %a, %b
56 %t0 = select i1 %icmp0, i32 %a, i32 %b
57
58 %icmp1 = icmp ule i32 %a, %b
59 %t1 = select i1 %icmp1, i32 %a, i32 %b
60
61 %ret0 = sub i32 %t0, %t1
62 store volatile i32 %ret0, i32 *undef
63 %ret = add i32 %ret0, %c
64
65 store i32 %ret, i32 addrspace(1)* %out
66 ret void
67}
68
69; GCN-LABEL: {{^}}v_sad_u32_multi_use_add_pat1:
70; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
71define void @v_sad_u32_multi_use_add_pat1(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
72 %icmp0 = icmp ugt i32 %a, %b
73 %t0 = select i1 %icmp0, i32 %a, i32 %b
74
75 %icmp1 = icmp ule i32 %a, %b
76 %t1 = select i1 %icmp1, i32 %a, i32 %b
77
78 %ret0 = sub i32 %t0, %t1
79 %ret = add i32 %ret0, %c
80 store volatile i32 %ret, i32 *undef
81 store i32 %ret, i32 addrspace(1)* %out
82 ret void
83}
84
85; GCN-LABEL: {{^}}v_sad_u32_multi_use_max_pat1:
86; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
87define void @v_sad_u32_multi_use_max_pat1(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
88 %icmp0 = icmp ugt i32 %a, %b
89 %t0 = select i1 %icmp0, i32 %a, i32 %b
90 store volatile i32 %t0, i32 *undef
91
92 %icmp1 = icmp ule i32 %a, %b
93 %t1 = select i1 %icmp1, i32 %a, i32 %b
94
95 %ret0 = sub i32 %t0, %t1
96 %ret = add i32 %ret0, %c
97
98 store i32 %ret, i32 addrspace(1)* %out
99 ret void
100}
101
102; GCN-LABEL: {{^}}v_sad_u32_multi_use_min_pat1:
103; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
104define void @v_sad_u32_multi_use_min_pat1(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
105 %icmp0 = icmp ugt i32 %a, %b
106 %t0 = select i1 %icmp0, i32 %a, i32 %b
107
108 %icmp1 = icmp ule i32 %a, %b
109 %t1 = select i1 %icmp1, i32 %a, i32 %b
110
111 store volatile i32 %t1, i32 *undef
112
113 %ret0 = sub i32 %t0, %t1
114 %ret = add i32 %ret0, %c
115
116 store i32 %ret, i32 addrspace(1)* %out
117 ret void
118}
119
120; GCN-LABEL: {{^}}v_sad_u32_multi_use_sub_pat2:
121; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
122define void @v_sad_u32_multi_use_sub_pat2(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
123 %icmp0 = icmp ugt i32 %a, %b
124 %sub0 = sub i32 %a, %b
125 store volatile i32 %sub0, i32 *undef
126 %sub1 = sub i32 %b, %a
127 %ret0 = select i1 %icmp0, i32 %sub0, i32 %sub1
128
129 %ret = add i32 %ret0, %c
130
131 store i32 %ret, i32 addrspace(1)* %out
132 ret void
133}
134
135; GCN-LABEL: {{^}}v_sad_u32_multi_use_select_pat2:
136; GCN: s_sub_i32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
Konstantin Zhuravlyov0a1a7b62016-11-17 16:41:49 +0000137; GCN: v_cmp_gt_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
138; GCN: s_sub_i32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
Wei Ding1041a642016-08-24 14:59:47 +0000139define void @v_sad_u32_multi_use_select_pat2(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c) {
140 %icmp0 = icmp ugt i32 %a, %b
141 %sub0 = sub i32 %a, %b
142 %sub1 = sub i32 %b, %a
143 %ret0 = select i1 %icmp0, i32 %sub0, i32 %sub1
144 store volatile i32 %ret0, i32 *undef
145
146 %ret = add i32 %ret0, %c
147
148 store i32 %ret, i32 addrspace(1)* %out
149 ret void
150}
151
152; GCN-LABEL: {{^}}v_sad_u32_vector_pat1:
153; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
154; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
155; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
156; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
157define void @v_sad_u32_vector_pat1(<4 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
158 %icmp0 = icmp ugt <4 x i32> %a, %b
159 %t0 = select <4 x i1> %icmp0, <4 x i32> %a, <4 x i32> %b
160
161 %icmp1 = icmp ule <4 x i32> %a, %b
162 %t1 = select <4 x i1> %icmp1, <4 x i32> %a, <4 x i32> %b
163
164 %ret0 = sub <4 x i32> %t0, %t1
165 %ret = add <4 x i32> %ret0, %c
166
167 store <4 x i32> %ret, <4 x i32> addrspace(1)* %out
168 ret void
169}
170
171; GCN-LABEL: {{^}}v_sad_u32_vector_pat2:
172; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
173; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
174; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
175; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
176define void @v_sad_u32_vector_pat2(<4 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
177 %icmp0 = icmp ugt <4 x i32> %a, %b
178 %sub0 = sub <4 x i32> %a, %b
179 %sub1 = sub <4 x i32> %b, %a
180 %ret0 = select <4 x i1> %icmp0, <4 x i32> %sub0, <4 x i32> %sub1
181
182 %ret = add <4 x i32> %ret0, %c
183
184 store <4 x i32> %ret, <4 x i32> addrspace(1)* %out
185 ret void
186}
187
188; GCN-LABEL: {{^}}v_sad_u32_i16_pat1:
189; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
190define void @v_sad_u32_i16_pat1(i16 addrspace(1)* %out, i16 %a, i16 %b, i16 %c) {
191
192 %icmp0 = icmp ugt i16 %a, %b
193 %t0 = select i1 %icmp0, i16 %a, i16 %b
194
195 %icmp1 = icmp ule i16 %a, %b
196 %t1 = select i1 %icmp1, i16 %a, i16 %b
197
198 %ret0 = sub i16 %t0, %t1
199 %ret = add i16 %ret0, %c
200
201 store i16 %ret, i16 addrspace(1)* %out
202 ret void
203}
204
205; GCN-LABEL: {{^}}v_sad_u32_i16_pat2:
206; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
207define void @v_sad_u32_i16_pat2(i16 addrspace(1)* %out, i16 zeroext %a, i16 zeroext %b, i16 zeroext %c) {
208 %icmp0 = icmp ugt i16 %a, %b
209 %sub0 = sub i16 %a, %b
210 %sub1 = sub i16 %b, %a
211 %ret0 = select i1 %icmp0, i16 %sub0, i16 %sub1
212
213 %ret = add i16 %ret0, %c
214
215 store i16 %ret, i16 addrspace(1)* %out
216 ret void
217}
218
219; GCN-LABEL: {{^}}v_sad_u32_i8_pat1:
220; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
221define void @v_sad_u32_i8_pat1(i8 addrspace(1)* %out, i8 %a, i8 %b, i8 %c) {
222 %icmp0 = icmp ugt i8 %a, %b
223 %t0 = select i1 %icmp0, i8 %a, i8 %b
224
225 %icmp1 = icmp ule i8 %a, %b
226 %t1 = select i1 %icmp1, i8 %a, i8 %b
227
228 %ret0 = sub i8 %t0, %t1
229 %ret = add i8 %ret0, %c
230
231 store i8 %ret, i8 addrspace(1)* %out
232 ret void
233}
234
235; GCN-LABEL: {{^}}v_sad_u32_i8_pat2:
236; GCN: v_sad_u32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}}
237define void @v_sad_u32_i8_pat2(i8 addrspace(1)* %out, i8 zeroext %a, i8 zeroext %b, i8 zeroext %c) {
238 %icmp0 = icmp ugt i8 %a, %b
239 %sub0 = sub i8 %a, %b
240 %sub1 = sub i8 %b, %a
241 %ret0 = select i1 %icmp0, i8 %sub0, i8 %sub1
242
243 %ret = add i8 %ret0, %c
244
245 store i8 %ret, i8 addrspace(1)* %out
246 ret void
247}
248
249; GCN-LABEL: {{^}}v_sad_u32_mismatched_operands_pat1:
250; GCN: v_cmp_le_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
251; GCN: s_max_u32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
252; GCN: v_sub_i32_e32 v{{[0-9]+}}, vcc, s{{[0-9]+}}, v{{[0-9]+}}
253; GCN: v_add_i32_e32 v{{[0-9]+}}, vcc, s{{[0-9]+}}, v{{[0-9]+}}
254define void @v_sad_u32_mismatched_operands_pat1(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i32 %d) {
255 %icmp0 = icmp ugt i32 %a, %b
256 %t0 = select i1 %icmp0, i32 %a, i32 %b
257
258 %icmp1 = icmp ule i32 %a, %b
259 %t1 = select i1 %icmp1, i32 %a, i32 %d
260
261 %ret0 = sub i32 %t0, %t1
262 %ret = add i32 %ret0, %c
263
264 store i32 %ret, i32 addrspace(1)* %out
265 ret void
266}
267
268; GCN-LABEL: {{^}}v_sad_u32_mismatched_operands_pat2:
269; GCN: s_sub_i32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
270; GCN: s_sub_i32 s{{[0-9]+}}, s{{[0-9]+}}, s{{[0-9]+}}
271; GCN: v_add_i32_e32 v{{[0-9]+}}, vcc, s{{[0-9]+}}, v{{[0-9]+}}
272define void @v_sad_u32_mismatched_operands_pat2(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i32 %d) {
273 %icmp0 = icmp ugt i32 %a, %b
274 %sub0 = sub i32 %a, %d
275 %sub1 = sub i32 %b, %a
276 %ret0 = select i1 %icmp0, i32 %sub0, i32 %sub1
277
278 %ret = add i32 %ret0, %c
279
280 store i32 %ret, i32 addrspace(1)* %out
281 ret void
282}
283