xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/sminmax.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_abs_i32:
6*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
7*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
10*9880d681SAndroid Build Coastguard Workerdefine void @s_abs_i32(i32 addrspace(1)* %out, i32 %val) nounwind {
11*9880d681SAndroid Build Coastguard Worker  %neg = sub i32 0, %val
12*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i32 %val, %neg
13*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cond, i32 %val, i32 %neg
14*9880d681SAndroid Build Coastguard Worker  %res2 = add i32 %res, 2
15*9880d681SAndroid Build Coastguard Worker  store i32 %res2, i32 addrspace(1)* %out, align 4
16*9880d681SAndroid Build Coastguard Worker  ret void
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_abs_i32:
20*9880d681SAndroid Build Coastguard Worker; GCN: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0, [[SRC:v[0-9]+]]
21*9880d681SAndroid Build Coastguard Worker; GCN: v_max_i32_e32 {{v[0-9]+}}, [[NEG]], [[SRC]]
22*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
25*9880d681SAndroid Build Coastguard Workerdefine void @v_abs_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %src) nounwind {
26*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32 addrspace(1)* %src, align 4
27*9880d681SAndroid Build Coastguard Worker  %neg = sub i32 0, %val
28*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i32 %val, %neg
29*9880d681SAndroid Build Coastguard Worker  %res = select i1 %cond, i32 %val, i32 %neg
30*9880d681SAndroid Build Coastguard Worker  %res2 = add i32 %res, 2
31*9880d681SAndroid Build Coastguard Worker  store i32 %res2, i32 addrspace(1)* %out, align 4
32*9880d681SAndroid Build Coastguard Worker  ret void
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_abs_v2i32:
36*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
37*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
38*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
39*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
42*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
43*9880d681SAndroid Build Coastguard Workerdefine void @s_abs_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %val) nounwind {
44*9880d681SAndroid Build Coastguard Worker  %z0 = insertelement <2 x i32> undef, i32 0, i32 0
45*9880d681SAndroid Build Coastguard Worker  %z1 = insertelement <2 x i32> %z0, i32 0, i32 1
46*9880d681SAndroid Build Coastguard Worker  %t0 = insertelement <2 x i32> undef, i32 2, i32 0
47*9880d681SAndroid Build Coastguard Worker  %t1 = insertelement <2 x i32> %t0, i32 2, i32 1
48*9880d681SAndroid Build Coastguard Worker  %neg = sub <2 x i32> %z1, %val
49*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt <2 x i32> %val, %neg
50*9880d681SAndroid Build Coastguard Worker  %res = select <2 x i1> %cond, <2 x i32> %val, <2 x i32> %neg
51*9880d681SAndroid Build Coastguard Worker  %res2 = add <2 x i32> %res, %t1
52*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %res2, <2 x i32> addrspace(1)* %out, align 4
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_abs_v2i32:
57*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG0:v[0-9]+]], vcc, 0, [[SRC0:v[0-9]+]]
58*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG1:v[0-9]+]], vcc, 0, [[SRC1:v[0-9]+]]
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 {{v[0-9]+}}, [[NEG0]], [[SRC0]]
61*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 {{v[0-9]+}}, [[NEG1]], [[SRC1]]
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
64*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
67*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
68*9880d681SAndroid Build Coastguard Workerdefine void @v_abs_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %src) nounwind {
69*9880d681SAndroid Build Coastguard Worker  %z0 = insertelement <2 x i32> undef, i32 0, i32 0
70*9880d681SAndroid Build Coastguard Worker  %z1 = insertelement <2 x i32> %z0, i32 0, i32 1
71*9880d681SAndroid Build Coastguard Worker  %t0 = insertelement <2 x i32> undef, i32 2, i32 0
72*9880d681SAndroid Build Coastguard Worker  %t1 = insertelement <2 x i32> %t0, i32 2, i32 1
73*9880d681SAndroid Build Coastguard Worker  %val = load <2 x i32>, <2 x i32> addrspace(1)* %src, align 4
74*9880d681SAndroid Build Coastguard Worker  %neg = sub <2 x i32> %z1, %val
75*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt <2 x i32> %val, %neg
76*9880d681SAndroid Build Coastguard Worker  %res = select <2 x i1> %cond, <2 x i32> %val, <2 x i32> %neg
77*9880d681SAndroid Build Coastguard Worker  %res2 = add <2 x i32> %res, %t1
78*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %res2, <2 x i32> addrspace(1)* %out, align 4
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_abs_v4i32:
83*9880d681SAndroid Build Coastguard Worker; TODO: this should use s_abs_i32
84*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
85*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
86*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
87*9880d681SAndroid Build Coastguard Worker; GCN: s_abs_i32
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
90*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
91*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
92*9880d681SAndroid Build Coastguard Worker; GCN: s_add_i32
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
95*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
96*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
97*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
98*9880d681SAndroid Build Coastguard Workerdefine void @s_abs_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %val) nounwind {
99*9880d681SAndroid Build Coastguard Worker  %z0 = insertelement <4 x i32> undef, i32 0, i32 0
100*9880d681SAndroid Build Coastguard Worker  %z1 = insertelement <4 x i32> %z0, i32 0, i32 1
101*9880d681SAndroid Build Coastguard Worker  %z2 = insertelement <4 x i32> %z1, i32 0, i32 2
102*9880d681SAndroid Build Coastguard Worker  %z3 = insertelement <4 x i32> %z2, i32 0, i32 3
103*9880d681SAndroid Build Coastguard Worker  %t0 = insertelement <4 x i32> undef, i32 2, i32 0
104*9880d681SAndroid Build Coastguard Worker  %t1 = insertelement <4 x i32> %t0, i32 2, i32 1
105*9880d681SAndroid Build Coastguard Worker  %t2 = insertelement <4 x i32> %t1, i32 2, i32 2
106*9880d681SAndroid Build Coastguard Worker  %t3 = insertelement <4 x i32> %t2, i32 2, i32 3
107*9880d681SAndroid Build Coastguard Worker  %neg = sub <4 x i32> %z3, %val
108*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt <4 x i32> %val, %neg
109*9880d681SAndroid Build Coastguard Worker  %res = select <4 x i1> %cond, <4 x i32> %val, <4 x i32> %neg
110*9880d681SAndroid Build Coastguard Worker  %res2 = add <4 x i32> %res, %t3
111*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %res2, <4 x i32> addrspace(1)* %out, align 4
112*9880d681SAndroid Build Coastguard Worker  ret void
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_abs_v4i32:
116*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG0:v[0-9]+]], vcc, 0, [[SRC0:v[0-9]+]]
117*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG1:v[0-9]+]], vcc, 0, [[SRC1:v[0-9]+]]
118*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG2:v[0-9]+]], vcc, 0, [[SRC2:v[0-9]+]]
119*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG3:v[0-9]+]], vcc, 0, [[SRC3:v[0-9]+]]
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 {{v[0-9]+}}, [[NEG0]], [[SRC0]]
122*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 {{v[0-9]+}}, [[NEG1]], [[SRC1]]
123*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 {{v[0-9]+}}, [[NEG2]], [[SRC2]]
124*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 {{v[0-9]+}}, [[NEG3]], [[SRC3]]
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
127*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
128*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
129*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
132*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
133*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
134*9880d681SAndroid Build Coastguard Worker; EG: MAX_INT
135*9880d681SAndroid Build Coastguard Workerdefine void @v_abs_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %src) nounwind {
136*9880d681SAndroid Build Coastguard Worker  %z0 = insertelement <4 x i32> undef, i32 0, i32 0
137*9880d681SAndroid Build Coastguard Worker  %z1 = insertelement <4 x i32> %z0, i32 0, i32 1
138*9880d681SAndroid Build Coastguard Worker  %z2 = insertelement <4 x i32> %z1, i32 0, i32 2
139*9880d681SAndroid Build Coastguard Worker  %z3 = insertelement <4 x i32> %z2, i32 0, i32 3
140*9880d681SAndroid Build Coastguard Worker  %t0 = insertelement <4 x i32> undef, i32 2, i32 0
141*9880d681SAndroid Build Coastguard Worker  %t1 = insertelement <4 x i32> %t0, i32 2, i32 1
142*9880d681SAndroid Build Coastguard Worker  %t2 = insertelement <4 x i32> %t1, i32 2, i32 2
143*9880d681SAndroid Build Coastguard Worker  %t3 = insertelement <4 x i32> %t2, i32 2, i32 3
144*9880d681SAndroid Build Coastguard Worker  %val = load <4 x i32>, <4 x i32> addrspace(1)* %src, align 4
145*9880d681SAndroid Build Coastguard Worker  %neg = sub <4 x i32> %z3, %val
146*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt <4 x i32> %val, %neg
147*9880d681SAndroid Build Coastguard Worker  %res = select <4 x i1> %cond, <4 x i32> %val, <4 x i32> %neg
148*9880d681SAndroid Build Coastguard Worker  %res2 = add <4 x i32> %res, %t3
149*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %res2, <4 x i32> addrspace(1)* %out, align 4
150*9880d681SAndroid Build Coastguard Worker  ret void
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_min_max_i32:
154*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL0:s[0-9]+]]
155*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL1:s[0-9]+]]
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_min_i32 s{{[0-9]+}}, [[VAL0]], [[VAL1]]
158*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_max_i32 s{{[0-9]+}}, [[VAL0]], [[VAL1]]
159*9880d681SAndroid Build Coastguard Workerdefine void @s_min_max_i32(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 %val0, i32 %val1) nounwind {
160*9880d681SAndroid Build Coastguard Worker  %cond0 = icmp sgt i32 %val0, %val1
161*9880d681SAndroid Build Coastguard Worker  %sel0 = select i1 %cond0, i32 %val0, i32 %val1
162*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cond0, i32 %val1, i32 %val0
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker  store volatile i32 %sel0, i32 addrspace(1)* %out0, align 4
165*9880d681SAndroid Build Coastguard Worker  store volatile i32 %sel1, i32 addrspace(1)* %out1, align 4
166*9880d681SAndroid Build Coastguard Worker  ret void
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_min_max_i32:
170*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL0:v[0-9]+]]
171*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[VAL1:v[0-9]+]]
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_min_i32_e32 v{{[0-9]+}}, [[VAL1]], [[VAL0]]
174*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_max_i32_e32 v{{[0-9]+}}, [[VAL1]], [[VAL0]]
175*9880d681SAndroid Build Coastguard Workerdefine void @v_min_max_i32(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 addrspace(1)* %ptr0, i32 addrspace(1)* %ptr1) nounwind {
176*9880d681SAndroid Build Coastguard Worker  %val0 = load volatile i32, i32 addrspace(1)* %ptr0
177*9880d681SAndroid Build Coastguard Worker  %val1 = load volatile i32, i32 addrspace(1)* %ptr1
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker  %cond0 = icmp sgt i32 %val0, %val1
180*9880d681SAndroid Build Coastguard Worker  %sel0 = select i1 %cond0, i32 %val0, i32 %val1
181*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cond0, i32 %val1, i32 %val0
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker  store volatile i32 %sel0, i32 addrspace(1)* %out0, align 4
184*9880d681SAndroid Build Coastguard Worker  store volatile i32 %sel1, i32 addrspace(1)* %out1, align 4
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_min_max_v4i32:
189*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_min_i32
190*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_min_i32
191*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_min_i32
192*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_min_i32
193*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_max_i32
194*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_max_i32
195*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_max_i32
196*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_max_i32
197*9880d681SAndroid Build Coastguard Workerdefine void @s_min_max_v4i32(<4 x i32> addrspace(1)* %out0, <4 x i32> addrspace(1)* %out1, <4 x i32> %val0, <4 x i32> %val1) nounwind {
198*9880d681SAndroid Build Coastguard Worker  %cond0 = icmp sgt <4 x i32> %val0, %val1
199*9880d681SAndroid Build Coastguard Worker  %sel0 = select <4 x i1> %cond0, <4 x i32> %val0, <4 x i32> %val1
200*9880d681SAndroid Build Coastguard Worker  %sel1 = select <4 x i1> %cond0, <4 x i32> %val1, <4 x i32> %val0
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker  store volatile <4 x i32> %sel0, <4 x i32> addrspace(1)* %out0, align 4
203*9880d681SAndroid Build Coastguard Worker  store volatile <4 x i32> %sel1, <4 x i32> addrspace(1)* %out1, align 4
204*9880d681SAndroid Build Coastguard Worker  ret void
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_min_max_i32_user:
208*9880d681SAndroid Build Coastguard Worker; GCN: v_cmp_gt_i32_e32
209*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cndmask_b32_e32
210*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cndmask_b32_e32
211*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_cndmask_b32_e64 v{{[0-9]+}}, 0, 1, vcc
212*9880d681SAndroid Build Coastguard Workerdefine void @v_min_max_i32_user(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 addrspace(1)* %ptr0, i32 addrspace(1)* %ptr1) nounwind {
213*9880d681SAndroid Build Coastguard Worker  %val0 = load volatile i32, i32 addrspace(1)* %ptr0
214*9880d681SAndroid Build Coastguard Worker  %val1 = load volatile i32, i32 addrspace(1)* %ptr1
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker  %cond0 = icmp sgt i32 %val0, %val1
217*9880d681SAndroid Build Coastguard Worker  %sel0 = select i1 %cond0, i32 %val0, i32 %val1
218*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %cond0, i32 %val1, i32 %val0
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker  store volatile i32 %sel0, i32 addrspace(1)* %out0, align 4
221*9880d681SAndroid Build Coastguard Worker  store volatile i32 %sel1, i32 addrspace(1)* %out1, align 4
222*9880d681SAndroid Build Coastguard Worker  store volatile i1 %cond0, i1 addrspace(1)* undef
223*9880d681SAndroid Build Coastguard Worker  ret void
224*9880d681SAndroid Build Coastguard Worker}
225