1; RUN: llc -march=amdgcn -verify-machineinstrs < %s| FileCheck -check-prefix=GCN -check-prefix=SI %s
2; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
3
4; XXX: Merge this into setcc, once R600 supports 64-bit operations
5
6;;;==========================================================================;;;
7;; Double comparisons
8;;;==========================================================================;;;
9
10; GCN-LABEL: {{^}}f64_oeq:
11; GCN: v_cmp_eq_f64
12define amdgpu_kernel void @f64_oeq(i32 addrspace(1)* %out, double %a, double %b) #0 {
13entry:
14  %tmp0 = fcmp oeq double %a, %b
15  %tmp1 = sext i1 %tmp0 to i32
16  store i32 %tmp1, i32 addrspace(1)* %out
17  ret void
18}
19
20; GCN-LABEL: {{^}}f64_ogt:
21; GCN: v_cmp_gt_f64
22define amdgpu_kernel void @f64_ogt(i32 addrspace(1)* %out, double %a, double %b) #0 {
23entry:
24  %tmp0 = fcmp ogt double %a, %b
25  %tmp1 = sext i1 %tmp0 to i32
26  store i32 %tmp1, i32 addrspace(1)* %out
27  ret void
28}
29
30; GCN-LABEL: {{^}}f64_oge:
31; GCN: v_cmp_ge_f64
32define amdgpu_kernel void @f64_oge(i32 addrspace(1)* %out, double %a, double %b) #0 {
33entry:
34  %tmp0 = fcmp oge double %a, %b
35  %tmp1 = sext i1 %tmp0 to i32
36  store i32 %tmp1, i32 addrspace(1)* %out
37  ret void
38}
39
40; GCN-LABEL: {{^}}f64_olt:
41; GCN: v_cmp_lt_f64
42define amdgpu_kernel void @f64_olt(i32 addrspace(1)* %out, double %a, double %b) #0 {
43entry:
44  %tmp0 = fcmp olt double %a, %b
45  %tmp1 = sext i1 %tmp0 to i32
46  store i32 %tmp1, i32 addrspace(1)* %out
47  ret void
48}
49
50; GCN-LABEL: {{^}}f64_ole:
51; GCN: v_cmp_le_f64
52define amdgpu_kernel void @f64_ole(i32 addrspace(1)* %out, double %a, double %b) #0 {
53entry:
54  %tmp0 = fcmp ole double %a, %b
55  %tmp1 = sext i1 %tmp0 to i32
56  store i32 %tmp1, i32 addrspace(1)* %out
57  ret void
58}
59
60; GCN-LABEL: {{^}}f64_one:
61; GCN: v_cmp_lg_f64_e32 vcc
62; GCN: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
63define amdgpu_kernel void @f64_one(i32 addrspace(1)* %out, double %a, double %b) #0 {
64entry:
65  %tmp0 = fcmp one double %a, %b
66  %tmp1 = sext i1 %tmp0 to i32
67  store i32 %tmp1, i32 addrspace(1)* %out
68  ret void
69}
70
71; GCN-LABEL: {{^}}f64_ord:
72; GCN: v_cmp_o_f64
73define amdgpu_kernel void @f64_ord(i32 addrspace(1)* %out, double %a, double %b) #0 {
74entry:
75  %tmp0 = fcmp ord double %a, %b
76  %tmp1 = sext i1 %tmp0 to i32
77  store i32 %tmp1, i32 addrspace(1)* %out
78  ret void
79}
80
81; GCN-LABEL: {{^}}f64_ueq:
82; GCN: v_cmp_nlg_f64_e32 vcc
83; GCN: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
84define amdgpu_kernel void @f64_ueq(i32 addrspace(1)* %out, double %a, double %b) #0 {
85entry:
86  %tmp0 = fcmp ueq double %a, %b
87  %tmp1 = sext i1 %tmp0 to i32
88  store i32 %tmp1, i32 addrspace(1)* %out
89  ret void
90}
91
92; GCN-LABEL: {{^}}f64_ugt:
93
94; GCN: v_cmp_nle_f64_e32 vcc
95; GCN: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
96define amdgpu_kernel void @f64_ugt(i32 addrspace(1)* %out, double %a, double %b) #0 {
97entry:
98  %tmp0 = fcmp ugt double %a, %b
99  %tmp1 = sext i1 %tmp0 to i32
100  store i32 %tmp1, i32 addrspace(1)* %out
101  ret void
102}
103
104; GCN-LABEL: {{^}}f64_uge:
105; GCN: v_cmp_nlt_f64_e32 vcc
106; GCN: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
107define amdgpu_kernel void @f64_uge(i32 addrspace(1)* %out, double %a, double %b) #0 {
108entry:
109  %tmp0 = fcmp uge double %a, %b
110  %tmp1 = sext i1 %tmp0 to i32
111  store i32 %tmp1, i32 addrspace(1)* %out
112  ret void
113}
114
115; GCN-LABEL: {{^}}f64_ult:
116; GCN: v_cmp_nge_f64_e32 vcc
117; GCN: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
118define amdgpu_kernel void @f64_ult(i32 addrspace(1)* %out, double %a, double %b) #0 {
119entry:
120  %tmp0 = fcmp ult double %a, %b
121  %tmp1 = sext i1 %tmp0 to i32
122  store i32 %tmp1, i32 addrspace(1)* %out
123  ret void
124}
125
126; GCN-LABEL: {{^}}f64_ule:
127; GCN: v_cmp_ngt_f64_e32 vcc
128; GCN: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
129define amdgpu_kernel void @f64_ule(i32 addrspace(1)* %out, double %a, double %b) #0 {
130entry:
131  %tmp0 = fcmp ule double %a, %b
132  %tmp1 = sext i1 %tmp0 to i32
133  store i32 %tmp1, i32 addrspace(1)* %out
134  ret void
135}
136
137; GCN-LABEL: {{^}}f64_une:
138; GCN: v_cmp_neq_f64
139define amdgpu_kernel void @f64_une(i32 addrspace(1)* %out, double %a, double %b) #0 {
140entry:
141  %tmp0 = fcmp une double %a, %b
142  %tmp1 = sext i1 %tmp0 to i32
143  store i32 %tmp1, i32 addrspace(1)* %out
144  ret void
145}
146
147; GCN-LABEL: {{^}}f64_uno:
148; GCN: v_cmp_u_f64
149define amdgpu_kernel void @f64_uno(i32 addrspace(1)* %out, double %a, double %b) #0 {
150entry:
151  %tmp0 = fcmp uno double %a, %b
152  %tmp1 = sext i1 %tmp0 to i32
153  store i32 %tmp1, i32 addrspace(1)* %out
154  ret void
155}
156
157;;;==========================================================================;;;
158;; 64-bit integer comparisons
159;;;==========================================================================;;;
160
161; GCN-LABEL: {{^}}i64_eq:
162; GCN: v_cmp_eq_u64
163define amdgpu_kernel void @i64_eq(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
164entry:
165  %tmp0 = icmp eq i64 %a, %b
166  %tmp1 = sext i1 %tmp0 to i32
167  store i32 %tmp1, i32 addrspace(1)* %out
168  ret void
169}
170
171; GCN-LABEL: {{^}}i64_ne:
172; GCN: v_cmp_ne_u64
173define amdgpu_kernel void @i64_ne(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
174entry:
175  %tmp0 = icmp ne i64 %a, %b
176  %tmp1 = sext i1 %tmp0 to i32
177  store i32 %tmp1, i32 addrspace(1)* %out
178  ret void
179}
180
181; GCN-LABEL: {{^}}i64_ugt:
182; GCN: v_cmp_gt_u64
183define amdgpu_kernel void @i64_ugt(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
184entry:
185  %tmp0 = icmp ugt i64 %a, %b
186  %tmp1 = sext i1 %tmp0 to i32
187  store i32 %tmp1, i32 addrspace(1)* %out
188  ret void
189}
190
191; GCN-LABEL: {{^}}i64_uge:
192; GCN: v_cmp_ge_u64
193define amdgpu_kernel void @i64_uge(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
194entry:
195  %tmp0 = icmp uge i64 %a, %b
196  %tmp1 = sext i1 %tmp0 to i32
197  store i32 %tmp1, i32 addrspace(1)* %out
198  ret void
199}
200
201; GCN-LABEL: {{^}}i64_ult:
202; GCN: v_cmp_lt_u64
203define amdgpu_kernel void @i64_ult(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
204entry:
205  %tmp0 = icmp ult i64 %a, %b
206  %tmp1 = sext i1 %tmp0 to i32
207  store i32 %tmp1, i32 addrspace(1)* %out
208  ret void
209}
210
211; GCN-LABEL: {{^}}i64_ule:
212; GCN: v_cmp_le_u64
213define amdgpu_kernel void @i64_ule(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
214entry:
215  %tmp0 = icmp ule i64 %a, %b
216  %tmp1 = sext i1 %tmp0 to i32
217  store i32 %tmp1, i32 addrspace(1)* %out
218  ret void
219}
220
221; GCN-LABEL: {{^}}i64_sgt:
222; GCN: v_cmp_gt_i64
223define amdgpu_kernel void @i64_sgt(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
224entry:
225  %tmp0 = icmp sgt i64 %a, %b
226  %tmp1 = sext i1 %tmp0 to i32
227  store i32 %tmp1, i32 addrspace(1)* %out
228  ret void
229}
230
231; GCN-LABEL: {{^}}i64_sge:
232; GCN: v_cmp_ge_i64
233define amdgpu_kernel void @i64_sge(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
234entry:
235  %tmp0 = icmp sge i64 %a, %b
236  %tmp1 = sext i1 %tmp0 to i32
237  store i32 %tmp1, i32 addrspace(1)* %out
238  ret void
239}
240
241; GCN-LABEL: {{^}}i64_slt:
242; GCN: v_cmp_lt_i64
243define amdgpu_kernel void @i64_slt(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
244entry:
245  %tmp0 = icmp slt i64 %a, %b
246  %tmp1 = sext i1 %tmp0 to i32
247  store i32 %tmp1, i32 addrspace(1)* %out
248  ret void
249}
250
251; GCN-LABEL: {{^}}i64_sle:
252; GCN: v_cmp_le_i64
253define amdgpu_kernel void @i64_sle(i32 addrspace(1)* %out, i64 %a, i64 %b) #0 {
254entry:
255  %tmp0 = icmp sle i64 %a, %b
256  %tmp1 = sext i1 %tmp0 to i32
257  store i32 %tmp1, i32 addrspace(1)* %out
258  ret void
259}
260
261attributes #0 = { nounwind }
262