1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX6 %s
3; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX8 %s
4; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9 %s
5; RUN: llc -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
6
7define amdgpu_kernel void @v_clamp_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
8; GFX6-LABEL: v_clamp_f32:
9; GFX6:       ; %bb.0:
10; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
11; GFX6-NEXT:    s_mov_b32 s7, 0xf000
12; GFX6-NEXT:    s_mov_b32 s6, 0
13; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
14; GFX6-NEXT:    v_mov_b32_e32 v1, 0
15; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
16; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
17; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
18; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
19; GFX6-NEXT:    s_waitcnt vmcnt(0)
20; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
21; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
22; GFX6-NEXT:    s_endpgm
23;
24; GFX8-LABEL: v_clamp_f32:
25; GFX8:       ; %bb.0:
26; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
27; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
28; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
29; GFX8-NEXT:    v_mov_b32_e32 v1, s3
30; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
31; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
32; GFX8-NEXT:    flat_load_dword v3, v[0:1]
33; GFX8-NEXT:    v_mov_b32_e32 v1, s1
34; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
35; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
36; GFX8-NEXT:    s_waitcnt vmcnt(0)
37; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
38; GFX8-NEXT:    flat_store_dword v[0:1], v2
39; GFX8-NEXT:    s_endpgm
40;
41; GFX9-LABEL: v_clamp_f32:
42; GFX9:       ; %bb.0:
43; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
44; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
45; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
46; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
47; GFX9-NEXT:    s_waitcnt vmcnt(0)
48; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
49; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
50; GFX9-NEXT:    s_endpgm
51;
52; GFX11-LABEL: v_clamp_f32:
53; GFX11:       ; %bb.0:
54; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
55; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
56; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
57; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
58; GFX11-NEXT:    s_waitcnt vmcnt(0)
59; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
60; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
61; GFX11-NEXT:    s_endpgm
62  %tid = call i32 @llvm.amdgcn.workitem.id.x()
63  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
64  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
65  %a = load float, float addrspace(1)* %gep0
66  %max = call float @llvm.maxnum.f32(float %a, float 0.0)
67  %med = call float @llvm.minnum.f32(float %max, float 1.0)
68
69  store float %med, float addrspace(1)* %out.gep
70  ret void
71}
72
73define amdgpu_kernel void @v_clamp_neg_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
74; GFX6-LABEL: v_clamp_neg_f32:
75; GFX6:       ; %bb.0:
76; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
77; GFX6-NEXT:    s_mov_b32 s7, 0xf000
78; GFX6-NEXT:    s_mov_b32 s6, 0
79; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
80; GFX6-NEXT:    v_mov_b32_e32 v1, 0
81; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
82; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
83; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
84; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
85; GFX6-NEXT:    s_waitcnt vmcnt(0)
86; GFX6-NEXT:    v_max_f32_e64 v2, -v2, -v2 clamp
87; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
88; GFX6-NEXT:    s_endpgm
89;
90; GFX8-LABEL: v_clamp_neg_f32:
91; GFX8:       ; %bb.0:
92; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
93; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
94; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
95; GFX8-NEXT:    v_mov_b32_e32 v1, s3
96; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
97; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
98; GFX8-NEXT:    flat_load_dword v3, v[0:1]
99; GFX8-NEXT:    v_mov_b32_e32 v1, s1
100; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
101; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
102; GFX8-NEXT:    s_waitcnt vmcnt(0)
103; GFX8-NEXT:    v_max_f32_e64 v2, -v3, -v3 clamp
104; GFX8-NEXT:    flat_store_dword v[0:1], v2
105; GFX8-NEXT:    s_endpgm
106;
107; GFX9-LABEL: v_clamp_neg_f32:
108; GFX9:       ; %bb.0:
109; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
110; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
111; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
112; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
113; GFX9-NEXT:    s_waitcnt vmcnt(0)
114; GFX9-NEXT:    v_max_f32_e64 v1, -v1, -v1 clamp
115; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
116; GFX9-NEXT:    s_endpgm
117;
118; GFX11-LABEL: v_clamp_neg_f32:
119; GFX11:       ; %bb.0:
120; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
121; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
122; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
123; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
124; GFX11-NEXT:    s_waitcnt vmcnt(0)
125; GFX11-NEXT:    v_max_f32_e64 v1, -v1, -v1 clamp
126; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
127; GFX11-NEXT:    s_endpgm
128  %tid = call i32 @llvm.amdgcn.workitem.id.x()
129  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
130  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
131  %a = load float, float addrspace(1)* %gep0
132  %fneg.a = fneg float %a
133  %max = call float @llvm.maxnum.f32(float %fneg.a, float 0.0)
134  %med = call float @llvm.minnum.f32(float %max, float 1.0)
135
136  store float %med, float addrspace(1)* %out.gep
137  ret void
138}
139
140define amdgpu_kernel void @v_clamp_negabs_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
141; GFX6-LABEL: v_clamp_negabs_f32:
142; GFX6:       ; %bb.0:
143; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
144; GFX6-NEXT:    s_mov_b32 s7, 0xf000
145; GFX6-NEXT:    s_mov_b32 s6, 0
146; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
147; GFX6-NEXT:    v_mov_b32_e32 v1, 0
148; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
149; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
150; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
151; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
152; GFX6-NEXT:    s_waitcnt vmcnt(0)
153; GFX6-NEXT:    v_max_f32_e64 v2, -|v2|, -|v2| clamp
154; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
155; GFX6-NEXT:    s_endpgm
156;
157; GFX8-LABEL: v_clamp_negabs_f32:
158; GFX8:       ; %bb.0:
159; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
160; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
161; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
162; GFX8-NEXT:    v_mov_b32_e32 v1, s3
163; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
164; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
165; GFX8-NEXT:    flat_load_dword v3, v[0:1]
166; GFX8-NEXT:    v_mov_b32_e32 v1, s1
167; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
168; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
169; GFX8-NEXT:    s_waitcnt vmcnt(0)
170; GFX8-NEXT:    v_max_f32_e64 v2, -|v3|, -|v3| clamp
171; GFX8-NEXT:    flat_store_dword v[0:1], v2
172; GFX8-NEXT:    s_endpgm
173;
174; GFX9-LABEL: v_clamp_negabs_f32:
175; GFX9:       ; %bb.0:
176; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
177; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
178; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
179; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
180; GFX9-NEXT:    s_waitcnt vmcnt(0)
181; GFX9-NEXT:    v_max_f32_e64 v1, -|v1|, -|v1| clamp
182; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
183; GFX9-NEXT:    s_endpgm
184;
185; GFX11-LABEL: v_clamp_negabs_f32:
186; GFX11:       ; %bb.0:
187; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
188; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
189; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
190; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
191; GFX11-NEXT:    s_waitcnt vmcnt(0)
192; GFX11-NEXT:    v_max_f32_e64 v1, -|v1|, -|v1| clamp
193; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
194; GFX11-NEXT:    s_endpgm
195  %tid = call i32 @llvm.amdgcn.workitem.id.x()
196  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
197  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
198  %a = load float, float addrspace(1)* %gep0
199  %fabs.a = call float @llvm.fabs.f32(float %a)
200  %fneg.fabs.a = fneg float %fabs.a
201
202  %max = call float @llvm.maxnum.f32(float %fneg.fabs.a, float 0.0)
203  %med = call float @llvm.minnum.f32(float %max, float 1.0)
204
205  store float %med, float addrspace(1)* %out.gep
206  ret void
207}
208
209define amdgpu_kernel void @v_clamp_negzero_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
210; GFX6-LABEL: v_clamp_negzero_f32:
211; GFX6:       ; %bb.0:
212; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
213; GFX6-NEXT:    s_mov_b32 s7, 0xf000
214; GFX6-NEXT:    s_mov_b32 s6, 0
215; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
216; GFX6-NEXT:    v_mov_b32_e32 v1, 0
217; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
218; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
219; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
220; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
221; GFX6-NEXT:    s_waitcnt vmcnt(0)
222; GFX6-NEXT:    v_add_f32_e32 v2, 0.5, v2
223; GFX6-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
224; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
225; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
226; GFX6-NEXT:    s_endpgm
227;
228; GFX8-LABEL: v_clamp_negzero_f32:
229; GFX8:       ; %bb.0:
230; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
231; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
232; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
233; GFX8-NEXT:    v_mov_b32_e32 v1, s3
234; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
235; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
236; GFX8-NEXT:    flat_load_dword v3, v[0:1]
237; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
238; GFX8-NEXT:    v_mov_b32_e32 v1, s1
239; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
240; GFX8-NEXT:    s_waitcnt vmcnt(0)
241; GFX8-NEXT:    v_add_f32_e32 v2, 0.5, v3
242; GFX8-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
243; GFX8-NEXT:    v_min_f32_e32 v2, 1.0, v2
244; GFX8-NEXT:    flat_store_dword v[0:1], v2
245; GFX8-NEXT:    s_endpgm
246;
247; GFX9-LABEL: v_clamp_negzero_f32:
248; GFX9:       ; %bb.0:
249; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
250; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
251; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
252; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
253; GFX9-NEXT:    s_waitcnt vmcnt(0)
254; GFX9-NEXT:    v_add_f32_e32 v1, 0.5, v1
255; GFX9-NEXT:    v_max_f32_e32 v1, 0x80000000, v1
256; GFX9-NEXT:    v_min_f32_e32 v1, 1.0, v1
257; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
258; GFX9-NEXT:    s_endpgm
259;
260; GFX11-LABEL: v_clamp_negzero_f32:
261; GFX11:       ; %bb.0:
262; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
263; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
264; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
265; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
266; GFX11-NEXT:    s_waitcnt vmcnt(0)
267; GFX11-NEXT:    v_add_f32_e32 v1, 0.5, v1
268; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
269; GFX11-NEXT:    v_max_f32_e32 v1, 0x80000000, v1
270; GFX11-NEXT:    v_min_f32_e32 v1, 1.0, v1
271; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
272; GFX11-NEXT:    s_endpgm
273  %tid = call i32 @llvm.amdgcn.workitem.id.x()
274  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
275  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
276  %a = load float, float addrspace(1)* %gep0
277  %add = fadd nnan float %a, 0.5
278  %max = call float @llvm.maxnum.f32(float %add, float -0.0)
279  %med = call float @llvm.minnum.f32(float %max, float 1.0)
280
281  store float %med, float addrspace(1)* %out.gep
282  ret void
283}
284
285; FIXME: Weird inconsistency in how -0.0 is treated. Accepted if clamp
286; matched through med3, not if directly. Is this correct?
287define amdgpu_kernel void @v_clamp_negzero_maybe_snan_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
288; GFX6-LABEL: v_clamp_negzero_maybe_snan_f32:
289; GFX6:       ; %bb.0:
290; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
291; GFX6-NEXT:    s_mov_b32 s7, 0xf000
292; GFX6-NEXT:    s_mov_b32 s6, 0
293; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
294; GFX6-NEXT:    v_mov_b32_e32 v1, 0
295; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
296; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
297; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
298; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
299; GFX6-NEXT:    s_waitcnt vmcnt(0)
300; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
301; GFX6-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
302; GFX6-NEXT:    v_min_f32_e32 v2, 1.0, v2
303; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
304; GFX6-NEXT:    s_endpgm
305;
306; GFX8-LABEL: v_clamp_negzero_maybe_snan_f32:
307; GFX8:       ; %bb.0:
308; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
309; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
310; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
311; GFX8-NEXT:    v_mov_b32_e32 v1, s3
312; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
313; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
314; GFX8-NEXT:    flat_load_dword v3, v[0:1]
315; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
316; GFX8-NEXT:    v_mov_b32_e32 v1, s1
317; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
318; GFX8-NEXT:    s_waitcnt vmcnt(0)
319; GFX8-NEXT:    v_mul_f32_e32 v2, 1.0, v3
320; GFX8-NEXT:    v_max_f32_e32 v2, 0x80000000, v2
321; GFX8-NEXT:    v_min_f32_e32 v2, 1.0, v2
322; GFX8-NEXT:    flat_store_dword v[0:1], v2
323; GFX8-NEXT:    s_endpgm
324;
325; GFX9-LABEL: v_clamp_negzero_maybe_snan_f32:
326; GFX9:       ; %bb.0:
327; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
328; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
329; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
330; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
331; GFX9-NEXT:    s_waitcnt vmcnt(0)
332; GFX9-NEXT:    v_max_f32_e32 v1, v1, v1
333; GFX9-NEXT:    v_max_f32_e32 v1, 0x80000000, v1
334; GFX9-NEXT:    v_min_f32_e32 v1, 1.0, v1
335; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
336; GFX9-NEXT:    s_endpgm
337;
338; GFX11-LABEL: v_clamp_negzero_maybe_snan_f32:
339; GFX11:       ; %bb.0:
340; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
341; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
342; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
343; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
344; GFX11-NEXT:    s_waitcnt vmcnt(0)
345; GFX11-NEXT:    v_max_f32_e32 v1, v1, v1
346; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
347; GFX11-NEXT:    v_max_f32_e32 v1, 0x80000000, v1
348; GFX11-NEXT:    v_min_f32_e32 v1, 1.0, v1
349; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
350; GFX11-NEXT:    s_endpgm
351  %tid = call i32 @llvm.amdgcn.workitem.id.x()
352  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
353  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
354  %a = load float, float addrspace(1)* %gep0
355  %max = call float @llvm.maxnum.f32(float %a, float -0.0)
356  %med = call float @llvm.minnum.f32(float %max, float 1.0)
357
358  store float %med, float addrspace(1)* %out.gep
359  ret void
360}
361
362define amdgpu_kernel void @v_clamp_multi_use_max_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
363; GFX6-LABEL: v_clamp_multi_use_max_f32:
364; GFX6:       ; %bb.0:
365; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
366; GFX6-NEXT:    s_mov_b32 s6, 0
367; GFX6-NEXT:    s_mov_b32 s7, 0xf000
368; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
369; GFX6-NEXT:    v_mov_b32_e32 v1, 0
370; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
371; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
372; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
373; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
374; GFX6-NEXT:    s_mov_b32 s6, -1
375; GFX6-NEXT:    s_waitcnt vmcnt(0)
376; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
377; GFX6-NEXT:    v_max_f32_e32 v2, 0, v2
378; GFX6-NEXT:    v_min_f32_e32 v3, 1.0, v2
379; GFX6-NEXT:    buffer_store_dword v3, v[0:1], s[0:3], 0 addr64
380; GFX6-NEXT:    buffer_store_dword v2, off, s[4:7], 0
381; GFX6-NEXT:    s_waitcnt vmcnt(0)
382; GFX6-NEXT:    s_endpgm
383;
384; GFX8-LABEL: v_clamp_multi_use_max_f32:
385; GFX8:       ; %bb.0:
386; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
387; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
388; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
389; GFX8-NEXT:    v_mov_b32_e32 v1, s3
390; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
391; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
392; GFX8-NEXT:    flat_load_dword v3, v[0:1]
393; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
394; GFX8-NEXT:    v_mov_b32_e32 v1, s1
395; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
396; GFX8-NEXT:    s_waitcnt vmcnt(0)
397; GFX8-NEXT:    v_mul_f32_e32 v2, 1.0, v3
398; GFX8-NEXT:    v_max_f32_e32 v2, 0, v2
399; GFX8-NEXT:    v_min_f32_e32 v3, 1.0, v2
400; GFX8-NEXT:    flat_store_dword v[0:1], v3
401; GFX8-NEXT:    flat_store_dword v[0:1], v2
402; GFX8-NEXT:    s_waitcnt vmcnt(0)
403; GFX8-NEXT:    s_endpgm
404;
405; GFX9-LABEL: v_clamp_multi_use_max_f32:
406; GFX9:       ; %bb.0:
407; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
408; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
409; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
410; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
411; GFX9-NEXT:    s_waitcnt vmcnt(0)
412; GFX9-NEXT:    v_max_f32_e32 v1, v1, v1
413; GFX9-NEXT:    v_max_f32_e32 v1, 0, v1
414; GFX9-NEXT:    v_min_f32_e32 v2, 1.0, v1
415; GFX9-NEXT:    global_store_dword v0, v2, s[0:1]
416; GFX9-NEXT:    global_store_dword v[0:1], v1, off
417; GFX9-NEXT:    s_waitcnt vmcnt(0)
418; GFX9-NEXT:    s_endpgm
419;
420; GFX11-LABEL: v_clamp_multi_use_max_f32:
421; GFX11:       ; %bb.0:
422; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
423; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
424; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
425; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
426; GFX11-NEXT:    s_waitcnt vmcnt(0)
427; GFX11-NEXT:    v_max_f32_e32 v1, v1, v1
428; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
429; GFX11-NEXT:    v_max_f32_e32 v1, 0, v1
430; GFX11-NEXT:    v_min_f32_e32 v2, 1.0, v1
431; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1]
432; GFX11-NEXT:    global_store_b32 v[0:1], v1, off dlc
433; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
434; GFX11-NEXT:    s_endpgm
435  %tid = call i32 @llvm.amdgcn.workitem.id.x()
436  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
437  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
438  %a = load float, float addrspace(1)* %gep0
439  %max = call float @llvm.maxnum.f32(float %a, float 0.0)
440  %med = call float @llvm.minnum.f32(float %max, float 1.0)
441
442  store float %med, float addrspace(1)* %out.gep
443  store volatile float %max, float addrspace(1)* undef
444  ret void
445}
446
447define amdgpu_kernel void @v_clamp_f16(half addrspace(1)* %out, half addrspace(1)* %aptr) #0 {
448; GFX6-LABEL: v_clamp_f16:
449; GFX6:       ; %bb.0:
450; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
451; GFX6-NEXT:    s_mov_b32 s7, 0xf000
452; GFX6-NEXT:    s_mov_b32 s6, 0
453; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
454; GFX6-NEXT:    v_mov_b32_e32 v1, 0
455; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
456; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
457; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
458; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
459; GFX6-NEXT:    s_waitcnt vmcnt(0)
460; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
461; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
462; GFX6-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
463; GFX6-NEXT:    s_endpgm
464;
465; GFX8-LABEL: v_clamp_f16:
466; GFX8:       ; %bb.0:
467; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
468; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
469; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
470; GFX8-NEXT:    v_mov_b32_e32 v1, s3
471; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
472; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
473; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
474; GFX8-NEXT:    v_mov_b32_e32 v1, s1
475; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
476; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
477; GFX8-NEXT:    s_waitcnt vmcnt(0)
478; GFX8-NEXT:    v_max_f16_e64 v2, v3, v3 clamp
479; GFX8-NEXT:    flat_store_short v[0:1], v2
480; GFX8-NEXT:    s_endpgm
481;
482; GFX9-LABEL: v_clamp_f16:
483; GFX9:       ; %bb.0:
484; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
485; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
486; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
487; GFX9-NEXT:    global_load_ushort v1, v0, s[2:3]
488; GFX9-NEXT:    s_waitcnt vmcnt(0)
489; GFX9-NEXT:    v_max_f16_e64 v1, v1, v1 clamp
490; GFX9-NEXT:    global_store_short v0, v1, s[0:1]
491; GFX9-NEXT:    s_endpgm
492;
493; GFX11-LABEL: v_clamp_f16:
494; GFX11:       ; %bb.0:
495; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
496; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
497; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
498; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
499; GFX11-NEXT:    s_waitcnt vmcnt(0)
500; GFX11-NEXT:    v_max_f16_e64 v1, v1, v1 clamp
501; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
502; GFX11-NEXT:    s_endpgm
503  %tid = call i32 @llvm.amdgcn.workitem.id.x()
504  %gep0 = getelementptr half, half addrspace(1)* %aptr, i32 %tid
505  %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid
506  %a = load half, half addrspace(1)* %gep0
507  %max = call half @llvm.maxnum.f16(half %a, half 0.0)
508  %med = call half @llvm.minnum.f16(half %max, half 1.0)
509
510  store half %med, half addrspace(1)* %out.gep
511  ret void
512}
513
514define amdgpu_kernel void @v_clamp_neg_f16(half addrspace(1)* %out, half addrspace(1)* %aptr) #0 {
515; GFX6-LABEL: v_clamp_neg_f16:
516; GFX6:       ; %bb.0:
517; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
518; GFX6-NEXT:    s_mov_b32 s7, 0xf000
519; GFX6-NEXT:    s_mov_b32 s6, 0
520; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
521; GFX6-NEXT:    v_mov_b32_e32 v1, 0
522; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
523; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
524; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
525; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
526; GFX6-NEXT:    s_waitcnt vmcnt(0)
527; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -v2 clamp
528; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
529; GFX6-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
530; GFX6-NEXT:    s_endpgm
531;
532; GFX8-LABEL: v_clamp_neg_f16:
533; GFX8:       ; %bb.0:
534; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
535; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
536; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
537; GFX8-NEXT:    v_mov_b32_e32 v1, s3
538; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
539; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
540; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
541; GFX8-NEXT:    v_mov_b32_e32 v1, s1
542; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
543; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
544; GFX8-NEXT:    s_waitcnt vmcnt(0)
545; GFX8-NEXT:    v_max_f16_e64 v2, -v3, -v3 clamp
546; GFX8-NEXT:    flat_store_short v[0:1], v2
547; GFX8-NEXT:    s_endpgm
548;
549; GFX9-LABEL: v_clamp_neg_f16:
550; GFX9:       ; %bb.0:
551; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
552; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
553; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
554; GFX9-NEXT:    global_load_ushort v1, v0, s[2:3]
555; GFX9-NEXT:    s_waitcnt vmcnt(0)
556; GFX9-NEXT:    v_max_f16_e64 v1, -v1, -v1 clamp
557; GFX9-NEXT:    global_store_short v0, v1, s[0:1]
558; GFX9-NEXT:    s_endpgm
559;
560; GFX11-LABEL: v_clamp_neg_f16:
561; GFX11:       ; %bb.0:
562; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
563; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
564; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
565; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
566; GFX11-NEXT:    s_waitcnt vmcnt(0)
567; GFX11-NEXT:    v_max_f16_e64 v1, -v1, -v1 clamp
568; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
569; GFX11-NEXT:    s_endpgm
570  %tid = call i32 @llvm.amdgcn.workitem.id.x()
571  %gep0 = getelementptr half, half addrspace(1)* %aptr, i32 %tid
572  %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid
573  %a = load half, half addrspace(1)* %gep0
574  %fneg.a = fsub half -0.0, %a
575  %max = call half @llvm.maxnum.f16(half %fneg.a, half 0.0)
576  %med = call half @llvm.minnum.f16(half %max, half 1.0)
577
578  store half %med, half addrspace(1)* %out.gep
579  ret void
580}
581
582define amdgpu_kernel void @v_clamp_negabs_f16(half addrspace(1)* %out, half addrspace(1)* %aptr) #0 {
583; GFX6-LABEL: v_clamp_negabs_f16:
584; GFX6:       ; %bb.0:
585; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
586; GFX6-NEXT:    s_mov_b32 s7, 0xf000
587; GFX6-NEXT:    s_mov_b32 s6, 0
588; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
589; GFX6-NEXT:    v_mov_b32_e32 v1, 0
590; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
591; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
592; GFX6-NEXT:    buffer_load_ushort v2, v[0:1], s[4:7], 0 addr64
593; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
594; GFX6-NEXT:    s_waitcnt vmcnt(0)
595; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -|v2| clamp
596; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
597; GFX6-NEXT:    buffer_store_short v2, v[0:1], s[0:3], 0 addr64
598; GFX6-NEXT:    s_endpgm
599;
600; GFX8-LABEL: v_clamp_negabs_f16:
601; GFX8:       ; %bb.0:
602; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
603; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
604; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
605; GFX8-NEXT:    v_mov_b32_e32 v1, s3
606; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
607; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
608; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
609; GFX8-NEXT:    v_mov_b32_e32 v1, s1
610; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
611; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
612; GFX8-NEXT:    s_waitcnt vmcnt(0)
613; GFX8-NEXT:    v_max_f16_e64 v2, -|v3|, -|v3| clamp
614; GFX8-NEXT:    flat_store_short v[0:1], v2
615; GFX8-NEXT:    s_endpgm
616;
617; GFX9-LABEL: v_clamp_negabs_f16:
618; GFX9:       ; %bb.0:
619; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
620; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
621; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
622; GFX9-NEXT:    global_load_ushort v1, v0, s[2:3]
623; GFX9-NEXT:    s_waitcnt vmcnt(0)
624; GFX9-NEXT:    v_max_f16_e64 v1, -|v1|, -|v1| clamp
625; GFX9-NEXT:    global_store_short v0, v1, s[0:1]
626; GFX9-NEXT:    s_endpgm
627;
628; GFX11-LABEL: v_clamp_negabs_f16:
629; GFX11:       ; %bb.0:
630; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
631; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
632; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
633; GFX11-NEXT:    global_load_u16 v1, v0, s[2:3]
634; GFX11-NEXT:    s_waitcnt vmcnt(0)
635; GFX11-NEXT:    v_max_f16_e64 v1, -|v1|, -|v1| clamp
636; GFX11-NEXT:    global_store_b16 v0, v1, s[0:1]
637; GFX11-NEXT:    s_endpgm
638  %tid = call i32 @llvm.amdgcn.workitem.id.x()
639  %gep0 = getelementptr half, half addrspace(1)* %aptr, i32 %tid
640  %out.gep = getelementptr half, half addrspace(1)* %out, i32 %tid
641  %a = load half, half addrspace(1)* %gep0
642  %fabs.a = call half @llvm.fabs.f16(half %a)
643  %fneg.fabs.a = fsub half -0.0, %fabs.a
644
645  %max = call half @llvm.maxnum.f16(half %fneg.fabs.a, half 0.0)
646  %med = call half @llvm.minnum.f16(half %max, half 1.0)
647
648  store half %med, half addrspace(1)* %out.gep
649  ret void
650}
651
652define amdgpu_kernel void @v_clamp_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #0 {
653; GFX6-LABEL: v_clamp_f64:
654; GFX6:       ; %bb.0:
655; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
656; GFX6-NEXT:    s_mov_b32 s7, 0xf000
657; GFX6-NEXT:    s_mov_b32 s6, 0
658; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
659; GFX6-NEXT:    v_mov_b32_e32 v1, 0
660; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
661; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
662; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
663; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
664; GFX6-NEXT:    s_waitcnt vmcnt(0)
665; GFX6-NEXT:    v_max_f64 v[2:3], v[2:3], v[2:3] clamp
666; GFX6-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
667; GFX6-NEXT:    s_endpgm
668;
669; GFX8-LABEL: v_clamp_f64:
670; GFX8:       ; %bb.0:
671; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
672; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
673; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
674; GFX8-NEXT:    v_mov_b32_e32 v1, s3
675; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
676; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
677; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
678; GFX8-NEXT:    v_mov_b32_e32 v3, s1
679; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
680; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
681; GFX8-NEXT:    s_waitcnt vmcnt(0)
682; GFX8-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1] clamp
683; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
684; GFX8-NEXT:    s_endpgm
685;
686; GFX9-LABEL: v_clamp_f64:
687; GFX9:       ; %bb.0:
688; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
689; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
690; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
691; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
692; GFX9-NEXT:    s_waitcnt vmcnt(0)
693; GFX9-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1] clamp
694; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
695; GFX9-NEXT:    s_endpgm
696;
697; GFX11-LABEL: v_clamp_f64:
698; GFX11:       ; %bb.0:
699; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
700; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
701; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
702; GFX11-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
703; GFX11-NEXT:    s_waitcnt vmcnt(0)
704; GFX11-NEXT:    v_max_f64 v[0:1], v[0:1], v[0:1] clamp
705; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
706; GFX11-NEXT:    s_endpgm
707  %tid = call i32 @llvm.amdgcn.workitem.id.x()
708  %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid
709  %out.gep = getelementptr double, double addrspace(1)* %out, i32 %tid
710  %a = load double, double addrspace(1)* %gep0
711  %max = call double @llvm.maxnum.f64(double %a, double 0.0)
712  %med = call double @llvm.minnum.f64(double %max, double 1.0)
713
714  store double %med, double addrspace(1)* %out.gep
715  ret void
716}
717
718define amdgpu_kernel void @v_clamp_neg_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #0 {
719; GFX6-LABEL: v_clamp_neg_f64:
720; GFX6:       ; %bb.0:
721; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
722; GFX6-NEXT:    s_mov_b32 s7, 0xf000
723; GFX6-NEXT:    s_mov_b32 s6, 0
724; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
725; GFX6-NEXT:    v_mov_b32_e32 v1, 0
726; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
727; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
728; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
729; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
730; GFX6-NEXT:    s_waitcnt vmcnt(0)
731; GFX6-NEXT:    v_max_f64 v[2:3], -v[2:3], -v[2:3] clamp
732; GFX6-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
733; GFX6-NEXT:    s_endpgm
734;
735; GFX8-LABEL: v_clamp_neg_f64:
736; GFX8:       ; %bb.0:
737; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
738; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
739; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
740; GFX8-NEXT:    v_mov_b32_e32 v1, s3
741; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
742; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
743; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
744; GFX8-NEXT:    v_mov_b32_e32 v3, s1
745; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
746; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
747; GFX8-NEXT:    s_waitcnt vmcnt(0)
748; GFX8-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp
749; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
750; GFX8-NEXT:    s_endpgm
751;
752; GFX9-LABEL: v_clamp_neg_f64:
753; GFX9:       ; %bb.0:
754; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
755; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
756; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
757; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
758; GFX9-NEXT:    s_waitcnt vmcnt(0)
759; GFX9-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp
760; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
761; GFX9-NEXT:    s_endpgm
762;
763; GFX11-LABEL: v_clamp_neg_f64:
764; GFX11:       ; %bb.0:
765; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
766; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
767; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
768; GFX11-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
769; GFX11-NEXT:    s_waitcnt vmcnt(0)
770; GFX11-NEXT:    v_max_f64 v[0:1], -v[0:1], -v[0:1] clamp
771; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
772; GFX11-NEXT:    s_endpgm
773  %tid = call i32 @llvm.amdgcn.workitem.id.x()
774  %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid
775  %out.gep = getelementptr double, double addrspace(1)* %out, i32 %tid
776  %a = load double, double addrspace(1)* %gep0
777  %fneg.a = fsub double -0.0, %a
778  %max = call double @llvm.maxnum.f64(double %fneg.a, double 0.0)
779  %med = call double @llvm.minnum.f64(double %max, double 1.0)
780
781  store double %med, double addrspace(1)* %out.gep
782  ret void
783}
784
785define amdgpu_kernel void @v_clamp_negabs_f64(double addrspace(1)* %out, double addrspace(1)* %aptr) #0 {
786; GFX6-LABEL: v_clamp_negabs_f64:
787; GFX6:       ; %bb.0:
788; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
789; GFX6-NEXT:    s_mov_b32 s7, 0xf000
790; GFX6-NEXT:    s_mov_b32 s6, 0
791; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
792; GFX6-NEXT:    v_mov_b32_e32 v1, 0
793; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
794; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
795; GFX6-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[4:7], 0 addr64
796; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
797; GFX6-NEXT:    s_waitcnt vmcnt(0)
798; GFX6-NEXT:    v_max_f64 v[2:3], -|v[2:3]|, -|v[2:3]| clamp
799; GFX6-NEXT:    buffer_store_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64
800; GFX6-NEXT:    s_endpgm
801;
802; GFX8-LABEL: v_clamp_negabs_f64:
803; GFX8:       ; %bb.0:
804; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
805; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
806; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
807; GFX8-NEXT:    v_mov_b32_e32 v1, s3
808; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
809; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
810; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
811; GFX8-NEXT:    v_mov_b32_e32 v3, s1
812; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s0, v2
813; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
814; GFX8-NEXT:    s_waitcnt vmcnt(0)
815; GFX8-NEXT:    v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
816; GFX8-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
817; GFX8-NEXT:    s_endpgm
818;
819; GFX9-LABEL: v_clamp_negabs_f64:
820; GFX9:       ; %bb.0:
821; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
822; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
823; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
824; GFX9-NEXT:    global_load_dwordx2 v[0:1], v2, s[2:3]
825; GFX9-NEXT:    s_waitcnt vmcnt(0)
826; GFX9-NEXT:    v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
827; GFX9-NEXT:    global_store_dwordx2 v2, v[0:1], s[0:1]
828; GFX9-NEXT:    s_endpgm
829;
830; GFX11-LABEL: v_clamp_negabs_f64:
831; GFX11:       ; %bb.0:
832; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
833; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
834; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
835; GFX11-NEXT:    global_load_b64 v[0:1], v2, s[2:3]
836; GFX11-NEXT:    s_waitcnt vmcnt(0)
837; GFX11-NEXT:    v_max_f64 v[0:1], -|v[0:1]|, -|v[0:1]| clamp
838; GFX11-NEXT:    global_store_b64 v2, v[0:1], s[0:1]
839; GFX11-NEXT:    s_endpgm
840  %tid = call i32 @llvm.amdgcn.workitem.id.x()
841  %gep0 = getelementptr double, double addrspace(1)* %aptr, i32 %tid
842  %out.gep = getelementptr double, double addrspace(1)* %out, i32 %tid
843  %a = load double, double addrspace(1)* %gep0
844  %fabs.a = call double @llvm.fabs.f64(double %a)
845  %fneg.fabs.a = fsub double -0.0, %fabs.a
846
847  %max = call double @llvm.maxnum.f64(double %fneg.fabs.a, double 0.0)
848  %med = call double @llvm.minnum.f64(double %max, double 1.0)
849
850  store double %med, double addrspace(1)* %out.gep
851  ret void
852}
853
854define amdgpu_kernel void @v_clamp_med3_aby_negzero_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
855; GFX6-LABEL: v_clamp_med3_aby_negzero_f32:
856; GFX6:       ; %bb.0:
857; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
858; GFX6-NEXT:    s_mov_b32 s7, 0xf000
859; GFX6-NEXT:    s_mov_b32 s6, 0
860; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
861; GFX6-NEXT:    v_mov_b32_e32 v1, 0
862; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
863; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
864; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
865; GFX6-NEXT:    s_brev_b32 s4, 1
866; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
867; GFX6-NEXT:    s_waitcnt vmcnt(0)
868; GFX6-NEXT:    v_med3_f32 v2, s4, 1.0, v2
869; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
870; GFX6-NEXT:    s_endpgm
871;
872; GFX8-LABEL: v_clamp_med3_aby_negzero_f32:
873; GFX8:       ; %bb.0:
874; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
875; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
876; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
877; GFX8-NEXT:    v_mov_b32_e32 v1, s3
878; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
879; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
880; GFX8-NEXT:    flat_load_dword v3, v[0:1]
881; GFX8-NEXT:    v_mov_b32_e32 v1, s1
882; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
883; GFX8-NEXT:    s_brev_b32 s0, 1
884; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
885; GFX8-NEXT:    s_waitcnt vmcnt(0)
886; GFX8-NEXT:    v_med3_f32 v2, s0, 1.0, v3
887; GFX8-NEXT:    flat_store_dword v[0:1], v2
888; GFX8-NEXT:    s_endpgm
889;
890; GFX9-LABEL: v_clamp_med3_aby_negzero_f32:
891; GFX9:       ; %bb.0:
892; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
893; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
894; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
895; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
896; GFX9-NEXT:    s_brev_b32 s2, 1
897; GFX9-NEXT:    s_waitcnt vmcnt(0)
898; GFX9-NEXT:    v_med3_f32 v1, s2, 1.0, v1
899; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
900; GFX9-NEXT:    s_endpgm
901;
902; GFX11-LABEL: v_clamp_med3_aby_negzero_f32:
903; GFX11:       ; %bb.0:
904; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
905; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
906; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
907; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
908; GFX11-NEXT:    s_waitcnt vmcnt(0)
909; GFX11-NEXT:    v_med3_f32 v1, 0x80000000, 1.0, v1
910; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
911; GFX11-NEXT:    s_endpgm
912  %tid = call i32 @llvm.amdgcn.workitem.id.x()
913  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
914  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
915  %a = load float, float addrspace(1)* %gep0
916  %med = call float @llvm.amdgcn.fmed3.f32(float -0.0, float 1.0, float %a)
917  store float %med, float addrspace(1)* %out.gep
918  ret void
919}
920
921define amdgpu_kernel void @v_clamp_med3_aby_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
922; GFX6-LABEL: v_clamp_med3_aby_f32:
923; GFX6:       ; %bb.0:
924; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
925; GFX6-NEXT:    s_mov_b32 s7, 0xf000
926; GFX6-NEXT:    s_mov_b32 s6, 0
927; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
928; GFX6-NEXT:    v_mov_b32_e32 v1, 0
929; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
930; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
931; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
932; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
933; GFX6-NEXT:    s_waitcnt vmcnt(0)
934; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
935; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
936; GFX6-NEXT:    s_endpgm
937;
938; GFX8-LABEL: v_clamp_med3_aby_f32:
939; GFX8:       ; %bb.0:
940; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
941; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
942; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
943; GFX8-NEXT:    v_mov_b32_e32 v1, s3
944; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
945; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
946; GFX8-NEXT:    flat_load_dword v3, v[0:1]
947; GFX8-NEXT:    v_mov_b32_e32 v1, s1
948; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
949; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
950; GFX8-NEXT:    s_waitcnt vmcnt(0)
951; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
952; GFX8-NEXT:    flat_store_dword v[0:1], v2
953; GFX8-NEXT:    s_endpgm
954;
955; GFX9-LABEL: v_clamp_med3_aby_f32:
956; GFX9:       ; %bb.0:
957; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
958; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
959; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
960; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
961; GFX9-NEXT:    s_waitcnt vmcnt(0)
962; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
963; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
964; GFX9-NEXT:    s_endpgm
965;
966; GFX11-LABEL: v_clamp_med3_aby_f32:
967; GFX11:       ; %bb.0:
968; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
969; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
970; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
971; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
972; GFX11-NEXT:    s_waitcnt vmcnt(0)
973; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
974; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
975; GFX11-NEXT:    s_endpgm
976  %tid = call i32 @llvm.amdgcn.workitem.id.x()
977  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
978  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
979  %a = load float, float addrspace(1)* %gep0
980  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a)
981  store float %med, float addrspace(1)* %out.gep
982  ret void
983}
984
985define amdgpu_kernel void @v_clamp_med3_bay_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
986; GFX6-LABEL: v_clamp_med3_bay_f32:
987; GFX6:       ; %bb.0:
988; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
989; GFX6-NEXT:    s_mov_b32 s7, 0xf000
990; GFX6-NEXT:    s_mov_b32 s6, 0
991; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
992; GFX6-NEXT:    v_mov_b32_e32 v1, 0
993; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
994; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
995; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
996; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
997; GFX6-NEXT:    s_waitcnt vmcnt(0)
998; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
999; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1000; GFX6-NEXT:    s_endpgm
1001;
1002; GFX8-LABEL: v_clamp_med3_bay_f32:
1003; GFX8:       ; %bb.0:
1004; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1005; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1006; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1007; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1008; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1009; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1010; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1011; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1012; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1013; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1014; GFX8-NEXT:    s_waitcnt vmcnt(0)
1015; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1016; GFX8-NEXT:    flat_store_dword v[0:1], v2
1017; GFX8-NEXT:    s_endpgm
1018;
1019; GFX9-LABEL: v_clamp_med3_bay_f32:
1020; GFX9:       ; %bb.0:
1021; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1022; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1023; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1024; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1025; GFX9-NEXT:    s_waitcnt vmcnt(0)
1026; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1027; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1028; GFX9-NEXT:    s_endpgm
1029;
1030; GFX11-LABEL: v_clamp_med3_bay_f32:
1031; GFX11:       ; %bb.0:
1032; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1033; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1034; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1035; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1036; GFX11-NEXT:    s_waitcnt vmcnt(0)
1037; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1038; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1039; GFX11-NEXT:    s_endpgm
1040  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1041  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1042  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1043  %a = load float, float addrspace(1)* %gep0
1044  %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a)
1045  store float %med, float addrspace(1)* %out.gep
1046  ret void
1047}
1048
1049define amdgpu_kernel void @v_clamp_med3_yab_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
1050; GFX6-LABEL: v_clamp_med3_yab_f32:
1051; GFX6:       ; %bb.0:
1052; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1053; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1054; GFX6-NEXT:    s_mov_b32 s6, 0
1055; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1056; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1057; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1058; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1059; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1060; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1061; GFX6-NEXT:    s_waitcnt vmcnt(0)
1062; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1063; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1064; GFX6-NEXT:    s_endpgm
1065;
1066; GFX8-LABEL: v_clamp_med3_yab_f32:
1067; GFX8:       ; %bb.0:
1068; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1069; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1070; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1071; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1072; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1073; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1074; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1075; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1076; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1077; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1078; GFX8-NEXT:    s_waitcnt vmcnt(0)
1079; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1080; GFX8-NEXT:    flat_store_dword v[0:1], v2
1081; GFX8-NEXT:    s_endpgm
1082;
1083; GFX9-LABEL: v_clamp_med3_yab_f32:
1084; GFX9:       ; %bb.0:
1085; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1086; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1087; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1088; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1089; GFX9-NEXT:    s_waitcnt vmcnt(0)
1090; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1091; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1092; GFX9-NEXT:    s_endpgm
1093;
1094; GFX11-LABEL: v_clamp_med3_yab_f32:
1095; GFX11:       ; %bb.0:
1096; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1097; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1098; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1099; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1100; GFX11-NEXT:    s_waitcnt vmcnt(0)
1101; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1102; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1103; GFX11-NEXT:    s_endpgm
1104  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1105  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1106  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1107  %a = load float, float addrspace(1)* %gep0
1108  %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0)
1109  store float %med, float addrspace(1)* %out.gep
1110  ret void
1111}
1112
1113define amdgpu_kernel void @v_clamp_med3_yba_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
1114; GFX6-LABEL: v_clamp_med3_yba_f32:
1115; GFX6:       ; %bb.0:
1116; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1117; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1118; GFX6-NEXT:    s_mov_b32 s6, 0
1119; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1120; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1121; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1122; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1123; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1124; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1125; GFX6-NEXT:    s_waitcnt vmcnt(0)
1126; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1127; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1128; GFX6-NEXT:    s_endpgm
1129;
1130; GFX8-LABEL: v_clamp_med3_yba_f32:
1131; GFX8:       ; %bb.0:
1132; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1133; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1134; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1135; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1136; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1137; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1138; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1139; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1140; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1141; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1142; GFX8-NEXT:    s_waitcnt vmcnt(0)
1143; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1144; GFX8-NEXT:    flat_store_dword v[0:1], v2
1145; GFX8-NEXT:    s_endpgm
1146;
1147; GFX9-LABEL: v_clamp_med3_yba_f32:
1148; GFX9:       ; %bb.0:
1149; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1150; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1151; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1152; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1153; GFX9-NEXT:    s_waitcnt vmcnt(0)
1154; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1155; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1156; GFX9-NEXT:    s_endpgm
1157;
1158; GFX11-LABEL: v_clamp_med3_yba_f32:
1159; GFX11:       ; %bb.0:
1160; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1161; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1162; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1163; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1164; GFX11-NEXT:    s_waitcnt vmcnt(0)
1165; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1166; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1167; GFX11-NEXT:    s_endpgm
1168  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1169  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1170  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1171  %a = load float, float addrspace(1)* %gep0
1172  %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0)
1173  store float %med, float addrspace(1)* %out.gep
1174  ret void
1175}
1176
1177define amdgpu_kernel void @v_clamp_med3_ayb_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
1178; GFX6-LABEL: v_clamp_med3_ayb_f32:
1179; GFX6:       ; %bb.0:
1180; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1181; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1182; GFX6-NEXT:    s_mov_b32 s6, 0
1183; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1184; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1185; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1186; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1187; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1188; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1189; GFX6-NEXT:    s_waitcnt vmcnt(0)
1190; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1191; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1192; GFX6-NEXT:    s_endpgm
1193;
1194; GFX8-LABEL: v_clamp_med3_ayb_f32:
1195; GFX8:       ; %bb.0:
1196; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1197; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1198; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1199; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1200; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1201; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1202; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1203; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1204; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1205; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1206; GFX8-NEXT:    s_waitcnt vmcnt(0)
1207; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1208; GFX8-NEXT:    flat_store_dword v[0:1], v2
1209; GFX8-NEXT:    s_endpgm
1210;
1211; GFX9-LABEL: v_clamp_med3_ayb_f32:
1212; GFX9:       ; %bb.0:
1213; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1214; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1215; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1216; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1217; GFX9-NEXT:    s_waitcnt vmcnt(0)
1218; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1219; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1220; GFX9-NEXT:    s_endpgm
1221;
1222; GFX11-LABEL: v_clamp_med3_ayb_f32:
1223; GFX11:       ; %bb.0:
1224; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1225; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1226; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1227; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1228; GFX11-NEXT:    s_waitcnt vmcnt(0)
1229; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1230; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1231; GFX11-NEXT:    s_endpgm
1232  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1233  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1234  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1235  %a = load float, float addrspace(1)* %gep0
1236  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0)
1237  store float %med, float addrspace(1)* %out.gep
1238  ret void
1239}
1240
1241define amdgpu_kernel void @v_clamp_med3_bya_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0 {
1242; GFX6-LABEL: v_clamp_med3_bya_f32:
1243; GFX6:       ; %bb.0:
1244; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1245; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1246; GFX6-NEXT:    s_mov_b32 s6, 0
1247; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1248; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1249; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1250; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1251; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1252; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1253; GFX6-NEXT:    s_waitcnt vmcnt(0)
1254; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1255; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1256; GFX6-NEXT:    s_endpgm
1257;
1258; GFX8-LABEL: v_clamp_med3_bya_f32:
1259; GFX8:       ; %bb.0:
1260; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1261; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1262; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1263; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1264; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1265; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1266; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1267; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1268; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1269; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1270; GFX8-NEXT:    s_waitcnt vmcnt(0)
1271; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1272; GFX8-NEXT:    flat_store_dword v[0:1], v2
1273; GFX8-NEXT:    s_endpgm
1274;
1275; GFX9-LABEL: v_clamp_med3_bya_f32:
1276; GFX9:       ; %bb.0:
1277; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1278; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1279; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1280; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1281; GFX9-NEXT:    s_waitcnt vmcnt(0)
1282; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1283; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1284; GFX9-NEXT:    s_endpgm
1285;
1286; GFX11-LABEL: v_clamp_med3_bya_f32:
1287; GFX11:       ; %bb.0:
1288; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1289; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1290; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1291; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1292; GFX11-NEXT:    s_waitcnt vmcnt(0)
1293; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1294; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1295; GFX11-NEXT:    s_endpgm
1296  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1297  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1298  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1299  %a = load float, float addrspace(1)* %gep0
1300  %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0)
1301  store float %med, float addrspace(1)* %out.gep
1302  ret void
1303}
1304
1305define amdgpu_kernel void @v_clamp_constants_to_one_f32(float addrspace(1)* %out) #0 {
1306; GFX6-LABEL: v_clamp_constants_to_one_f32:
1307; GFX6:       ; %bb.0:
1308; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1309; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1310; GFX6-NEXT:    s_mov_b32 s2, 0
1311; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1312; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1313; GFX6-NEXT:    v_mov_b32_e32 v2, 1.0
1314; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1315; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1316; GFX6-NEXT:    s_endpgm
1317;
1318; GFX8-LABEL: v_clamp_constants_to_one_f32:
1319; GFX8:       ; %bb.0:
1320; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1321; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1322; GFX8-NEXT:    v_mov_b32_e32 v2, 1.0
1323; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1324; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1325; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1326; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1327; GFX8-NEXT:    flat_store_dword v[0:1], v2
1328; GFX8-NEXT:    s_endpgm
1329;
1330; GFX9-LABEL: v_clamp_constants_to_one_f32:
1331; GFX9:       ; %bb.0:
1332; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1333; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1334; GFX9-NEXT:    v_mov_b32_e32 v1, 1.0
1335; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1336; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1337; GFX9-NEXT:    s_endpgm
1338;
1339; GFX11-LABEL: v_clamp_constants_to_one_f32:
1340; GFX11:       ; %bb.0:
1341; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1342; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1343; GFX11-NEXT:    v_mov_b32_e32 v1, 1.0
1344; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1345; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1346; GFX11-NEXT:    s_endpgm
1347  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1348  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1349  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 4.0)
1350  store float %med, float addrspace(1)* %out.gep
1351  ret void
1352}
1353
1354define amdgpu_kernel void @v_clamp_constants_to_zero_f32(float addrspace(1)* %out) #0 {
1355; GFX6-LABEL: v_clamp_constants_to_zero_f32:
1356; GFX6:       ; %bb.0:
1357; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1358; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1359; GFX6-NEXT:    s_mov_b32 s2, 0
1360; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1361; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1362; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1363; GFX6-NEXT:    buffer_store_dword v1, v[0:1], s[0:3], 0 addr64
1364; GFX6-NEXT:    s_endpgm
1365;
1366; GFX8-LABEL: v_clamp_constants_to_zero_f32:
1367; GFX8:       ; %bb.0:
1368; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1369; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1370; GFX8-NEXT:    v_mov_b32_e32 v2, 0
1371; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1372; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1373; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1374; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1375; GFX8-NEXT:    flat_store_dword v[0:1], v2
1376; GFX8-NEXT:    s_endpgm
1377;
1378; GFX9-LABEL: v_clamp_constants_to_zero_f32:
1379; GFX9:       ; %bb.0:
1380; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1381; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1382; GFX9-NEXT:    v_mov_b32_e32 v1, 0
1383; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1384; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1385; GFX9-NEXT:    s_endpgm
1386;
1387; GFX11-LABEL: v_clamp_constants_to_zero_f32:
1388; GFX11:       ; %bb.0:
1389; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1390; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1391; GFX11-NEXT:    v_mov_b32_e32 v1, 0
1392; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1393; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1394; GFX11-NEXT:    s_endpgm
1395  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1396  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1397  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float -4.0)
1398  store float %med, float addrspace(1)* %out.gep
1399  ret void
1400}
1401
1402define amdgpu_kernel void @v_clamp_constant_preserve_f32(float addrspace(1)* %out) #0 {
1403; GFX6-LABEL: v_clamp_constant_preserve_f32:
1404; GFX6:       ; %bb.0:
1405; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1406; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1407; GFX6-NEXT:    s_mov_b32 s2, 0
1408; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1409; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1410; GFX6-NEXT:    v_mov_b32_e32 v2, 0.5
1411; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1412; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1413; GFX6-NEXT:    s_endpgm
1414;
1415; GFX8-LABEL: v_clamp_constant_preserve_f32:
1416; GFX8:       ; %bb.0:
1417; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1418; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1419; GFX8-NEXT:    v_mov_b32_e32 v2, 0.5
1420; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1421; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1422; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1423; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1424; GFX8-NEXT:    flat_store_dword v[0:1], v2
1425; GFX8-NEXT:    s_endpgm
1426;
1427; GFX9-LABEL: v_clamp_constant_preserve_f32:
1428; GFX9:       ; %bb.0:
1429; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1430; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1431; GFX9-NEXT:    v_mov_b32_e32 v1, 0.5
1432; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1433; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1434; GFX9-NEXT:    s_endpgm
1435;
1436; GFX11-LABEL: v_clamp_constant_preserve_f32:
1437; GFX11:       ; %bb.0:
1438; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1439; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1440; GFX11-NEXT:    v_mov_b32_e32 v1, 0.5
1441; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1442; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1443; GFX11-NEXT:    s_endpgm
1444  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1445  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1446  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0.5)
1447  store float %med, float addrspace(1)* %out.gep
1448  ret void
1449}
1450
1451define amdgpu_kernel void @v_clamp_constant_preserve_denorm_f32(float addrspace(1)* %out) #0 {
1452; GFX6-LABEL: v_clamp_constant_preserve_denorm_f32:
1453; GFX6:       ; %bb.0:
1454; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1455; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1456; GFX6-NEXT:    s_mov_b32 s2, 0
1457; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1458; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1459; GFX6-NEXT:    v_mov_b32_e32 v2, 0x7fffff
1460; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1461; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1462; GFX6-NEXT:    s_endpgm
1463;
1464; GFX8-LABEL: v_clamp_constant_preserve_denorm_f32:
1465; GFX8:       ; %bb.0:
1466; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1467; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1468; GFX8-NEXT:    v_mov_b32_e32 v2, 0x7fffff
1469; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1470; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1471; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1472; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1473; GFX8-NEXT:    flat_store_dword v[0:1], v2
1474; GFX8-NEXT:    s_endpgm
1475;
1476; GFX9-LABEL: v_clamp_constant_preserve_denorm_f32:
1477; GFX9:       ; %bb.0:
1478; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1479; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1480; GFX9-NEXT:    v_mov_b32_e32 v1, 0x7fffff
1481; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1482; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1483; GFX9-NEXT:    s_endpgm
1484;
1485; GFX11-LABEL: v_clamp_constant_preserve_denorm_f32:
1486; GFX11:       ; %bb.0:
1487; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1488; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1489; GFX11-NEXT:    v_mov_b32_e32 v1, 0x7fffff
1490; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1491; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1492; GFX11-NEXT:    s_endpgm
1493  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1494  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1495  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 8388607 to float))
1496  store float %med, float addrspace(1)* %out.gep
1497  ret void
1498}
1499
1500define amdgpu_kernel void @v_clamp_constant_qnan_f32(float addrspace(1)* %out) #0 {
1501; GFX6-LABEL: v_clamp_constant_qnan_f32:
1502; GFX6:       ; %bb.0:
1503; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1504; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1505; GFX6-NEXT:    s_mov_b32 s2, 0
1506; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1507; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1508; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1509; GFX6-NEXT:    buffer_store_dword v1, v[0:1], s[0:3], 0 addr64
1510; GFX6-NEXT:    s_endpgm
1511;
1512; GFX8-LABEL: v_clamp_constant_qnan_f32:
1513; GFX8:       ; %bb.0:
1514; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1515; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1516; GFX8-NEXT:    v_mov_b32_e32 v2, 0
1517; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1518; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1519; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1520; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1521; GFX8-NEXT:    flat_store_dword v[0:1], v2
1522; GFX8-NEXT:    s_endpgm
1523;
1524; GFX9-LABEL: v_clamp_constant_qnan_f32:
1525; GFX9:       ; %bb.0:
1526; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1527; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1528; GFX9-NEXT:    v_mov_b32_e32 v1, 0
1529; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1530; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1531; GFX9-NEXT:    s_endpgm
1532;
1533; GFX11-LABEL: v_clamp_constant_qnan_f32:
1534; GFX11:       ; %bb.0:
1535; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1536; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1537; GFX11-NEXT:    v_mov_b32_e32 v1, 0
1538; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1539; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1540; GFX11-NEXT:    s_endpgm
1541  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1542  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1543  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000)
1544  store float %med, float addrspace(1)* %out.gep
1545  ret void
1546}
1547
1548define amdgpu_kernel void @v_clamp_constant_snan_f32(float addrspace(1)* %out) #0 {
1549; GFX6-LABEL: v_clamp_constant_snan_f32:
1550; GFX6:       ; %bb.0:
1551; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
1552; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1553; GFX6-NEXT:    s_mov_b32 s2, 0
1554; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1555; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1556; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1557; GFX6-NEXT:    buffer_store_dword v1, v[0:1], s[0:3], 0 addr64
1558; GFX6-NEXT:    s_endpgm
1559;
1560; GFX8-LABEL: v_clamp_constant_snan_f32:
1561; GFX8:       ; %bb.0:
1562; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1563; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1564; GFX8-NEXT:    v_mov_b32_e32 v2, 0
1565; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1566; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1567; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
1568; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1569; GFX8-NEXT:    flat_store_dword v[0:1], v2
1570; GFX8-NEXT:    s_endpgm
1571;
1572; GFX9-LABEL: v_clamp_constant_snan_f32:
1573; GFX9:       ; %bb.0:
1574; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
1575; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1576; GFX9-NEXT:    v_mov_b32_e32 v1, 0
1577; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1578; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1579; GFX9-NEXT:    s_endpgm
1580;
1581; GFX11-LABEL: v_clamp_constant_snan_f32:
1582; GFX11:       ; %bb.0:
1583; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1584; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1585; GFX11-NEXT:    v_mov_b32_e32 v1, 0
1586; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1587; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1588; GFX11-NEXT:    s_endpgm
1589  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1590  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1591  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float))
1592  store float %med, float addrspace(1)* %out.gep
1593  ret void
1594}
1595
1596; ---------------------------------------------------------------------
1597; Test non-default behaviors enabling snans and disabling dx10_clamp
1598; ---------------------------------------------------------------------
1599
1600define amdgpu_kernel void @v_clamp_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
1601; GFX6-LABEL: v_clamp_f32_no_dx10_clamp:
1602; GFX6:       ; %bb.0:
1603; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1604; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1605; GFX6-NEXT:    s_mov_b32 s6, 0
1606; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1607; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1608; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1609; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1610; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1611; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1612; GFX6-NEXT:    s_waitcnt vmcnt(0)
1613; GFX6-NEXT:    v_add_f32_e32 v2, 0.5, v2
1614; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
1615; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1616; GFX6-NEXT:    s_endpgm
1617;
1618; GFX8-LABEL: v_clamp_f32_no_dx10_clamp:
1619; GFX8:       ; %bb.0:
1620; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1621; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1622; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1623; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1624; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1625; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1626; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1627; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1628; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1629; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1630; GFX8-NEXT:    s_waitcnt vmcnt(0)
1631; GFX8-NEXT:    v_add_f32_e32 v2, 0.5, v3
1632; GFX8-NEXT:    v_med3_f32 v2, v2, 0, 1.0
1633; GFX8-NEXT:    flat_store_dword v[0:1], v2
1634; GFX8-NEXT:    s_endpgm
1635;
1636; GFX9-LABEL: v_clamp_f32_no_dx10_clamp:
1637; GFX9:       ; %bb.0:
1638; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1639; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1640; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1641; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1642; GFX9-NEXT:    s_waitcnt vmcnt(0)
1643; GFX9-NEXT:    v_add_f32_e32 v1, 0.5, v1
1644; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
1645; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1646; GFX9-NEXT:    s_endpgm
1647;
1648; GFX11-LABEL: v_clamp_f32_no_dx10_clamp:
1649; GFX11:       ; %bb.0:
1650; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1651; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1652; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1653; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1654; GFX11-NEXT:    s_waitcnt vmcnt(0)
1655; GFX11-NEXT:    v_add_f32_e32 v1, 0.5, v1
1656; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1657; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
1658; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1659; GFX11-NEXT:    s_endpgm
1660  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1661  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1662  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1663  %a = load float, float addrspace(1)* %gep0
1664  %a.nnan = fadd nnan float %a, 0.5
1665  %max = call float @llvm.maxnum.f32(float %a.nnan, float 0.0)
1666  %med = call float @llvm.minnum.f32(float %max, float 1.0)
1667
1668  store float %med, float addrspace(1)* %out.gep
1669  ret void
1670}
1671
1672define amdgpu_kernel void @v_clamp_f32_snan_dx10clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #3 {
1673; GFX6-LABEL: v_clamp_f32_snan_dx10clamp:
1674; GFX6:       ; %bb.0:
1675; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1676; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1677; GFX6-NEXT:    s_mov_b32 s6, 0
1678; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1679; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1680; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1681; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1682; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1683; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1684; GFX6-NEXT:    s_waitcnt vmcnt(0)
1685; GFX6-NEXT:    v_add_f32_e64 v2, v2, 0.5 clamp
1686; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1687; GFX6-NEXT:    s_endpgm
1688;
1689; GFX8-LABEL: v_clamp_f32_snan_dx10clamp:
1690; GFX8:       ; %bb.0:
1691; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1692; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1693; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1694; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1695; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1696; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1697; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1698; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1699; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1700; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1701; GFX8-NEXT:    s_waitcnt vmcnt(0)
1702; GFX8-NEXT:    v_add_f32_e64 v2, v3, 0.5 clamp
1703; GFX8-NEXT:    flat_store_dword v[0:1], v2
1704; GFX8-NEXT:    s_endpgm
1705;
1706; GFX9-LABEL: v_clamp_f32_snan_dx10clamp:
1707; GFX9:       ; %bb.0:
1708; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1709; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1710; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1711; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1712; GFX9-NEXT:    s_waitcnt vmcnt(0)
1713; GFX9-NEXT:    v_add_f32_e64 v1, v1, 0.5 clamp
1714; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1715; GFX9-NEXT:    s_endpgm
1716;
1717; GFX11-LABEL: v_clamp_f32_snan_dx10clamp:
1718; GFX11:       ; %bb.0:
1719; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1720; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1721; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1722; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1723; GFX11-NEXT:    s_waitcnt vmcnt(0)
1724; GFX11-NEXT:    v_add_f32_e64 v1, v1, 0.5 clamp
1725; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1726; GFX11-NEXT:    s_endpgm
1727  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1728  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1729  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1730  %a = load float, float addrspace(1)* %gep0
1731  %add = fadd float %a, 0.5
1732  %max = call float @llvm.maxnum.f32(float %add, float 0.0)
1733  %med = call float @llvm.minnum.f32(float %max, float 1.0)
1734
1735  store float %med, float addrspace(1)* %out.gep
1736  ret void
1737}
1738
1739define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #4 {
1740; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp:
1741; GFX6:       ; %bb.0:
1742; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1743; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1744; GFX6-NEXT:    s_mov_b32 s6, 0
1745; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1746; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1747; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1748; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1749; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1750; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1751; GFX6-NEXT:    s_waitcnt vmcnt(0)
1752; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
1753; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
1754; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1755; GFX6-NEXT:    s_endpgm
1756;
1757; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp:
1758; GFX8:       ; %bb.0:
1759; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1760; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1761; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1762; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1763; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1764; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1765; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1766; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1767; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1768; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1769; GFX8-NEXT:    s_waitcnt vmcnt(0)
1770; GFX8-NEXT:    v_mul_f32_e32 v2, 1.0, v3
1771; GFX8-NEXT:    v_med3_f32 v2, v2, 0, 1.0
1772; GFX8-NEXT:    flat_store_dword v[0:1], v2
1773; GFX8-NEXT:    s_endpgm
1774;
1775; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp:
1776; GFX9:       ; %bb.0:
1777; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1778; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1779; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1780; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1781; GFX9-NEXT:    s_waitcnt vmcnt(0)
1782; GFX9-NEXT:    v_max_f32_e32 v1, v1, v1
1783; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
1784; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1785; GFX9-NEXT:    s_endpgm
1786;
1787; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp:
1788; GFX11:       ; %bb.0:
1789; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1790; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1791; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1792; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1793; GFX11-NEXT:    s_waitcnt vmcnt(0)
1794; GFX11-NEXT:    v_max_f32_e32 v1, v1, v1
1795; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1796; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
1797; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1798; GFX11-NEXT:    s_endpgm
1799  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1800  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1801  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1802  %a = load float, float addrspace(1)* %gep0
1803  %max = call float @llvm.maxnum.f32(float %a, float 0.0)
1804  %med = call float @llvm.minnum.f32(float %max, float 1.0)
1805
1806  store float %med, float addrspace(1)* %out.gep
1807  ret void
1808}
1809
1810define amdgpu_kernel void @v_clamp_f32_snan_no_dx10clamp_nnan_src(float addrspace(1)* %out, float addrspace(1)* %aptr) #4 {
1811; GFX6-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
1812; GFX6:       ; %bb.0:
1813; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1814; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1815; GFX6-NEXT:    s_mov_b32 s6, 0
1816; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1817; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1818; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1819; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1820; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1821; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1822; GFX6-NEXT:    s_waitcnt vmcnt(0)
1823; GFX6-NEXT:    v_add_f32_e32 v2, 1.0, v2
1824; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
1825; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1826; GFX6-NEXT:    s_endpgm
1827;
1828; GFX8-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
1829; GFX8:       ; %bb.0:
1830; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1831; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1832; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1833; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1834; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1835; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1836; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1837; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1838; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1839; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1840; GFX8-NEXT:    s_waitcnt vmcnt(0)
1841; GFX8-NEXT:    v_add_f32_e32 v2, 1.0, v3
1842; GFX8-NEXT:    v_med3_f32 v2, v2, 0, 1.0
1843; GFX8-NEXT:    flat_store_dword v[0:1], v2
1844; GFX8-NEXT:    s_endpgm
1845;
1846; GFX9-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
1847; GFX9:       ; %bb.0:
1848; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1849; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1850; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1851; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1852; GFX9-NEXT:    s_waitcnt vmcnt(0)
1853; GFX9-NEXT:    v_add_f32_e32 v1, 1.0, v1
1854; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
1855; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1856; GFX9-NEXT:    s_endpgm
1857;
1858; GFX11-LABEL: v_clamp_f32_snan_no_dx10clamp_nnan_src:
1859; GFX11:       ; %bb.0:
1860; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1861; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1862; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1863; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1864; GFX11-NEXT:    s_waitcnt vmcnt(0)
1865; GFX11-NEXT:    v_add_f32_e32 v1, 1.0, v1
1866; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1867; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
1868; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1869; GFX11-NEXT:    s_endpgm
1870  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1871  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1872  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1873  %a = load float, float addrspace(1)* %gep0
1874  %add  = fadd nnan float %a, 1.0
1875  %max = call float @llvm.maxnum.f32(float %add, float 0.0)
1876  %med = call float @llvm.minnum.f32(float %max, float 1.0)
1877
1878  store float %med, float addrspace(1)* %out.gep
1879  ret void
1880}
1881
1882define amdgpu_kernel void @v_clamp_med3_aby_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
1883; GFX6-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
1884; GFX6:       ; %bb.0:
1885; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1886; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1887; GFX6-NEXT:    s_mov_b32 s6, 0
1888; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1889; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1890; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1891; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1892; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1893; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1894; GFX6-NEXT:    s_waitcnt vmcnt(0)
1895; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1896; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1897; GFX6-NEXT:    s_endpgm
1898;
1899; GFX8-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
1900; GFX8:       ; %bb.0:
1901; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1902; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1903; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1904; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1905; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1906; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1907; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1908; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1909; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1910; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1911; GFX8-NEXT:    s_waitcnt vmcnt(0)
1912; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1913; GFX8-NEXT:    flat_store_dword v[0:1], v2
1914; GFX8-NEXT:    s_endpgm
1915;
1916; GFX9-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
1917; GFX9:       ; %bb.0:
1918; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1919; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1920; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1921; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1922; GFX9-NEXT:    s_waitcnt vmcnt(0)
1923; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1924; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1925; GFX9-NEXT:    s_endpgm
1926;
1927; GFX11-LABEL: v_clamp_med3_aby_f32_no_dx10_clamp:
1928; GFX11:       ; %bb.0:
1929; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1930; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1931; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1932; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1933; GFX11-NEXT:    s_waitcnt vmcnt(0)
1934; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1935; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
1936; GFX11-NEXT:    s_endpgm
1937  %tid = call i32 @llvm.amdgcn.workitem.id.x()
1938  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
1939  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
1940  %a = load float, float addrspace(1)* %gep0
1941  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float %a)
1942  store float %med, float addrspace(1)* %out.gep
1943  ret void
1944}
1945
1946define amdgpu_kernel void @v_clamp_med3_bay_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
1947; GFX6-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
1948; GFX6:       ; %bb.0:
1949; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
1950; GFX6-NEXT:    s_mov_b32 s7, 0xf000
1951; GFX6-NEXT:    s_mov_b32 s6, 0
1952; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1953; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1954; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1955; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
1956; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
1957; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
1958; GFX6-NEXT:    s_waitcnt vmcnt(0)
1959; GFX6-NEXT:    v_max_f32_e64 v2, v2, v2 clamp
1960; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
1961; GFX6-NEXT:    s_endpgm
1962;
1963; GFX8-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
1964; GFX8:       ; %bb.0:
1965; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1966; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1967; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1968; GFX8-NEXT:    v_mov_b32_e32 v1, s3
1969; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
1970; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1971; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1972; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1973; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
1974; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1975; GFX8-NEXT:    s_waitcnt vmcnt(0)
1976; GFX8-NEXT:    v_max_f32_e64 v2, v3, v3 clamp
1977; GFX8-NEXT:    flat_store_dword v[0:1], v2
1978; GFX8-NEXT:    s_endpgm
1979;
1980; GFX9-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
1981; GFX9:       ; %bb.0:
1982; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
1983; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1984; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1985; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
1986; GFX9-NEXT:    s_waitcnt vmcnt(0)
1987; GFX9-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1988; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
1989; GFX9-NEXT:    s_endpgm
1990;
1991; GFX11-LABEL: v_clamp_med3_bay_f32_no_dx10_clamp:
1992; GFX11:       ; %bb.0:
1993; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
1994; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1995; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1996; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
1997; GFX11-NEXT:    s_waitcnt vmcnt(0)
1998; GFX11-NEXT:    v_max_f32_e64 v1, v1, v1 clamp
1999; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2000; GFX11-NEXT:    s_endpgm
2001  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2002  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
2003  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2004  %a = load float, float addrspace(1)* %gep0
2005  %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float 0.0, float %a)
2006  store float %med, float addrspace(1)* %out.gep
2007  ret void
2008}
2009
2010define amdgpu_kernel void @v_clamp_med3_yab_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
2011; GFX6-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2012; GFX6:       ; %bb.0:
2013; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2014; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2015; GFX6-NEXT:    s_mov_b32 s6, 0
2016; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2017; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2018; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2019; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2020; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2021; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2022; GFX6-NEXT:    s_waitcnt vmcnt(0)
2023; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 1.0
2024; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2025; GFX6-NEXT:    s_endpgm
2026;
2027; GFX8-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2028; GFX8:       ; %bb.0:
2029; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2030; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2031; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2032; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2033; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2034; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2035; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2036; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2037; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2038; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2039; GFX8-NEXT:    s_waitcnt vmcnt(0)
2040; GFX8-NEXT:    v_med3_f32 v2, v3, 0, 1.0
2041; GFX8-NEXT:    flat_store_dword v[0:1], v2
2042; GFX8-NEXT:    s_endpgm
2043;
2044; GFX9-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2045; GFX9:       ; %bb.0:
2046; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2047; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2048; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2049; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2050; GFX9-NEXT:    s_waitcnt vmcnt(0)
2051; GFX9-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2052; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2053; GFX9-NEXT:    s_endpgm
2054;
2055; GFX11-LABEL: v_clamp_med3_yab_f32_no_dx10_clamp:
2056; GFX11:       ; %bb.0:
2057; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2058; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2059; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2060; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2061; GFX11-NEXT:    s_waitcnt vmcnt(0)
2062; GFX11-NEXT:    v_med3_f32 v1, v1, 0, 1.0
2063; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2064; GFX11-NEXT:    s_endpgm
2065  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2066  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
2067  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2068  %a = load float, float addrspace(1)* %gep0
2069  %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 0.0, float 1.0)
2070  store float %med, float addrspace(1)* %out.gep
2071  ret void
2072}
2073
2074define amdgpu_kernel void @v_clamp_med3_yba_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
2075; GFX6-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2076; GFX6:       ; %bb.0:
2077; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2078; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2079; GFX6-NEXT:    s_mov_b32 s6, 0
2080; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2081; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2082; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2083; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2084; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2085; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2086; GFX6-NEXT:    s_waitcnt vmcnt(0)
2087; GFX6-NEXT:    v_med3_f32 v2, v2, 1.0, 0
2088; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2089; GFX6-NEXT:    s_endpgm
2090;
2091; GFX8-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2092; GFX8:       ; %bb.0:
2093; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2094; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2095; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2096; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2097; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2098; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2099; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2100; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2101; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2102; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2103; GFX8-NEXT:    s_waitcnt vmcnt(0)
2104; GFX8-NEXT:    v_med3_f32 v2, v3, 1.0, 0
2105; GFX8-NEXT:    flat_store_dword v[0:1], v2
2106; GFX8-NEXT:    s_endpgm
2107;
2108; GFX9-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2109; GFX9:       ; %bb.0:
2110; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2111; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2112; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2113; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2114; GFX9-NEXT:    s_waitcnt vmcnt(0)
2115; GFX9-NEXT:    v_med3_f32 v1, v1, 1.0, 0
2116; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2117; GFX9-NEXT:    s_endpgm
2118;
2119; GFX11-LABEL: v_clamp_med3_yba_f32_no_dx10_clamp:
2120; GFX11:       ; %bb.0:
2121; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2122; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2123; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2124; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2125; GFX11-NEXT:    s_waitcnt vmcnt(0)
2126; GFX11-NEXT:    v_med3_f32 v1, v1, 1.0, 0
2127; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2128; GFX11-NEXT:    s_endpgm
2129  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2130  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
2131  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2132  %a = load float, float addrspace(1)* %gep0
2133  %med = call float @llvm.amdgcn.fmed3.f32(float %a, float 1.0, float 0.0)
2134  store float %med, float addrspace(1)* %out.gep
2135  ret void
2136}
2137
2138define amdgpu_kernel void @v_clamp_med3_ayb_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
2139; GFX6-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2140; GFX6:       ; %bb.0:
2141; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2142; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2143; GFX6-NEXT:    s_mov_b32 s6, 0
2144; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2145; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2146; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2147; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2148; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2149; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2150; GFX6-NEXT:    s_waitcnt vmcnt(0)
2151; GFX6-NEXT:    v_med3_f32 v2, 0, v2, 1.0
2152; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2153; GFX6-NEXT:    s_endpgm
2154;
2155; GFX8-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2156; GFX8:       ; %bb.0:
2157; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2158; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2159; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2160; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2161; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2162; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2163; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2164; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2165; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2166; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2167; GFX8-NEXT:    s_waitcnt vmcnt(0)
2168; GFX8-NEXT:    v_med3_f32 v2, 0, v3, 1.0
2169; GFX8-NEXT:    flat_store_dword v[0:1], v2
2170; GFX8-NEXT:    s_endpgm
2171;
2172; GFX9-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2173; GFX9:       ; %bb.0:
2174; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2175; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2176; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2177; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2178; GFX9-NEXT:    s_waitcnt vmcnt(0)
2179; GFX9-NEXT:    v_med3_f32 v1, 0, v1, 1.0
2180; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2181; GFX9-NEXT:    s_endpgm
2182;
2183; GFX11-LABEL: v_clamp_med3_ayb_f32_no_dx10_clamp:
2184; GFX11:       ; %bb.0:
2185; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2186; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2187; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2188; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2189; GFX11-NEXT:    s_waitcnt vmcnt(0)
2190; GFX11-NEXT:    v_med3_f32 v1, 0, v1, 1.0
2191; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2192; GFX11-NEXT:    s_endpgm
2193  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2194  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
2195  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2196  %a = load float, float addrspace(1)* %gep0
2197  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float %a, float 1.0)
2198  store float %med, float addrspace(1)* %out.gep
2199  ret void
2200}
2201
2202define amdgpu_kernel void @v_clamp_med3_bya_f32_no_dx10_clamp(float addrspace(1)* %out, float addrspace(1)* %aptr) #2 {
2203; GFX6-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2204; GFX6:       ; %bb.0:
2205; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2206; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2207; GFX6-NEXT:    s_mov_b32 s6, 0
2208; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2209; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2210; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2211; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2212; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2213; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2214; GFX6-NEXT:    s_waitcnt vmcnt(0)
2215; GFX6-NEXT:    v_med3_f32 v2, 1.0, v2, 0
2216; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2217; GFX6-NEXT:    s_endpgm
2218;
2219; GFX8-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2220; GFX8:       ; %bb.0:
2221; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2222; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2223; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2224; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2225; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2226; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2227; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2228; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2229; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2230; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2231; GFX8-NEXT:    s_waitcnt vmcnt(0)
2232; GFX8-NEXT:    v_med3_f32 v2, 1.0, v3, 0
2233; GFX8-NEXT:    flat_store_dword v[0:1], v2
2234; GFX8-NEXT:    s_endpgm
2235;
2236; GFX9-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2237; GFX9:       ; %bb.0:
2238; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2239; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2240; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2241; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2242; GFX9-NEXT:    s_waitcnt vmcnt(0)
2243; GFX9-NEXT:    v_med3_f32 v1, 1.0, v1, 0
2244; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2245; GFX9-NEXT:    s_endpgm
2246;
2247; GFX11-LABEL: v_clamp_med3_bya_f32_no_dx10_clamp:
2248; GFX11:       ; %bb.0:
2249; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2250; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2251; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2252; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2253; GFX11-NEXT:    s_waitcnt vmcnt(0)
2254; GFX11-NEXT:    v_med3_f32 v1, 1.0, v1, 0
2255; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2256; GFX11-NEXT:    s_endpgm
2257  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2258  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid
2259  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2260  %a = load float, float addrspace(1)* %gep0
2261  %med = call float @llvm.amdgcn.fmed3.f32(float 1.0, float %a, float 0.0)
2262  store float %med, float addrspace(1)* %out.gep
2263  ret void
2264}
2265
2266define amdgpu_kernel void @v_clamp_constant_qnan_f32_no_dx10_clamp(float addrspace(1)* %out) #2 {
2267; GFX6-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2268; GFX6:       ; %bb.0:
2269; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2270; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2271; GFX6-NEXT:    s_mov_b32 s2, 0
2272; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2273; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2274; GFX6-NEXT:    v_mov_b32_e32 v2, 0x7fc00000
2275; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2276; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2277; GFX6-NEXT:    s_endpgm
2278;
2279; GFX8-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2280; GFX8:       ; %bb.0:
2281; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2282; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2283; GFX8-NEXT:    v_mov_b32_e32 v2, 0x7fc00000
2284; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2285; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2286; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
2287; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2288; GFX8-NEXT:    flat_store_dword v[0:1], v2
2289; GFX8-NEXT:    s_endpgm
2290;
2291; GFX9-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2292; GFX9:       ; %bb.0:
2293; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2294; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2295; GFX9-NEXT:    v_mov_b32_e32 v1, 0x7fc00000
2296; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2297; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2298; GFX9-NEXT:    s_endpgm
2299;
2300; GFX11-LABEL: v_clamp_constant_qnan_f32_no_dx10_clamp:
2301; GFX11:       ; %bb.0:
2302; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
2303; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2304; GFX11-NEXT:    v_mov_b32_e32 v1, 0x7fc00000
2305; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2306; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2307; GFX11-NEXT:    s_endpgm
2308  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2309  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2310  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float 0x7FF8000000000000)
2311  store float %med, float addrspace(1)* %out.gep
2312  ret void
2313}
2314
2315define amdgpu_kernel void @v_clamp_constant_snan_f32_no_dx10_clamp(float addrspace(1)* %out) #2 {
2316; GFX6-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2317; GFX6:       ; %bb.0:
2318; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x9
2319; GFX6-NEXT:    s_mov_b32 s3, 0xf000
2320; GFX6-NEXT:    s_mov_b32 s2, 0
2321; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2322; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2323; GFX6-NEXT:    v_mov_b32_e32 v2, 0x7f800001
2324; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2325; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2326; GFX6-NEXT:    s_endpgm
2327;
2328; GFX8-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2329; GFX8:       ; %bb.0:
2330; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2331; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2332; GFX8-NEXT:    v_mov_b32_e32 v2, 0x7f800001
2333; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2334; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2335; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
2336; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2337; GFX8-NEXT:    flat_store_dword v[0:1], v2
2338; GFX8-NEXT:    s_endpgm
2339;
2340; GFX9-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2341; GFX9:       ; %bb.0:
2342; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
2343; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2344; GFX9-NEXT:    v_mov_b32_e32 v1, 0x7f800001
2345; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2346; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2347; GFX9-NEXT:    s_endpgm
2348;
2349; GFX11-LABEL: v_clamp_constant_snan_f32_no_dx10_clamp:
2350; GFX11:       ; %bb.0:
2351; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
2352; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2353; GFX11-NEXT:    v_mov_b32_e32 v1, 0x7f800001
2354; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2355; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2356; GFX11-NEXT:    s_endpgm
2357  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2358  %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid
2359  %med = call float @llvm.amdgcn.fmed3.f32(float 0.0, float 1.0, float bitcast (i32 2139095041 to float))
2360  store float %med, float addrspace(1)* %out.gep
2361  ret void
2362}
2363
2364define amdgpu_kernel void @v_clamp_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2365; GFX6-LABEL: v_clamp_v2f16:
2366; GFX6:       ; %bb.0:
2367; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2368; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2369; GFX6-NEXT:    s_mov_b32 s6, 0
2370; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2371; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2372; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2373; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2374; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2375; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2376; GFX6-NEXT:    s_waitcnt vmcnt(0)
2377; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2378; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
2379; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
2380; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2381; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2382; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2383; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
2384; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2385; GFX6-NEXT:    s_endpgm
2386;
2387; GFX8-LABEL: v_clamp_v2f16:
2388; GFX8:       ; %bb.0:
2389; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2390; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2391; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2392; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2393; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2394; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2395; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2396; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2397; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2398; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2399; GFX8-NEXT:    s_waitcnt vmcnt(0)
2400; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2401; GFX8-NEXT:    v_max_f16_e64 v3, v3, v3 clamp
2402; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2403; GFX8-NEXT:    flat_store_dword v[0:1], v2
2404; GFX8-NEXT:    s_endpgm
2405;
2406; GFX9-LABEL: v_clamp_v2f16:
2407; GFX9:       ; %bb.0:
2408; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2409; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2410; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2411; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2412; GFX9-NEXT:    s_waitcnt vmcnt(0)
2413; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
2414; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2415; GFX9-NEXT:    s_endpgm
2416;
2417; GFX11-LABEL: v_clamp_v2f16:
2418; GFX11:       ; %bb.0:
2419; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2420; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2421; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2422; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2423; GFX11-NEXT:    s_waitcnt vmcnt(0)
2424; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
2425; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2426; GFX11-NEXT:    s_endpgm
2427  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2428  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2429  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2430  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2431  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> zeroinitializer)
2432  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
2433
2434  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2435  ret void
2436}
2437
2438define amdgpu_kernel void @v_clamp_v2f16_undef_elt(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2439; GFX6-LABEL: v_clamp_v2f16_undef_elt:
2440; GFX6:       ; %bb.0:
2441; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2442; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2443; GFX6-NEXT:    s_mov_b32 s6, 0
2444; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2445; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2446; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2447; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2448; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2449; GFX6-NEXT:    s_mov_b32 s2, 0x7fc00000
2450; GFX6-NEXT:    s_waitcnt vmcnt(0)
2451; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v2
2452; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
2453; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
2454; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
2455; GFX6-NEXT:    v_max_f32_e32 v3, 0x7fc00000, v3
2456; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
2457; GFX6-NEXT:    v_med3_f32 v2, v2, 0, s2
2458; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2459; GFX6-NEXT:    v_min_f32_e32 v3, 1.0, v3
2460; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2461; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2462; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2463; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
2464; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2465; GFX6-NEXT:    s_endpgm
2466;
2467; GFX8-LABEL: v_clamp_v2f16_undef_elt:
2468; GFX8:       ; %bb.0:
2469; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2470; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2471; GFX8-NEXT:    v_mov_b32_e32 v4, 0x7e00
2472; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2473; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2474; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2475; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2476; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2477; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2478; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2479; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2480; GFX8-NEXT:    s_waitcnt vmcnt(0)
2481; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2482; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
2483; GFX8-NEXT:    v_max_f16_e32 v2, 0, v2
2484; GFX8-NEXT:    v_max_f16_e32 v3, 0x7e00, v3
2485; GFX8-NEXT:    v_min_f16_e32 v3, 1.0, v3
2486; GFX8-NEXT:    v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
2487; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2488; GFX8-NEXT:    flat_store_dword v[0:1], v2
2489; GFX8-NEXT:    s_endpgm
2490;
2491; GFX9-LABEL: v_clamp_v2f16_undef_elt:
2492; GFX9:       ; %bb.0:
2493; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2494; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2495; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2496; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2497; GFX9-NEXT:    s_waitcnt vmcnt(0)
2498; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
2499; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2500; GFX9-NEXT:    s_endpgm
2501;
2502; GFX11-LABEL: v_clamp_v2f16_undef_elt:
2503; GFX11:       ; %bb.0:
2504; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2505; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2506; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2507; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2508; GFX11-NEXT:    s_waitcnt vmcnt(0)
2509; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
2510; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2511; GFX11-NEXT:    s_endpgm
2512  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2513  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2514  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2515  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2516  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half undef, half 0.0>)
2517  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half undef>)
2518
2519  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2520  ret void
2521}
2522
2523define amdgpu_kernel void @v_clamp_v2f16_not_zero(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2524; GFX6-LABEL: v_clamp_v2f16_not_zero:
2525; GFX6:       ; %bb.0:
2526; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2527; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2528; GFX6-NEXT:    s_mov_b32 s6, 0
2529; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2530; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2531; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2532; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2533; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2534; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2535; GFX6-NEXT:    s_waitcnt vmcnt(0)
2536; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v2
2537; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
2538; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
2539; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
2540; GFX6-NEXT:    v_max_f32_e32 v3, 2.0, v3
2541; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2542; GFX6-NEXT:    v_min_f32_e32 v3, 1.0, v3
2543; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2544; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2545; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
2546; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2547; GFX6-NEXT:    s_endpgm
2548;
2549; GFX8-LABEL: v_clamp_v2f16_not_zero:
2550; GFX8:       ; %bb.0:
2551; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2552; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2553; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2554; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2555; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2556; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2557; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2558; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2559; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2560; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2561; GFX8-NEXT:    s_waitcnt vmcnt(0)
2562; GFX8-NEXT:    v_max_f16_e32 v2, v3, v3
2563; GFX8-NEXT:    v_max_f16_e32 v2, 2.0, v2
2564; GFX8-NEXT:    v_max_f16_sdwa v3, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2565; GFX8-NEXT:    v_min_f16_e32 v2, 1.0, v2
2566; GFX8-NEXT:    v_or_b32_e32 v2, v2, v3
2567; GFX8-NEXT:    flat_store_dword v[0:1], v2
2568; GFX8-NEXT:    s_endpgm
2569;
2570; GFX9-LABEL: v_clamp_v2f16_not_zero:
2571; GFX9:       ; %bb.0:
2572; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2573; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2574; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2575; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2576; GFX9-NEXT:    s_waitcnt vmcnt(0)
2577; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1
2578; GFX9-NEXT:    v_pk_max_f16 v1, v1, 2.0
2579; GFX9-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0]
2580; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2581; GFX9-NEXT:    s_endpgm
2582;
2583; GFX11-LABEL: v_clamp_v2f16_not_zero:
2584; GFX11:       ; %bb.0:
2585; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2586; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2587; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2588; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2589; GFX11-NEXT:    s_waitcnt vmcnt(0)
2590; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
2591; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2592; GFX11-NEXT:    v_pk_max_f16 v1, v1, 2.0
2593; GFX11-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel_hi:[1,0]
2594; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2595; GFX11-NEXT:    s_endpgm
2596  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2597  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2598  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2599  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2600  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 2.0, half 0.0>)
2601  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
2602
2603  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2604  ret void
2605}
2606
2607define amdgpu_kernel void @v_clamp_v2f16_not_one(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2608; GFX6-LABEL: v_clamp_v2f16_not_one:
2609; GFX6:       ; %bb.0:
2610; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2611; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2612; GFX6-NEXT:    s_mov_b32 s6, 0
2613; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2614; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2615; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2616; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2617; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2618; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2619; GFX6-NEXT:    s_waitcnt vmcnt(0)
2620; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2621; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
2622; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
2623; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
2624; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2625; GFX6-NEXT:    v_med3_f32 v2, v2, 0, 0
2626; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2627; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2628; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
2629; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2630; GFX6-NEXT:    s_endpgm
2631;
2632; GFX8-LABEL: v_clamp_v2f16_not_one:
2633; GFX8:       ; %bb.0:
2634; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2635; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2636; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2637; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2638; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2639; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2640; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2641; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2642; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2643; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2644; GFX8-NEXT:    s_waitcnt vmcnt(0)
2645; GFX8-NEXT:    v_max_f16_e32 v2, v3, v3
2646; GFX8-NEXT:    v_max_f16_e32 v2, 0, v2
2647; GFX8-NEXT:    v_max_f16_sdwa v3, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2648; GFX8-NEXT:    v_min_f16_e32 v2, 0, v2
2649; GFX8-NEXT:    v_or_b32_e32 v2, v2, v3
2650; GFX8-NEXT:    flat_store_dword v[0:1], v2
2651; GFX8-NEXT:    s_endpgm
2652;
2653; GFX9-LABEL: v_clamp_v2f16_not_one:
2654; GFX9:       ; %bb.0:
2655; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2656; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2657; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2658; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2659; GFX9-NEXT:    s_waitcnt vmcnt(0)
2660; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1
2661; GFX9-NEXT:    v_pk_max_f16 v1, v1, 0
2662; GFX9-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]
2663; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2664; GFX9-NEXT:    s_endpgm
2665;
2666; GFX11-LABEL: v_clamp_v2f16_not_one:
2667; GFX11:       ; %bb.0:
2668; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2669; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2670; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2671; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2672; GFX11-NEXT:    s_waitcnt vmcnt(0)
2673; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1
2674; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
2675; GFX11-NEXT:    v_pk_max_f16 v1, v1, 0
2676; GFX11-NEXT:    v_pk_min_f16 v1, v1, 1.0 op_sel:[0,1] op_sel_hi:[1,0]
2677; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2678; GFX11-NEXT:    s_endpgm
2679  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2680  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2681  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2682  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2683  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half 0.0>)
2684  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 0.0, half 1.0>)
2685
2686  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2687  ret void
2688}
2689
2690define amdgpu_kernel void @v_clamp_neg_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2691; GFX6-LABEL: v_clamp_neg_v2f16:
2692; GFX6:       ; %bb.0:
2693; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2694; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2695; GFX6-NEXT:    s_mov_b32 s6, 0
2696; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2697; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2698; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2699; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2700; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2701; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2702; GFX6-NEXT:    s_waitcnt vmcnt(0)
2703; GFX6-NEXT:    v_xor_b32_e32 v2, 0x80008000, v2
2704; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2705; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
2706; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
2707; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2708; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2709; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2710; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
2711; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2712; GFX6-NEXT:    s_endpgm
2713;
2714; GFX8-LABEL: v_clamp_neg_v2f16:
2715; GFX8:       ; %bb.0:
2716; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2717; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2718; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2719; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2720; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2721; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2722; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2723; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2724; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2725; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2726; GFX8-NEXT:    s_waitcnt vmcnt(0)
2727; GFX8-NEXT:    v_max_f16_sdwa v2, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2728; GFX8-NEXT:    v_max_f16_e64 v3, -v3, -v3 clamp
2729; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2730; GFX8-NEXT:    flat_store_dword v[0:1], v2
2731; GFX8-NEXT:    s_endpgm
2732;
2733; GFX9-LABEL: v_clamp_neg_v2f16:
2734; GFX9:       ; %bb.0:
2735; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2736; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2737; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2738; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2739; GFX9-NEXT:    s_waitcnt vmcnt(0)
2740; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
2741; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2742; GFX9-NEXT:    s_endpgm
2743;
2744; GFX11-LABEL: v_clamp_neg_v2f16:
2745; GFX11:       ; %bb.0:
2746; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2747; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2748; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2749; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2750; GFX11-NEXT:    s_waitcnt vmcnt(0)
2751; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
2752; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2753; GFX11-NEXT:    s_endpgm
2754  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2755  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2756  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2757  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2758  %fneg.a = fsub <2 x half> <half -0.0, half -0.0>, %a
2759  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.a, <2 x half> zeroinitializer)
2760  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
2761
2762  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2763  ret void
2764}
2765
2766define amdgpu_kernel void @v_clamp_negabs_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2767; GFX6-LABEL: v_clamp_negabs_v2f16:
2768; GFX6:       ; %bb.0:
2769; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2770; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2771; GFX6-NEXT:    s_mov_b32 s6, 0
2772; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2773; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2774; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2775; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2776; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2777; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2778; GFX6-NEXT:    s_waitcnt vmcnt(0)
2779; GFX6-NEXT:    v_or_b32_e32 v2, 0x80008000, v2
2780; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2781; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
2782; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
2783; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2784; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2785; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2786; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
2787; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2788; GFX6-NEXT:    s_endpgm
2789;
2790; GFX8-LABEL: v_clamp_negabs_v2f16:
2791; GFX8:       ; %bb.0:
2792; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2793; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2794; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2795; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2796; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2797; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2798; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2799; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2800; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2801; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2802; GFX8-NEXT:    s_waitcnt vmcnt(0)
2803; GFX8-NEXT:    v_max_f16_sdwa v2, -|v3|, -|v3| clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2804; GFX8-NEXT:    v_max_f16_e64 v3, -|v3|, -|v3| clamp
2805; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2806; GFX8-NEXT:    flat_store_dword v[0:1], v2
2807; GFX8-NEXT:    s_endpgm
2808;
2809; GFX9-LABEL: v_clamp_negabs_v2f16:
2810; GFX9:       ; %bb.0:
2811; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2812; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2813; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2814; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2815; GFX9-NEXT:    s_waitcnt vmcnt(0)
2816; GFX9-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1
2817; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
2818; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2819; GFX9-NEXT:    s_endpgm
2820;
2821; GFX11-LABEL: v_clamp_negabs_v2f16:
2822; GFX11:       ; %bb.0:
2823; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2824; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2825; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2826; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2827; GFX11-NEXT:    s_waitcnt vmcnt(0)
2828; GFX11-NEXT:    v_and_b32_e32 v1, 0x7fff7fff, v1
2829; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
2830; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1] clamp
2831; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2832; GFX11-NEXT:    s_endpgm
2833  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2834  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2835  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2836  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2837  %fabs.a = call <2 x half> @llvm.fabs.v2f16(<2 x half> %a)
2838  %fneg.fabs.a = fsub <2 x half> <half -0.0, half -0.0>, %fabs.a
2839
2840  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %fneg.fabs.a, <2 x half> zeroinitializer)
2841  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
2842
2843  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2844  ret void
2845}
2846
2847define amdgpu_kernel void @v_clamp_neglo_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2848; GFX6-LABEL: v_clamp_neglo_v2f16:
2849; GFX6:       ; %bb.0:
2850; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2851; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2852; GFX6-NEXT:    s_mov_b32 s6, 0
2853; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2854; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2855; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2856; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2857; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2858; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2859; GFX6-NEXT:    s_waitcnt vmcnt(0)
2860; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2861; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
2862; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2863; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, -v2 clamp
2864; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2865; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2866; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2867; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
2868; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2869; GFX6-NEXT:    s_endpgm
2870;
2871; GFX8-LABEL: v_clamp_neglo_v2f16:
2872; GFX8:       ; %bb.0:
2873; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2874; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2875; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2876; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2877; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2878; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2879; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2880; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2881; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2882; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2883; GFX8-NEXT:    s_waitcnt vmcnt(0)
2884; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2885; GFX8-NEXT:    v_max_f16_e64 v3, -v3, -v3 clamp
2886; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2887; GFX8-NEXT:    flat_store_dword v[0:1], v2
2888; GFX8-NEXT:    s_endpgm
2889;
2890; GFX9-LABEL: v_clamp_neglo_v2f16:
2891; GFX9:       ; %bb.0:
2892; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2893; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2894; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2895; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2896; GFX9-NEXT:    s_waitcnt vmcnt(0)
2897; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp
2898; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2899; GFX9-NEXT:    s_endpgm
2900;
2901; GFX11-LABEL: v_clamp_neglo_v2f16:
2902; GFX11:       ; %bb.0:
2903; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2904; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2905; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2906; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2907; GFX11-NEXT:    s_waitcnt vmcnt(0)
2908; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] clamp
2909; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2910; GFX11-NEXT:    s_endpgm
2911  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2912  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2913  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2914  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2915  %lo = extractelement <2 x half> %a, i32 0
2916  %neg.lo = fsub half -0.0, %lo
2917  %neg.lo.vec = insertelement <2 x half> %a, half %neg.lo, i32 0
2918  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.lo.vec, <2 x half> zeroinitializer)
2919  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
2920
2921  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2922  ret void
2923}
2924
2925define amdgpu_kernel void @v_clamp_neghi_v2f16(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
2926; GFX6-LABEL: v_clamp_neghi_v2f16:
2927; GFX6:       ; %bb.0:
2928; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
2929; GFX6-NEXT:    s_mov_b32 s7, 0xf000
2930; GFX6-NEXT:    s_mov_b32 s6, 0
2931; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2932; GFX6-NEXT:    v_mov_b32_e32 v1, 0
2933; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2934; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
2935; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
2936; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
2937; GFX6-NEXT:    s_waitcnt vmcnt(0)
2938; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2939; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, -v3 clamp
2940; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
2941; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
2942; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
2943; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
2944; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
2945; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
2946; GFX6-NEXT:    s_endpgm
2947;
2948; GFX8-LABEL: v_clamp_neghi_v2f16:
2949; GFX8:       ; %bb.0:
2950; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2951; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2952; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2953; GFX8-NEXT:    v_mov_b32_e32 v1, s3
2954; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
2955; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2956; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2957; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2958; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
2959; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2960; GFX8-NEXT:    s_waitcnt vmcnt(0)
2961; GFX8-NEXT:    v_max_f16_sdwa v2, -v3, -v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2962; GFX8-NEXT:    v_max_f16_e64 v3, v3, v3 clamp
2963; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
2964; GFX8-NEXT:    flat_store_dword v[0:1], v2
2965; GFX8-NEXT:    s_endpgm
2966;
2967; GFX9-LABEL: v_clamp_neghi_v2f16:
2968; GFX9:       ; %bb.0:
2969; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
2970; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2971; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
2972; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
2973; GFX9-NEXT:    s_waitcnt vmcnt(0)
2974; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp
2975; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
2976; GFX9-NEXT:    s_endpgm
2977;
2978; GFX11-LABEL: v_clamp_neghi_v2f16:
2979; GFX11:       ; %bb.0:
2980; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
2981; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2982; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
2983; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
2984; GFX11-NEXT:    s_waitcnt vmcnt(0)
2985; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 neg_hi:[1,1] clamp
2986; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
2987; GFX11-NEXT:    s_endpgm
2988  %tid = call i32 @llvm.amdgcn.workitem.id.x()
2989  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
2990  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
2991  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
2992  %hi = extractelement <2 x half> %a, i32 1
2993  %neg.hi = fsub half -0.0, %hi
2994  %neg.hi.vec = insertelement <2 x half> %a, half %neg.hi, i32 1
2995  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %neg.hi.vec, <2 x half> zeroinitializer)
2996  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
2997
2998  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
2999  ret void
3000}
3001
3002define amdgpu_kernel void @v_clamp_v2f16_shuffle(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
3003; GFX6-LABEL: v_clamp_v2f16_shuffle:
3004; GFX6:       ; %bb.0:
3005; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3006; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3007; GFX6-NEXT:    s_mov_b32 s6, 0
3008; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3009; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3010; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3011; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3012; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3013; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3014; GFX6-NEXT:    s_waitcnt vmcnt(0)
3015; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3016; GFX6-NEXT:    v_cvt_f32_f16_e64 v2, v2 clamp
3017; GFX6-NEXT:    v_cvt_f32_f16_e64 v3, v3 clamp
3018; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3019; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3020; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3021; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
3022; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3023; GFX6-NEXT:    s_endpgm
3024;
3025; GFX8-LABEL: v_clamp_v2f16_shuffle:
3026; GFX8:       ; %bb.0:
3027; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3028; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3029; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3030; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3031; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3032; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3033; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3034; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3035; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3036; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3037; GFX8-NEXT:    s_waitcnt vmcnt(0)
3038; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 clamp dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3039; GFX8-NEXT:    v_max_f16_sdwa v3, v3, v3 clamp dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3040; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3041; GFX8-NEXT:    flat_store_dword v[0:1], v2
3042; GFX8-NEXT:    s_endpgm
3043;
3044; GFX9-LABEL: v_clamp_v2f16_shuffle:
3045; GFX9:       ; %bb.0:
3046; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3047; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3048; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3049; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
3050; GFX9-NEXT:    s_waitcnt vmcnt(0)
3051; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp
3052; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
3053; GFX9-NEXT:    s_endpgm
3054;
3055; GFX11-LABEL: v_clamp_v2f16_shuffle:
3056; GFX11:       ; %bb.0:
3057; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3058; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3059; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3060; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3061; GFX11-NEXT:    s_waitcnt vmcnt(0)
3062; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 op_sel:[1,1] op_sel_hi:[0,0] clamp
3063; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3064; GFX11-NEXT:    s_endpgm
3065  %tid = call i32 @llvm.amdgcn.workitem.id.x()
3066  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
3067  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
3068  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
3069  %shuf = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 0>
3070  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %shuf, <2 x half> zeroinitializer)
3071  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half 1.0>)
3072
3073  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
3074  ret void
3075}
3076
3077define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts0(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
3078; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts0:
3079; GFX6:       ; %bb.0:
3080; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3081; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3082; GFX6-NEXT:    s_mov_b32 s6, 0
3083; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3084; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3085; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3086; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3087; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3088; GFX6-NEXT:    s_mov_b32 s2, 0x7fc00000
3089; GFX6-NEXT:    s_waitcnt vmcnt(0)
3090; GFX6-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
3091; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
3092; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
3093; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
3094; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
3095; GFX6-NEXT:    v_med3_f32 v3, v3, s2, 1.0
3096; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3097; GFX6-NEXT:    v_med3_f32 v2, v2, 0, s2
3098; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3099; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3100; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
3101; GFX6-NEXT:    v_or_b32_e32 v2, v2, v3
3102; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3103; GFX6-NEXT:    s_endpgm
3104;
3105; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts0:
3106; GFX8:       ; %bb.0:
3107; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3108; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3109; GFX8-NEXT:    v_mov_b32_e32 v4, 0x3c00
3110; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3111; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3112; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3113; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3114; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3115; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3116; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3117; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3118; GFX8-NEXT:    s_waitcnt vmcnt(0)
3119; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3120; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
3121; GFX8-NEXT:    v_max_f16_e32 v2, 0x7e00, v2
3122; GFX8-NEXT:    v_max_f16_e32 v3, 0, v3
3123; GFX8-NEXT:    v_min_f16_e32 v3, 0x7e00, v3
3124; GFX8-NEXT:    v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3125; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3126; GFX8-NEXT:    flat_store_dword v[0:1], v2
3127; GFX8-NEXT:    s_endpgm
3128;
3129; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts0:
3130; GFX9:       ; %bb.0:
3131; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3132; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3133; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3134; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
3135; GFX9-NEXT:    s_waitcnt vmcnt(0)
3136; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3137; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
3138; GFX9-NEXT:    s_endpgm
3139;
3140; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts0:
3141; GFX11:       ; %bb.0:
3142; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3143; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3144; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3145; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3146; GFX11-NEXT:    s_waitcnt vmcnt(0)
3147; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3148; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3149; GFX11-NEXT:    s_endpgm
3150  %tid = call i32 @llvm.amdgcn.workitem.id.x()
3151  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
3152  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
3153  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
3154  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half 0.0, half undef>)
3155  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half undef, half 1.0>)
3156
3157  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
3158  ret void
3159}
3160
3161define amdgpu_kernel void @v_clamp_v2f16_undef_limit_elts1(<2 x half> addrspace(1)* %out, <2 x half> addrspace(1)* %aptr) #0 {
3162; GFX6-LABEL: v_clamp_v2f16_undef_limit_elts1:
3163; GFX6:       ; %bb.0:
3164; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3165; GFX6-NEXT:    s_mov_b32 s7, 0xf000
3166; GFX6-NEXT:    s_mov_b32 s6, 0
3167; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3168; GFX6-NEXT:    v_mov_b32_e32 v1, 0
3169; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3170; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
3171; GFX6-NEXT:    buffer_load_dword v2, v[0:1], s[4:7], 0 addr64
3172; GFX6-NEXT:    s_mov_b32 s2, 0x7fc00000
3173; GFX6-NEXT:    s_waitcnt vmcnt(0)
3174; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v2
3175; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
3176; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
3177; GFX6-NEXT:    v_mul_f32_e32 v3, 1.0, v3
3178; GFX6-NEXT:    v_max_f32_e32 v3, 0x7fc00000, v3
3179; GFX6-NEXT:    v_mul_f32_e32 v2, 1.0, v2
3180; GFX6-NEXT:    v_med3_f32 v2, v2, 0, s2
3181; GFX6-NEXT:    v_cvt_f16_f32_e32 v2, v2
3182; GFX6-NEXT:    v_min_f32_e32 v3, 1.0, v3
3183; GFX6-NEXT:    v_cvt_f16_f32_e32 v3, v3
3184; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
3185; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3186; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
3187; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
3188; GFX6-NEXT:    s_endpgm
3189;
3190; GFX8-LABEL: v_clamp_v2f16_undef_limit_elts1:
3191; GFX8:       ; %bb.0:
3192; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3193; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
3194; GFX8-NEXT:    v_mov_b32_e32 v4, 0x7e00
3195; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3196; GFX8-NEXT:    v_mov_b32_e32 v1, s3
3197; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s2, v2
3198; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3199; GFX8-NEXT:    flat_load_dword v3, v[0:1]
3200; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v2
3201; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3202; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3203; GFX8-NEXT:    s_waitcnt vmcnt(0)
3204; GFX8-NEXT:    v_max_f16_sdwa v2, v3, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
3205; GFX8-NEXT:    v_max_f16_e32 v3, v3, v3
3206; GFX8-NEXT:    v_max_f16_e32 v2, 0, v2
3207; GFX8-NEXT:    v_max_f16_e32 v3, 0x7e00, v3
3208; GFX8-NEXT:    v_min_f16_e32 v3, 1.0, v3
3209; GFX8-NEXT:    v_min_f16_sdwa v2, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
3210; GFX8-NEXT:    v_or_b32_e32 v2, v3, v2
3211; GFX8-NEXT:    flat_store_dword v[0:1], v2
3212; GFX8-NEXT:    s_endpgm
3213;
3214; GFX9-LABEL: v_clamp_v2f16_undef_limit_elts1:
3215; GFX9:       ; %bb.0:
3216; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3217; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3218; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3219; GFX9-NEXT:    global_load_dword v1, v0, s[2:3]
3220; GFX9-NEXT:    s_waitcnt vmcnt(0)
3221; GFX9-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3222; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]
3223; GFX9-NEXT:    s_endpgm
3224;
3225; GFX11-LABEL: v_clamp_v2f16_undef_limit_elts1:
3226; GFX11:       ; %bb.0:
3227; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3228; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
3229; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3230; GFX11-NEXT:    global_load_b32 v1, v0, s[2:3]
3231; GFX11-NEXT:    s_waitcnt vmcnt(0)
3232; GFX11-NEXT:    v_pk_max_f16 v1, v1, v1 clamp
3233; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]
3234; GFX11-NEXT:    s_endpgm
3235  %tid = call i32 @llvm.amdgcn.workitem.id.x()
3236  %gep0 = getelementptr <2 x half>, <2 x half> addrspace(1)* %aptr, i32 %tid
3237  %out.gep = getelementptr <2 x half>, <2 x half> addrspace(1)* %out, i32 %tid
3238  %a = load <2 x half>, <2 x half> addrspace(1)* %gep0
3239  %max = call <2 x half> @llvm.maxnum.v2f16(<2 x half> %a, <2 x half> <half undef, half 0.0>)
3240  %med = call <2 x half> @llvm.minnum.v2f16(<2 x half> %max, <2 x half> <half 1.0, half undef>)
3241
3242  store <2 x half> %med, <2 x half> addrspace(1)* %out.gep
3243  ret void
3244}
3245
3246define amdgpu_kernel void @v_clamp_diff_source_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #0
3247; GFX6-LABEL: v_clamp_diff_source_f32:
3248; GFX6:       ; %bb.0:
3249; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3250; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3251; GFX6-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
3252; GFX6-NEXT:    s_load_dword s2, s[2:3], 0x2
3253; GFX6-NEXT:    s_mov_b32 s3, 0xf000
3254; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3255; GFX6-NEXT:    v_mov_b32_e32 v0, s5
3256; GFX6-NEXT:    v_mov_b32_e32 v1, s2
3257; GFX6-NEXT:    v_add_f32_e32 v0, s4, v0
3258; GFX6-NEXT:    v_add_f32_e32 v1, s4, v1
3259; GFX6-NEXT:    v_max_f32_e64 v0, v0, v1 clamp
3260; GFX6-NEXT:    s_mov_b32 s2, -1
3261; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0 offset:12
3262; GFX6-NEXT:    s_endpgm
3263;
3264; GFX8-LABEL: v_clamp_diff_source_f32:
3265; GFX8:       ; %bb.0:
3266; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3267; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3268; GFX8-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
3269; GFX8-NEXT:    s_load_dword s2, s[2:3], 0x8
3270; GFX8-NEXT:    s_add_u32 s0, s0, 12
3271; GFX8-NEXT:    s_addc_u32 s1, s1, 0
3272; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
3273; GFX8-NEXT:    v_mov_b32_e32 v0, s5
3274; GFX8-NEXT:    v_mov_b32_e32 v1, s2
3275; GFX8-NEXT:    v_add_f32_e32 v0, s4, v0
3276; GFX8-NEXT:    v_add_f32_e32 v1, s4, v1
3277; GFX8-NEXT:    v_max_f32_e64 v2, v0, v1 clamp
3278; GFX8-NEXT:    v_mov_b32_e32 v0, s0
3279; GFX8-NEXT:    v_mov_b32_e32 v1, s1
3280; GFX8-NEXT:    flat_store_dword v[0:1], v2
3281; GFX8-NEXT:    s_endpgm
3282;
3283; GFX9-LABEL: v_clamp_diff_source_f32:
3284; GFX9:       ; %bb.0:
3285; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3286; GFX9-NEXT:    v_mov_b32_e32 v0, 0
3287; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3288; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
3289; GFX9-NEXT:    s_load_dword s6, s[2:3], 0x8
3290; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
3291; GFX9-NEXT:    v_mov_b32_e32 v1, s5
3292; GFX9-NEXT:    v_mov_b32_e32 v2, s6
3293; GFX9-NEXT:    v_add_f32_e32 v1, s4, v1
3294; GFX9-NEXT:    v_add_f32_e32 v2, s4, v2
3295; GFX9-NEXT:    v_max_f32_e64 v1, v1, v2 clamp
3296; GFX9-NEXT:    global_store_dword v0, v1, s[0:1] offset:12
3297; GFX9-NEXT:    s_endpgm
3298;
3299; GFX11-LABEL: v_clamp_diff_source_f32:
3300; GFX11:       ; %bb.0:
3301; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
3302; GFX11-NEXT:    v_mov_b32_e32 v2, 0
3303; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3304; GFX11-NEXT:    s_clause 0x1
3305; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x0
3306; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x8
3307; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
3308; GFX11-NEXT:    v_add_f32_e64 v0, s4, s5
3309; GFX11-NEXT:    v_add_f32_e64 v1, s4, s2
3310; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3311; GFX11-NEXT:    v_max_f32_e64 v0, v0, v1 clamp
3312; GFX11-NEXT:    global_store_b32 v2, v0, s[0:1] offset:12
3313; GFX11-NEXT:    s_endpgm
3314{
3315  %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 0
3316  %gep1 = getelementptr float, float addrspace(1)* %aptr, i32 1
3317  %gep2 = getelementptr float, float addrspace(1)* %aptr, i32 2
3318  %l0 = load float, float addrspace(1)* %gep0
3319  %l1 = load float, float addrspace(1)* %gep1
3320  %l2 = load float, float addrspace(1)* %gep2
3321  %a = fadd nsz float %l0, %l1
3322  %b = fadd nsz float %l0, %l2
3323  %res = call nsz float @llvm.maxnum.f32(float %a, float %b)
3324  %max = call nsz float @llvm.maxnum.f32(float %res, float 0.0)
3325  %min = call nsz float @llvm.minnum.f32(float %max, float 1.0)
3326  %out.gep = getelementptr float, float addrspace(1)* %out, i32 3
3327  store float %min, float addrspace(1)* %out.gep
3328  ret void
3329}
3330
3331declare i32 @llvm.amdgcn.workitem.id.x() #1
3332declare float @llvm.fabs.f32(float) #1
3333declare float @llvm.minnum.f32(float, float) #1
3334declare float @llvm.maxnum.f32(float, float) #1
3335declare float @llvm.amdgcn.fmed3.f32(float, float, float) #1
3336declare double @llvm.fabs.f64(double) #1
3337declare double @llvm.minnum.f64(double, double) #1
3338declare double @llvm.maxnum.f64(double, double) #1
3339declare half @llvm.fabs.f16(half) #1
3340declare half @llvm.minnum.f16(half, half) #1
3341declare half @llvm.maxnum.f16(half, half) #1
3342declare <2 x half> @llvm.fabs.v2f16(<2 x half>) #1
3343declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>) #1
3344declare <2 x half> @llvm.maxnum.v2f16(<2 x half>, <2 x half>) #1
3345
3346attributes #0 = { nounwind "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
3347attributes #1 = { nounwind readnone }
3348attributes #2 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }
3349attributes #3 = { nounwind "amdgpu-dx10-clamp"="true" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }
3350attributes #4 = { nounwind "amdgpu-dx10-clamp"="false" "denormal-fp-math-f32"="preserve-sign,preserve-sign" "no-nans-fp-math"="false" }
3351