1; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
2; RUN: llc -march=amdgcn -verify-machineinstrs < %s| FileCheck -check-prefix=GCN -check-prefix=SI %s
3
4;;;==========================================================================;;;
5;; 16-bit integer comparisons
6;;;==========================================================================;;;
7
8; GCN-LABEL: {{^}}i16_eq:
9; VI: v_cmp_eq_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
10; SI: v_cmp_eq_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
11define amdgpu_kernel void @i16_eq(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
12entry:
13  %tid = call i32 @llvm.amdgcn.workitem.id.x()
14  %tid.ext = sext i32 %tid to i64
15  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
16  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
17  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
18  %a = load i16, i16 addrspace(1)* %a.gep
19  %b = load i16, i16 addrspace(1)* %b.gep
20  %tmp0 = icmp eq i16 %a, %b
21  %tmp1 = sext i1 %tmp0 to i32
22  store i32 %tmp1, i32 addrspace(1)* %out.gep
23  ret void
24}
25
26; GCN-LABEL: {{^}}i16_ne:
27; VI: v_cmp_ne_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
28; SI: v_cmp_ne_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
29define amdgpu_kernel void @i16_ne(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
30entry:
31  %tid = call i32 @llvm.amdgcn.workitem.id.x()
32  %tid.ext = sext i32 %tid to i64
33  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
34  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
35  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
36  %a = load i16, i16 addrspace(1)* %a.gep
37  %b = load i16, i16 addrspace(1)* %b.gep
38  %tmp0 = icmp ne i16 %a, %b
39  %tmp1 = sext i1 %tmp0 to i32
40  store i32 %tmp1, i32 addrspace(1)* %out.gep
41  ret void
42}
43
44; GCN-LABEL: {{^}}i16_ugt:
45; VI: v_cmp_gt_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
46; SI: v_cmp_gt_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
47define amdgpu_kernel void @i16_ugt(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
48entry:
49  %tid = call i32 @llvm.amdgcn.workitem.id.x()
50  %tid.ext = sext i32 %tid to i64
51  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
52  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
53  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
54  %a = load i16, i16 addrspace(1)* %a.gep
55  %b = load i16, i16 addrspace(1)* %b.gep
56  %tmp0 = icmp ugt i16 %a, %b
57  %tmp1 = sext i1 %tmp0 to i32
58  store i32 %tmp1, i32 addrspace(1)* %out.gep
59  ret void
60}
61
62; GCN-LABEL: {{^}}i16_uge:
63; VI: v_cmp_ge_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
64; SI: v_cmp_ge_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
65define amdgpu_kernel void @i16_uge(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
66entry:
67  %tid = call i32 @llvm.amdgcn.workitem.id.x()
68  %tid.ext = sext i32 %tid to i64
69  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
70  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
71  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
72  %a = load i16, i16 addrspace(1)* %a.gep
73  %b = load i16, i16 addrspace(1)* %b.gep
74  %tmp0 = icmp uge i16 %a, %b
75  %tmp1 = sext i1 %tmp0 to i32
76  store i32 %tmp1, i32 addrspace(1)* %out.gep
77  ret void
78}
79
80; GCN-LABEL: {{^}}i16_ult:
81; VI: v_cmp_lt_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
82; SI: v_cmp_lt_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
83define amdgpu_kernel void @i16_ult(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
84entry:
85  %tid = call i32 @llvm.amdgcn.workitem.id.x()
86  %tid.ext = sext i32 %tid to i64
87  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
88  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
89  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
90  %a = load i16, i16 addrspace(1)* %a.gep
91  %b = load i16, i16 addrspace(1)* %b.gep
92  %tmp0 = icmp ult i16 %a, %b
93  %tmp1 = sext i1 %tmp0 to i32
94  store i32 %tmp1, i32 addrspace(1)* %out.gep
95  ret void
96}
97
98; GCN-LABEL: {{^}}i16_ule:
99; VI: v_cmp_le_u16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
100; SI: v_cmp_le_u32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
101define amdgpu_kernel void @i16_ule(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
102entry:
103  %tid = call i32 @llvm.amdgcn.workitem.id.x()
104  %tid.ext = sext i32 %tid to i64
105  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
106  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
107  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
108  %a = load i16, i16 addrspace(1)* %a.gep
109  %b = load i16, i16 addrspace(1)* %b.gep
110  %tmp0 = icmp ule i16 %a, %b
111  %tmp1 = sext i1 %tmp0 to i32
112  store i32 %tmp1, i32 addrspace(1)* %out.gep
113  ret void
114
115}
116
117; GCN-LABEL: {{^}}i16_sgt:
118; VI: v_cmp_gt_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
119; SI: v_cmp_gt_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
120define amdgpu_kernel void @i16_sgt(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
121entry:
122  %tid = call i32 @llvm.amdgcn.workitem.id.x()
123  %tid.ext = sext i32 %tid to i64
124  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
125  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
126  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
127  %a = load i16, i16 addrspace(1)* %a.gep
128  %b = load i16, i16 addrspace(1)* %b.gep
129  %tmp0 = icmp sgt i16 %a, %b
130  %tmp1 = sext i1 %tmp0 to i32
131  store i32 %tmp1, i32 addrspace(1)* %out.gep
132  ret void
133}
134
135; GCN-LABEL: {{^}}i16_sge:
136; VI: v_cmp_ge_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
137; SI: v_cmp_ge_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
138define amdgpu_kernel void @i16_sge(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
139entry:
140  %tid = call i32 @llvm.amdgcn.workitem.id.x()
141  %tid.ext = sext i32 %tid to i64
142  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
143  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
144  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
145  %a = load i16, i16 addrspace(1)* %a.gep
146  %b = load i16, i16 addrspace(1)* %b.gep
147  %tmp0 = icmp sge i16 %a, %b
148  %tmp1 = sext i1 %tmp0 to i32
149  store i32 %tmp1, i32 addrspace(1)* %out.gep
150  ret void
151}
152
153; GCN-LABEL: {{^}}i16_slt:
154; VI: v_cmp_lt_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
155; SI: v_cmp_lt_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
156define amdgpu_kernel void @i16_slt(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
157entry:
158  %tid = call i32 @llvm.amdgcn.workitem.id.x()
159  %tid.ext = sext i32 %tid to i64
160  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
161  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
162  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
163  %a = load i16, i16 addrspace(1)* %a.gep
164  %b = load i16, i16 addrspace(1)* %b.gep
165  %tmp0 = icmp slt i16 %a, %b
166  %tmp1 = sext i1 %tmp0 to i32
167  store i32 %tmp1, i32 addrspace(1)* %out.gep
168  ret void
169}
170
171; GCN-LABEL: {{^}}i16_sle:
172; VI: v_cmp_le_i16_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
173; SI: v_cmp_le_i32_e32 vcc, v{{[0-9]+}}, v{{[0-9]+}}
174define amdgpu_kernel void @i16_sle(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 addrspace(1)* %b.ptr) #0 {
175entry:
176  %tid = call i32 @llvm.amdgcn.workitem.id.x()
177  %tid.ext = sext i32 %tid to i64
178  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
179  %b.gep = getelementptr inbounds i16, i16 addrspace(1)* %b.ptr, i64 %tid.ext
180  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
181  %a = load i16, i16 addrspace(1)* %a.gep
182  %b = load i16, i16 addrspace(1)* %b.gep
183  %tmp0 = icmp sle i16 %a, %b
184  %tmp1 = sext i1 %tmp0 to i32
185  store i32 %tmp1, i32 addrspace(1)* %out.gep
186  ret void
187}
188
189; These should be commuted to reduce code size
190; GCN-LABEL: {{^}}i16_eq_v_s:
191; VI: v_cmp_eq_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
192; SI: v_cmp_eq_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
193define amdgpu_kernel void @i16_eq_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
194entry:
195  %tid = call i32 @llvm.amdgcn.workitem.id.x()
196  %tid.ext = sext i32 %tid to i64
197  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
198  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
199  %a = load i16, i16 addrspace(1)* %a.gep
200  %tmp0 = icmp eq i16 %a, %b
201  %tmp1 = sext i1 %tmp0 to i32
202  store i32 %tmp1, i32 addrspace(1)* %out.gep
203  ret void
204}
205
206; GCN-LABEL: {{^}}i16_ne_v_s:
207; VI: v_cmp_ne_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
208; SI: v_cmp_ne_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
209define amdgpu_kernel void @i16_ne_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
210entry:
211  %tid = call i32 @llvm.amdgcn.workitem.id.x()
212  %tid.ext = sext i32 %tid to i64
213  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
214  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
215  %a = load i16, i16 addrspace(1)* %a.gep
216  %tmp0 = icmp ne i16 %a, %b
217  %tmp1 = sext i1 %tmp0 to i32
218  store i32 %tmp1, i32 addrspace(1)* %out.gep
219  ret void
220}
221
222; GCN-LABEL: {{^}}i16_ugt_v_s:
223; VI: v_cmp_lt_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
224; SI: v_cmp_lt_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
225define amdgpu_kernel void @i16_ugt_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
226entry:
227  %tid = call i32 @llvm.amdgcn.workitem.id.x()
228  %tid.ext = sext i32 %tid to i64
229  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
230  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
231  %a = load i16, i16 addrspace(1)* %a.gep
232  %tmp0 = icmp ugt i16 %a, %b
233  %tmp1 = sext i1 %tmp0 to i32
234  store i32 %tmp1, i32 addrspace(1)* %out.gep
235  ret void
236}
237
238; GCN-LABEL: {{^}}i16_uge_v_s:
239; VI: v_cmp_le_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
240; SI: v_cmp_le_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
241define amdgpu_kernel void @i16_uge_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
242entry:
243  %tid = call i32 @llvm.amdgcn.workitem.id.x()
244  %tid.ext = sext i32 %tid to i64
245  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
246  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
247  %a = load i16, i16 addrspace(1)* %a.gep
248  %tmp0 = icmp uge i16 %a, %b
249  %tmp1 = sext i1 %tmp0 to i32
250  store i32 %tmp1, i32 addrspace(1)* %out.gep
251  ret void
252}
253
254; GCN-LABEL: {{^}}i16_ult_v_s:
255; VI: v_cmp_gt_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
256; SI: v_cmp_gt_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
257define amdgpu_kernel void @i16_ult_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
258entry:
259  %tid = call i32 @llvm.amdgcn.workitem.id.x()
260  %tid.ext = sext i32 %tid to i64
261  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
262  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
263  %a = load i16, i16 addrspace(1)* %a.gep
264  %tmp0 = icmp ult i16 %a, %b
265  %tmp1 = sext i1 %tmp0 to i32
266  store i32 %tmp1, i32 addrspace(1)* %out.gep
267  ret void
268}
269
270; GCN-LABEL: {{^}}i16_ule_v_s:
271; VI: v_cmp_ge_u16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
272; SI: v_cmp_ge_u32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
273define amdgpu_kernel void @i16_ule_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
274entry:
275  %tid = call i32 @llvm.amdgcn.workitem.id.x()
276  %tid.ext = sext i32 %tid to i64
277  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
278  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
279  %a = load i16, i16 addrspace(1)* %a.gep
280  %tmp0 = icmp ule i16 %a, %b
281  %tmp1 = sext i1 %tmp0 to i32
282  store i32 %tmp1, i32 addrspace(1)* %out.gep
283  ret void
284}
285
286; GCN-LABEL: {{^}}i16_sgt_v_s:
287; VI: v_cmp_lt_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
288; SI: v_cmp_lt_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
289define amdgpu_kernel void @i16_sgt_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
290entry:
291  %tid = call i32 @llvm.amdgcn.workitem.id.x()
292  %tid.ext = sext i32 %tid to i64
293  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
294  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
295  %a = load i16, i16 addrspace(1)* %a.gep
296  %tmp0 = icmp sgt i16 %a, %b
297  %tmp1 = sext i1 %tmp0 to i32
298  store i32 %tmp1, i32 addrspace(1)* %out.gep
299  ret void
300}
301
302; GCN-LABEL: {{^}}i16_sge_v_s:
303; VI: v_cmp_le_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
304; SI: v_cmp_le_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
305define amdgpu_kernel void @i16_sge_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
306entry:
307  %tid = call i32 @llvm.amdgcn.workitem.id.x()
308  %tid.ext = sext i32 %tid to i64
309  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
310  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
311  %a = load i16, i16 addrspace(1)* %a.gep
312  %tmp0 = icmp sge i16 %a, %b
313  %tmp1 = sext i1 %tmp0 to i32
314  store i32 %tmp1, i32 addrspace(1)* %out.gep
315  ret void
316}
317
318; GCN-LABEL: {{^}}i16_slt_v_s:
319; VI: v_cmp_gt_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
320; SI: v_cmp_gt_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
321define amdgpu_kernel void @i16_slt_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
322entry:
323  %tid = call i32 @llvm.amdgcn.workitem.id.x()
324  %tid.ext = sext i32 %tid to i64
325  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
326  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
327  %a = load i16, i16 addrspace(1)* %a.gep
328  %tmp0 = icmp slt i16 %a, %b
329  %tmp1 = sext i1 %tmp0 to i32
330  store i32 %tmp1, i32 addrspace(1)* %out.gep
331  ret void
332}
333
334; GCN-LABEL: {{^}}i16_sle_v_s:
335; VI: v_cmp_ge_i16_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
336; SI: v_cmp_ge_i32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}}
337define amdgpu_kernel void @i16_sle_v_s(i32 addrspace(1)* %out, i16 addrspace(1)* %a.ptr, i16 %b) #0 {
338entry:
339  %tid = call i32 @llvm.amdgcn.workitem.id.x()
340  %tid.ext = sext i32 %tid to i64
341  %a.gep = getelementptr inbounds i16, i16 addrspace(1)* %a.ptr, i64 %tid.ext
342  %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %tid.ext
343  %a = load i16, i16 addrspace(1)* %a.gep
344  %tmp0 = icmp sle i16 %a, %b
345  %tmp1 = sext i1 %tmp0 to i32
346  store i32 %tmp1, i32 addrspace(1)* %out.gep
347  ret void
348}
349
350declare i32 @llvm.amdgcn.workitem.id.x() #1
351
352attributes #0 = { nounwind }
353attributes #1 = { nounwind readnone }
354