blob: d802bcb8f8144b8c0de0ffaf6741a2b5e28f051b [file] [log] [blame]
Matt Arsenaulte261b6e2014-07-20 06:11:02 +00001; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Matt Arsenault22b4c252014-12-21 16:48:42 +00002; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
Matt Arsenaulte261b6e2014-07-20 06:11:02 +00003
Matt Arsenault22b4c252014-12-21 16:48:42 +00004; FUNC-LABEL: {{^}}sext_bool_icmp_eq_0:
5; SI-NOT: v_cmp
6; SI: v_cmp_ne_i32_e32 vcc,
7; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
8; SI-NEXT:buffer_store_byte [[RESULT]]
9; SI-NEXT: s_endpgm
10
11; EG: SETNE_INT * [[CMP:T[0-9]+]].[[CMPCHAN:[XYZW]]], KC0[2].Z, KC0[2].W
12; EG: AND_INT T{{[0-9]+.[XYZW]}}, PS, 1
13define void @sext_bool_icmp_eq_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
14 %icmp0 = icmp eq i32 %a, %b
15 %ext = sext i1 %icmp0 to i32
16 %icmp1 = icmp eq i32 %ext, 0
17 store i1 %icmp1, i1 addrspace(1)* %out
18 ret void
19}
20
21; FUNC-LABEL: {{^}}sext_bool_icmp_ne_0:
22; SI-NOT: v_cmp
23; SI: v_cmp_ne_i32_e32 vcc,
24; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
25; SI-NEXT: buffer_store_byte [[RESULT]]
26; SI-NEXT: s_endpgm
27
28; EG: SETNE_INT * [[CMP:T[0-9]+]].[[CMPCHAN:[XYZW]]], KC0[2].Z, KC0[2].W
29; EG: AND_INT T{{[0-9]+.[XYZW]}}, PS, 1
30define void @sext_bool_icmp_ne_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
Matt Arsenaulte261b6e2014-07-20 06:11:02 +000031 %icmp0 = icmp ne i32 %a, %b
32 %ext = sext i1 %icmp0 to i32
33 %icmp1 = icmp ne i32 %ext, 0
34 store i1 %icmp1, i1 addrspace(1)* %out
35 ret void
36}
Matt Arsenault22b4c252014-12-21 16:48:42 +000037
38; This really folds away to false
39; FUNC-LABEL: {{^}}sext_bool_icmp_eq_1:
40; SI: v_cmp_eq_i32_e32 vcc,
41; SI-NEXT: v_cndmask_b32_e64 [[TMP:v[0-9]+]], 0, -1, vcc
42; SI-NEXT: v_cmp_eq_i32_e64 {{s\[[0-9]+:[0-9]+\]}}, [[TMP]], 1{{$}}
43; SI-NEXT: v_cndmask_b32_e64 [[TMP:v[0-9]+]], 0, 1,
44; SI-NEXT: buffer_store_byte [[TMP]]
45; SI-NEXT: s_endpgm
46define void @sext_bool_icmp_eq_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
47 %icmp0 = icmp eq i32 %a, %b
48 %ext = sext i1 %icmp0 to i32
49 %icmp1 = icmp eq i32 %ext, 1
50 store i1 %icmp1, i1 addrspace(1)* %out
51 ret void
52}
53
54; This really folds away to true
55; FUNC-LABEL: {{^}}sext_bool_icmp_ne_1:
56; SI: v_cmp_ne_i32_e32 vcc,
57; SI-NEXT: v_cndmask_b32_e64 [[TMP:v[0-9]+]], 0, -1, vcc
58; SI-NEXT: v_cmp_ne_i32_e64 {{s\[[0-9]+:[0-9]+\]}}, [[TMP]], 1{{$}}
59; SI-NEXT: v_cndmask_b32_e64 [[TMP:v[0-9]+]], 0, 1,
60; SI-NEXT: buffer_store_byte [[TMP]]
61; SI-NEXT: s_endpgm
62define void @sext_bool_icmp_ne_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
63 %icmp0 = icmp ne i32 %a, %b
64 %ext = sext i1 %icmp0 to i32
65 %icmp1 = icmp ne i32 %ext, 1
66 store i1 %icmp1, i1 addrspace(1)* %out
67 ret void
68}
69
70; FUNC-LABEL: {{^}}zext_bool_icmp_eq_0:
71; SI-NOT: v_cmp
72; SI: v_cmp_ne_i32_e32 vcc,
73; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
74; SI-NEXT: buffer_store_byte [[RESULT]]
75; SI-NEXT: s_endpgm
76define void @zext_bool_icmp_eq_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
77 %icmp0 = icmp eq i32 %a, %b
78 %ext = zext i1 %icmp0 to i32
79 %icmp1 = icmp eq i32 %ext, 0
80 store i1 %icmp1, i1 addrspace(1)* %out
81 ret void
82}
83
84; FUNC-LABEL: {{^}}zext_bool_icmp_ne_0:
85; SI-NOT: v_cmp
86; SI: v_cmp_ne_i32_e32 vcc,
87; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
88; SI-NEXT: buffer_store_byte [[RESULT]]
89; SI-NEXT: s_endpgm
90define void @zext_bool_icmp_ne_0(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
91 %icmp0 = icmp ne i32 %a, %b
92 %ext = zext i1 %icmp0 to i32
93 %icmp1 = icmp ne i32 %ext, 0
94 store i1 %icmp1, i1 addrspace(1)* %out
95 ret void
96}
97
98; FUNC-LABEL: {{^}}zext_bool_icmp_eq_1:
99; SI-NOT: v_cmp
100; SI: v_cmp_eq_i32_e32 vcc,
101; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
102; SI-NEXT: buffer_store_byte [[RESULT]]
103; SI-NEXT: s_endpgm
104define void @zext_bool_icmp_eq_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
105 %icmp0 = icmp eq i32 %a, %b
106 %ext = zext i1 %icmp0 to i32
107 %icmp1 = icmp eq i32 %ext, 1
108 store i1 %icmp1, i1 addrspace(1)* %out
109 ret void
110}
111
112; FUNC-LABEL: {{^}}zext_bool_icmp_ne_1:
113; SI-NOT: v_cmp
114; SI: v_cmp_eq_i32_e32 vcc,
115; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
116; SI-NEXT: buffer_store_byte [[RESULT]]
117define void @zext_bool_icmp_ne_1(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
118 %icmp0 = icmp ne i32 %a, %b
119 %ext = zext i1 %icmp0 to i32
120 %icmp1 = icmp ne i32 %ext, 1
121 store i1 %icmp1, i1 addrspace(1)* %out
122 ret void
123}
124
125; FUNC-LABEL: {{^}}sext_bool_icmp_ne_k:
126; SI-DAG: s_load_dword [[A:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
127; SI-DAG: s_load_dword [[B:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
128; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[B]]
129; SI: v_cmp_ne_i32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], [[VB]], 2{{$}}
130; SI: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[CMP]]
131; SI: buffer_store_byte
132; SI: s_endpgm
133define void @sext_bool_icmp_ne_k(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
134 %icmp0 = icmp ne i32 %a, %b
135 %ext = sext i1 %icmp0 to i32
136 %icmp1 = icmp ne i32 %ext, 2
137 store i1 %icmp1, i1 addrspace(1)* %out
138 ret void
139}
140
141; FUNC-LABEL: {{^}}cmp_zext_k_i8max:
142; SI: buffer_load_ubyte [[B:v[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0 offset:44
143; SI: v_mov_b32_e32 [[K255:v[0-9]+]], 0xff{{$}}
144; SI: v_cmp_ne_i32_e32 vcc, [[B]], [[K255]]
145; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
146; SI-NEXT: buffer_store_byte [[RESULT]]
147; SI: s_endpgm
148define void @cmp_zext_k_i8max(i1 addrspace(1)* %out, i8 %b) nounwind {
149 %b.ext = zext i8 %b to i32
150 %icmp0 = icmp ne i32 %b.ext, 255
151 store i1 %icmp0, i1 addrspace(1)* %out
152 ret void
153}
154
155; FUNC-LABEL: {{^}}cmp_sext_k_neg1:
156; SI: buffer_load_sbyte [[B:v[0-9]+]]
157; SI: v_cmp_ne_i32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], [[B]], -1{{$}}
158; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[CMP]]
159; SI-NEXT: buffer_store_byte [[RESULT]]
160; SI: s_endpgm
161define void @cmp_sext_k_neg1(i1 addrspace(1)* %out, i8 addrspace(1)* %b.ptr) nounwind {
162 %b = load i8 addrspace(1)* %b.ptr
163 %b.ext = sext i8 %b to i32
164 %icmp0 = icmp ne i32 %b.ext, -1
165 store i1 %icmp0, i1 addrspace(1)* %out
166 ret void
167}
168
169; FUNC-LABEL: {{^}}cmp_sext_k_neg1_i8_sext_arg:
170; SI: s_load_dword [[B:s[0-9]+]]
171; SI: v_cmp_ne_i32_e64 [[CMP:s\[[0-9]+:[0-9]+\]]], [[B]], -1{{$}}
172; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[CMP]]
173; SI-NEXT: buffer_store_byte [[RESULT]]
174; SI: s_endpgm
175define void @cmp_sext_k_neg1_i8_sext_arg(i1 addrspace(1)* %out, i8 signext %b) nounwind {
176 %b.ext = sext i8 %b to i32
177 %icmp0 = icmp ne i32 %b.ext, -1
178 store i1 %icmp0, i1 addrspace(1)* %out
179 ret void
180}
181
182; FIXME: This ends up doing a buffer_load_ubyte, and and compare to
183; 255. Seems to be because of ordering problems when not allowing load widths to be reduced.
184; Should do a buffer_load_sbyte and compare with -1
185
186; FUNC-LABEL: {{^}}cmp_sext_k_neg1_i8_arg:
187; SI-DAG: buffer_load_ubyte [[B:v[0-9]+]]
188; SI-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 0xff{{$}}
189; SI: v_cmp_ne_i32_e32 vcc, [[B]], [[K]]{{$}}
190; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, vcc
191; SI-NEXT: buffer_store_byte [[RESULT]]
192; SI: s_endpgm
193define void @cmp_sext_k_neg1_i8_arg(i1 addrspace(1)* %out, i8 %b) nounwind {
194 %b.ext = sext i8 %b to i32
195 %icmp0 = icmp ne i32 %b.ext, -1
196 store i1 %icmp0, i1 addrspace(1)* %out
197 ret void
198}
199
200; FUNC-LABEL: {{^}}cmp_zext_k_neg1:
201; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}}
202; SI-NEXT: buffer_store_byte [[RESULT]]
203; SI: s_endpgm
204define void @cmp_zext_k_neg1(i1 addrspace(1)* %out, i8 %b) nounwind {
205 %b.ext = zext i8 %b to i32
206 %icmp0 = icmp ne i32 %b.ext, -1
207 store i1 %icmp0, i1 addrspace(1)* %out
208 ret void
209}
210
211; FUNC-LABEL: {{^}}zext_bool_icmp_ne_k:
212; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}}
213; SI-NEXT: buffer_store_byte [[RESULT]]
214; SI-NEXT: s_endpgm
215define void @zext_bool_icmp_ne_k(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
216 %icmp0 = icmp ne i32 %a, %b
217 %ext = zext i1 %icmp0 to i32
218 %icmp1 = icmp ne i32 %ext, 2
219 store i1 %icmp1, i1 addrspace(1)* %out
220 ret void
221}
222
223; FUNC-LABEL: {{^}}zext_bool_icmp_eq_k:
224; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}}
225; SI-NEXT: buffer_store_byte [[RESULT]]
226; SI-NEXT: s_endpgm
227define void @zext_bool_icmp_eq_k(i1 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
228 %icmp0 = icmp ne i32 %a, %b
229 %ext = zext i1 %icmp0 to i32
230 %icmp1 = icmp eq i32 %ext, 2
231 store i1 %icmp1, i1 addrspace(1)* %out
232 ret void
233}