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