xref: /llvm-project/llvm/test/CodeGen/DirectX/clamp.ll (revision 36d757f8406a00539228e15b44bb850936871421)
1*36d757f8SAdam Yang; RUN: opt -S -dxil-intrinsic-expansion -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
28386a388SFarzon Lotfi
38386a388SFarzon Lotfi; Make sure dxil operation function calls for clamp/uclamp are generated for half/float/double/i16/i32/i64.
48386a388SFarzon Lotfi
58386a388SFarzon Lotfi; CHECK-LABEL:test_clamp_i16
68386a388SFarzon Lotfidefine noundef i16 @test_clamp_i16(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
78386a388SFarzon Lotfientry:
88386a388SFarzon Lotfi; CHECK: call i16 @dx.op.binary.i16(i32 37, i16 %{{.*}}, i16 %{{.*}})
98386a388SFarzon Lotfi; CHECK: call i16 @dx.op.binary.i16(i32 38, i16 %{{.*}}, i16 %{{.*}})
10*36d757f8SAdam Yang  %0 = call i16 @llvm.dx.sclamp.i16(i16 %a, i16 %b, i16 %c)
118386a388SFarzon Lotfi  ret i16 %0
128386a388SFarzon Lotfi}
138386a388SFarzon Lotfi
148386a388SFarzon Lotfi; CHECK-LABEL:test_clamp_i32
158386a388SFarzon Lotfidefine noundef i32 @test_clamp_i32(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
168386a388SFarzon Lotfientry:
178386a388SFarzon Lotfi; CHECK: call i32 @dx.op.binary.i32(i32 37, i32 %{{.*}}, i32 %{{.*}})
188386a388SFarzon Lotfi; CHECK: call i32 @dx.op.binary.i32(i32 38, i32 %{{.*}}, i32 %{{.*}})
19*36d757f8SAdam Yang  %0 = call i32 @llvm.dx.sclamp.i32(i32 %a, i32 %b, i32 %c)
208386a388SFarzon Lotfi  ret i32 %0
218386a388SFarzon Lotfi}
228386a388SFarzon Lotfi
238386a388SFarzon Lotfi; CHECK-LABEL:test_clamp_i64
248386a388SFarzon Lotfidefine noundef i64 @test_clamp_i64(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
258386a388SFarzon Lotfientry:
268386a388SFarzon Lotfi; CHECK: call i64 @dx.op.binary.i64(i32 37, i64 %a, i64 %b)
278386a388SFarzon Lotfi; CHECK: call i64 @dx.op.binary.i64(i32 38, i64 %{{.*}}, i64 %c)
28*36d757f8SAdam Yang  %0 = call i64 @llvm.dx.sclamp.i64(i64 %a, i64 %b, i64 %c)
298386a388SFarzon Lotfi  ret i64 %0
308386a388SFarzon Lotfi}
318386a388SFarzon Lotfi
328386a388SFarzon Lotfi; CHECK-LABEL:test_clamp_half
338386a388SFarzon Lotfidefine noundef half @test_clamp_half(half noundef %a, half noundef %b, half noundef %c) {
348386a388SFarzon Lotfientry:
358386a388SFarzon Lotfi; CHECK: call half @dx.op.binary.f16(i32 35, half %{{.*}}, half %{{.*}})
368386a388SFarzon Lotfi; CHECK: call half @dx.op.binary.f16(i32 36, half %{{.*}}, half %{{.*}})
37*36d757f8SAdam Yang  %0 = call half @llvm.dx.nclamp.f16(half %a, half %b, half %c)
388386a388SFarzon Lotfi  ret half %0
398386a388SFarzon Lotfi}
408386a388SFarzon Lotfi
418386a388SFarzon Lotfi; CHECK-LABEL:test_clamp_float
428386a388SFarzon Lotfidefine noundef float @test_clamp_float(float noundef %a, float noundef %b, float noundef %c) {
438386a388SFarzon Lotfientry:
448386a388SFarzon Lotfi; CHECK: call float @dx.op.binary.f32(i32 35, float %{{.*}}, float %{{.*}})
458386a388SFarzon Lotfi; CHECK: call float @dx.op.binary.f32(i32 36, float %{{.*}}, float %{{.*}})
46*36d757f8SAdam Yang  %0 = call float @llvm.dx.nclamp.f32(float %a, float %b, float %c)
478386a388SFarzon Lotfi  ret float %0
488386a388SFarzon Lotfi}
498386a388SFarzon Lotfi
508386a388SFarzon Lotfi; CHECK-LABEL:test_clamp_double
518386a388SFarzon Lotfidefine noundef double @test_clamp_double(double noundef %a, double noundef %b, double noundef %c) {
528386a388SFarzon Lotfientry:
538386a388SFarzon Lotfi; CHECK: call double @dx.op.binary.f64(i32 35, double %{{.*}}, double %{{.*}})
548386a388SFarzon Lotfi; CHECK: call double @dx.op.binary.f64(i32 36, double %{{.*}}, double %{{.*}})
55*36d757f8SAdam Yang  %0 = call double @llvm.dx.nclamp.f64(double %a, double %b, double %c)
568386a388SFarzon Lotfi  ret double %0
578386a388SFarzon Lotfi}
588386a388SFarzon Lotfi
598386a388SFarzon Lotfi; CHECK-LABEL:test_uclamp_i16
608386a388SFarzon Lotfidefine noundef i16 @test_uclamp_i16(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
618386a388SFarzon Lotfientry:
628386a388SFarzon Lotfi; CHECK: call i16 @dx.op.binary.i16(i32 39, i16 %{{.*}}, i16 %{{.*}})
638386a388SFarzon Lotfi; CHECK: call i16 @dx.op.binary.i16(i32 40, i16 %{{.*}}, i16 %{{.*}})
648386a388SFarzon Lotfi  %0 = call i16 @llvm.dx.uclamp.i16(i16 %a, i16 %b, i16 %c)
658386a388SFarzon Lotfi  ret i16 %0
668386a388SFarzon Lotfi}
678386a388SFarzon Lotfi
688386a388SFarzon Lotfi; CHECK-LABEL:test_uclamp_i32
698386a388SFarzon Lotfidefine noundef i32 @test_uclamp_i32(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
708386a388SFarzon Lotfientry:
718386a388SFarzon Lotfi; CHECK: call i32 @dx.op.binary.i32(i32 39, i32 %{{.*}}, i32 %{{.*}})
728386a388SFarzon Lotfi; CHECK: call i32 @dx.op.binary.i32(i32 40, i32 %{{.*}}, i32 %{{.*}})
738386a388SFarzon Lotfi  %0 = call i32 @llvm.dx.uclamp.i32(i32 %a, i32 %b, i32 %c)
748386a388SFarzon Lotfi  ret i32 %0
758386a388SFarzon Lotfi}
768386a388SFarzon Lotfi
778386a388SFarzon Lotfi; CHECK-LABEL:test_uclamp_i64
788386a388SFarzon Lotfidefine noundef i64 @test_uclamp_i64(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
798386a388SFarzon Lotfientry:
808386a388SFarzon Lotfi; CHECK: call i64 @dx.op.binary.i64(i32 39, i64 %a, i64 %b)
818386a388SFarzon Lotfi; CHECK: call i64 @dx.op.binary.i64(i32 40, i64 %{{.*}}, i64 %c)
828386a388SFarzon Lotfi  %0 = call i64 @llvm.dx.uclamp.i64(i64 %a, i64 %b, i64 %c)
838386a388SFarzon Lotfi  ret i64 %0
848386a388SFarzon Lotfi}
858386a388SFarzon Lotfi
86*36d757f8SAdam Yangdeclare half @llvm.dx.nclamp.f16(half, half, half)
87*36d757f8SAdam Yangdeclare float @llvm.dx.nclamp.f32(float, float, float)
88*36d757f8SAdam Yangdeclare double @llvm.dx.nclamp.f64(double, double, double)
89*36d757f8SAdam Yangdeclare i16 @llvm.dx.sclamp.i16(i16, i16, i16)
90*36d757f8SAdam Yangdeclare i32 @llvm.dx.sclamp.i32(i32, i32, i32)
91*36d757f8SAdam Yangdeclare i64 @llvm.dx.sclamp.i64(i64, i64, i64)
928386a388SFarzon Lotfideclare i16 @llvm.dx.uclamp.i16(i16, i16, i16)
938386a388SFarzon Lotfideclare i32 @llvm.dx.uclamp.i32(i32, i32, i32)
948386a388SFarzon Lotfideclare i64 @llvm.dx.uclamp.i64(i64, i64, i64)
95*36d757f8SAdam Yang
96*36d757f8SAdam Yang; CHECK-LABEL: clamp_half3
97*36d757f8SAdam Yangdefine noundef <3 x half> @clamp_half3(<3 x half> noundef %a, <3 x half> noundef %b, <3 x half> noundef %c) {
98*36d757f8SAdam Yangentry:
99*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <3 x half> %a, i64 0
100*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <3 x half> %a, i64 1
101*36d757f8SAdam Yang  ; CHECK-DAG: %[[a2:.+]] = extractelement <3 x half> %a, i64 2
102*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <3 x half> %b, i64 0
103*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <3 x half> %b, i64 1
104*36d757f8SAdam Yang  ; CHECK-DAG: %[[b2:.+]] = extractelement <3 x half> %b, i64 2
105*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <3 x half> %c, i64 0
106*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <3 x half> %c, i64 1
107*36d757f8SAdam Yang  ; CHECK-DAG: %[[c2:.+]] = extractelement <3 x half> %c, i64 2
108*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call half @dx.op.binary.f16(i32 35, half %[[a0]], half %[[b0]])
109*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call half @dx.op.binary.f16(i32 35, half %[[a1]], half %[[b1]])
110*36d757f8SAdam Yang  ; CHECK-DAG: %[[max2:.+]] = call half @dx.op.binary.f16(i32 35, half %[[a2]], half %[[b2]])
111*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call half @dx.op.binary.f16(i32 36, half %[[max0]], half %[[c0]])
112*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call half @dx.op.binary.f16(i32 36, half %[[max1]], half %[[c1]])
113*36d757f8SAdam Yang  ; CHECK-DAG: %[[min2:.+]] = call half @dx.op.binary.f16(i32 36, half %[[max2]], half %[[c2]])
114*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <3 x half> poison, half %[[min0]], i64 0
115*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <3 x half> %[[ret0]], half %[[min1]], i64 1
116*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret2:.+]] = insertelement <3 x half> %[[ret1]], half %[[min2]], i64 2
117*36d757f8SAdam Yang  ; CHECK: ret <3 x half> %[[ret2]]
118*36d757f8SAdam Yang  %dx.clamp = call <3 x half> @llvm.dx.nclamp.v3f16(<3 x half> %a, <3 x half> %b, <3 x half> %c)
119*36d757f8SAdam Yang  ret <3 x half> %dx.clamp
120*36d757f8SAdam Yang}
121*36d757f8SAdam Yang
122*36d757f8SAdam Yang; CHECK-LABEL: clamp_float4
123*36d757f8SAdam Yangdefine noundef <4 x float> @clamp_float4(<4 x float> noundef %a, <4 x float> noundef %b, <4 x float> noundef %c) {
124*36d757f8SAdam Yangentry:
125*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <4 x float> %a, i64 0
126*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <4 x float> %a, i64 1
127*36d757f8SAdam Yang  ; CHECK-DAG: %[[a2:.+]] = extractelement <4 x float> %a, i64 2
128*36d757f8SAdam Yang  ; CHECK-DAG: %[[a3:.+]] = extractelement <4 x float> %a, i64 3
129*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <4 x float> %b, i64 0
130*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <4 x float> %b, i64 1
131*36d757f8SAdam Yang  ; CHECK-DAG: %[[b2:.+]] = extractelement <4 x float> %b, i64 2
132*36d757f8SAdam Yang  ; CHECK-DAG: %[[b3:.+]] = extractelement <4 x float> %b, i64 3
133*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <4 x float> %c, i64 0
134*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <4 x float> %c, i64 1
135*36d757f8SAdam Yang  ; CHECK-DAG: %[[c2:.+]] = extractelement <4 x float> %c, i64 2
136*36d757f8SAdam Yang  ; CHECK-DAG: %[[c3:.+]] = extractelement <4 x float> %c, i64 3
137*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call float @dx.op.binary.f32(i32 35, float %[[a0]], float %[[b0]])
138*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call float @dx.op.binary.f32(i32 35, float %[[a1]], float %[[b1]])
139*36d757f8SAdam Yang  ; CHECK-DAG: %[[max2:.+]] = call float @dx.op.binary.f32(i32 35, float %[[a2]], float %[[b2]])
140*36d757f8SAdam Yang  ; CHECK-DAG: %[[max3:.+]] = call float @dx.op.binary.f32(i32 35, float %[[a3]], float %[[b3]])
141*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call float @dx.op.binary.f32(i32 36, float %[[max0]], float %[[c0]])
142*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call float @dx.op.binary.f32(i32 36, float %[[max1]], float %[[c1]])
143*36d757f8SAdam Yang  ; CHECK-DAG: %[[min2:.+]] = call float @dx.op.binary.f32(i32 36, float %[[max2]], float %[[c2]])
144*36d757f8SAdam Yang  ; CHECK-DAG: %[[min3:.+]] = call float @dx.op.binary.f32(i32 36, float %[[max3]], float %[[c3]])
145*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <4 x float> poison, float %[[min0]], i64 0
146*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <4 x float> %[[ret0]], float %[[min1]], i64 1
147*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret2:.+]] = insertelement <4 x float> %[[ret1]], float %[[min2]], i64 2
148*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret3:.+]] = insertelement <4 x float> %[[ret2]], float %[[min3]], i64 3
149*36d757f8SAdam Yang  ; CHECK: ret <4 x float> %[[ret3]]
150*36d757f8SAdam Yang  %dx.clamp = call <4 x float> @llvm.dx.nclamp.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c)
151*36d757f8SAdam Yang  ret <4 x float> %dx.clamp
152*36d757f8SAdam Yang}
153*36d757f8SAdam Yang
154*36d757f8SAdam Yang; CHECK-LABEL: clamp_double2
155*36d757f8SAdam Yangdefine noundef <2 x double> @clamp_double2(<2 x double> noundef %a, <2 x double> noundef %b, <2 x double> noundef %c) {
156*36d757f8SAdam Yangentry:
157*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <2 x double> %a, i64 0
158*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <2 x double> %a, i64 1
159*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <2 x double> %b, i64 0
160*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <2 x double> %b, i64 1
161*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <2 x double> %c, i64 0
162*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <2 x double> %c, i64 1
163*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call double @dx.op.binary.f64(i32 35, double %[[a0]], double %[[b0]])
164*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call double @dx.op.binary.f64(i32 35, double %[[a1]], double %[[b1]])
165*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call double @dx.op.binary.f64(i32 36, double %[[max0]], double %[[c0]])
166*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call double @dx.op.binary.f64(i32 36, double %[[max1]], double %[[c1]])
167*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <2 x double> poison, double %[[min0]], i64 0
168*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <2 x double> %[[ret0]], double %[[min1]], i64 1
169*36d757f8SAdam Yang  ; CHECK: ret <2 x double> %[[ret1]]
170*36d757f8SAdam Yang  %dx.clamp = call <2 x double> @llvm.dx.nclamp.v2f64(<2 x double> %a, <2 x double> %b, <2 x double> %c)
171*36d757f8SAdam Yang  ret <2 x double> %dx.clamp
172*36d757f8SAdam Yang}
173*36d757f8SAdam Yang
174*36d757f8SAdam Yang; CHECK-LABEL: clamp_int4
175*36d757f8SAdam Yangdefine noundef <4 x i32> @clamp_int4(<4 x i32> noundef %a, <4 x i32> noundef %b, <4 x i32> noundef %c) {
176*36d757f8SAdam Yangentry:
177*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <4 x i32> %a, i64 0
178*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <4 x i32> %a, i64 1
179*36d757f8SAdam Yang  ; CHECK-DAG: %[[a2:.+]] = extractelement <4 x i32> %a, i64 2
180*36d757f8SAdam Yang  ; CHECK-DAG: %[[a3:.+]] = extractelement <4 x i32> %a, i64 3
181*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <4 x i32> %b, i64 0
182*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <4 x i32> %b, i64 1
183*36d757f8SAdam Yang  ; CHECK-DAG: %[[b2:.+]] = extractelement <4 x i32> %b, i64 2
184*36d757f8SAdam Yang  ; CHECK-DAG: %[[b3:.+]] = extractelement <4 x i32> %b, i64 3
185*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <4 x i32> %c, i64 0
186*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <4 x i32> %c, i64 1
187*36d757f8SAdam Yang  ; CHECK-DAG: %[[c2:.+]] = extractelement <4 x i32> %c, i64 2
188*36d757f8SAdam Yang  ; CHECK-DAG: %[[c3:.+]] = extractelement <4 x i32> %c, i64 3
189*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call i32 @dx.op.binary.i32(i32 37, i32 %[[a0]], i32 %[[b0]])
190*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call i32 @dx.op.binary.i32(i32 37, i32 %[[a1]], i32 %[[b1]])
191*36d757f8SAdam Yang  ; CHECK-DAG: %[[max2:.+]] = call i32 @dx.op.binary.i32(i32 37, i32 %[[a2]], i32 %[[b2]])
192*36d757f8SAdam Yang  ; CHECK-DAG: %[[max3:.+]] = call i32 @dx.op.binary.i32(i32 37, i32 %[[a3]], i32 %[[b3]])
193*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call i32 @dx.op.binary.i32(i32 38, i32 %[[max0]], i32 %[[c0]])
194*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call i32 @dx.op.binary.i32(i32 38, i32 %[[max1]], i32 %[[c1]])
195*36d757f8SAdam Yang  ; CHECK-DAG: %[[min2:.+]] = call i32 @dx.op.binary.i32(i32 38, i32 %[[max2]], i32 %[[c2]])
196*36d757f8SAdam Yang  ; CHECK-DAG: %[[min3:.+]] = call i32 @dx.op.binary.i32(i32 38, i32 %[[max3]], i32 %[[c3]])
197*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <4 x i32> poison, i32 %[[min0]], i64 0
198*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <4 x i32> %[[ret0]], i32 %[[min1]], i64 1
199*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret2:.+]] = insertelement <4 x i32> %[[ret1]], i32 %[[min2]], i64 2
200*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret3:.+]] = insertelement <4 x i32> %[[ret2]], i32 %[[min3]], i64 3
201*36d757f8SAdam Yang  ; CHECK: ret <4 x i32> %[[ret3]]
202*36d757f8SAdam Yang  %dx.clamp = call <4 x i32> @llvm.dx.sclamp.v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c)
203*36d757f8SAdam Yang  ret <4 x i32> %dx.clamp
204*36d757f8SAdam Yang}
205*36d757f8SAdam Yang
206*36d757f8SAdam Yang; CHECK-LABEL: clamp_uint16_t3
207*36d757f8SAdam Yangdefine noundef <3 x i16> @clamp_uint16_t3(<3 x i16> noundef %a, <3 x i16> noundef %b, <3 x i16> noundef %c) {
208*36d757f8SAdam Yangentry:
209*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <3 x i16> %a, i64 0
210*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <3 x i16> %a, i64 1
211*36d757f8SAdam Yang  ; CHECK-DAG: %[[a2:.+]] = extractelement <3 x i16> %a, i64 2
212*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <3 x i16> %b, i64 0
213*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <3 x i16> %b, i64 1
214*36d757f8SAdam Yang  ; CHECK-DAG: %[[b2:.+]] = extractelement <3 x i16> %b, i64 2
215*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <3 x i16> %c, i64 0
216*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <3 x i16> %c, i64 1
217*36d757f8SAdam Yang  ; CHECK-DAG: %[[c2:.+]] = extractelement <3 x i16> %c, i64 2
218*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call i16 @dx.op.binary.i16(i32 39, i16 %[[a0]], i16 %[[b0]])
219*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call i16 @dx.op.binary.i16(i32 39, i16 %[[a1]], i16 %[[b1]])
220*36d757f8SAdam Yang  ; CHECK-DAG: %[[max2:.+]] = call i16 @dx.op.binary.i16(i32 39, i16 %[[a2]], i16 %[[b2]])
221*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call i16 @dx.op.binary.i16(i32 40, i16 %[[max0]], i16 %[[c0]])
222*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call i16 @dx.op.binary.i16(i32 40, i16 %[[max1]], i16 %[[c1]])
223*36d757f8SAdam Yang  ; CHECK-DAG: %[[min2:.+]] = call i16 @dx.op.binary.i16(i32 40, i16 %[[max2]], i16 %[[c2]])
224*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <3 x i16> poison, i16 %[[min0]], i64 0
225*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <3 x i16> %[[ret0]], i16 %[[min1]], i64 1
226*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret2:.+]] = insertelement <3 x i16> %[[ret1]], i16 %[[min2]], i64 2
227*36d757f8SAdam Yang  ; CHECK: ret <3 x i16> %[[ret2]]
228*36d757f8SAdam Yang  %dx.clamp = call <3 x i16> @llvm.dx.uclamp.v3i16(<3 x i16> %a, <3 x i16> %b, <3 x i16> %c)
229*36d757f8SAdam Yang  ret <3 x i16> %dx.clamp
230*36d757f8SAdam Yang}
231*36d757f8SAdam Yang
232*36d757f8SAdam Yang; CHECK-LABEL: clamp_uint4
233*36d757f8SAdam Yangdefine noundef <4 x i32> @clamp_uint4(<4 x i32> noundef %a, <4 x i32> noundef %b, <4 x i32> noundef %c) {
234*36d757f8SAdam Yangentry:
235*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <4 x i32> %a, i64 0
236*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <4 x i32> %a, i64 1
237*36d757f8SAdam Yang  ; CHECK-DAG: %[[a2:.+]] = extractelement <4 x i32> %a, i64 2
238*36d757f8SAdam Yang  ; CHECK-DAG: %[[a3:.+]] = extractelement <4 x i32> %a, i64 3
239*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <4 x i32> %b, i64 0
240*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <4 x i32> %b, i64 1
241*36d757f8SAdam Yang  ; CHECK-DAG: %[[b2:.+]] = extractelement <4 x i32> %b, i64 2
242*36d757f8SAdam Yang  ; CHECK-DAG: %[[b3:.+]] = extractelement <4 x i32> %b, i64 3
243*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <4 x i32> %c, i64 0
244*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <4 x i32> %c, i64 1
245*36d757f8SAdam Yang  ; CHECK-DAG: %[[c2:.+]] = extractelement <4 x i32> %c, i64 2
246*36d757f8SAdam Yang  ; CHECK-DAG: %[[c3:.+]] = extractelement <4 x i32> %c, i64 3
247*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call i32 @dx.op.binary.i32(i32 39, i32 %[[a0]], i32 %[[b0]])
248*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call i32 @dx.op.binary.i32(i32 39, i32 %[[a1]], i32 %[[b1]])
249*36d757f8SAdam Yang  ; CHECK-DAG: %[[max2:.+]] = call i32 @dx.op.binary.i32(i32 39, i32 %[[a2]], i32 %[[b2]])
250*36d757f8SAdam Yang  ; CHECK-DAG: %[[max3:.+]] = call i32 @dx.op.binary.i32(i32 39, i32 %[[a3]], i32 %[[b3]])
251*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call i32 @dx.op.binary.i32(i32 40, i32 %[[max0]], i32 %[[c0]])
252*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call i32 @dx.op.binary.i32(i32 40, i32 %[[max1]], i32 %[[c1]])
253*36d757f8SAdam Yang  ; CHECK-DAG: %[[min2:.+]] = call i32 @dx.op.binary.i32(i32 40, i32 %[[max2]], i32 %[[c2]])
254*36d757f8SAdam Yang  ; CHECK-DAG: %[[min3:.+]] = call i32 @dx.op.binary.i32(i32 40, i32 %[[max3]], i32 %[[c3]])
255*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <4 x i32> poison, i32 %[[min0]], i64 0
256*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <4 x i32> %[[ret0]], i32 %[[min1]], i64 1
257*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret2:.+]] = insertelement <4 x i32> %[[ret1]], i32 %[[min2]], i64 2
258*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret3:.+]] = insertelement <4 x i32> %[[ret2]], i32 %[[min3]], i64 3
259*36d757f8SAdam Yang  ; CHECK: ret <4 x i32> %[[ret3]]
260*36d757f8SAdam Yang  %dx.clamp = call <4 x i32> @llvm.dx.uclamp.v4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c)
261*36d757f8SAdam Yang  ret <4 x i32> %dx.clamp
262*36d757f8SAdam Yang}
263*36d757f8SAdam Yang
264*36d757f8SAdam Yang; CHECK-LABEL: clamp_uint64_t4
265*36d757f8SAdam Yangdefine noundef <2 x i64> @clamp_uint64_t4(<2 x i64> noundef %a, <2 x i64> noundef %b, <2 x i64> noundef %c) {
266*36d757f8SAdam Yangentry:
267*36d757f8SAdam Yang  ; CHECK-DAG: %[[a0:.+]] = extractelement <2 x i64> %a, i64 0
268*36d757f8SAdam Yang  ; CHECK-DAG: %[[a1:.+]] = extractelement <2 x i64> %a, i64 1
269*36d757f8SAdam Yang  ; CHECK-DAG: %[[b0:.+]] = extractelement <2 x i64> %b, i64 0
270*36d757f8SAdam Yang  ; CHECK-DAG: %[[b1:.+]] = extractelement <2 x i64> %b, i64 1
271*36d757f8SAdam Yang  ; CHECK-DAG: %[[c0:.+]] = extractelement <2 x i64> %c, i64 0
272*36d757f8SAdam Yang  ; CHECK-DAG: %[[c1:.+]] = extractelement <2 x i64> %c, i64 1
273*36d757f8SAdam Yang  ; CHECK-DAG: %[[max0:.+]] = call i64 @dx.op.binary.i64(i32 39, i64 %[[a0]], i64 %[[b0]])
274*36d757f8SAdam Yang  ; CHECK-DAG: %[[max1:.+]] = call i64 @dx.op.binary.i64(i32 39, i64 %[[a1]], i64 %[[b1]])
275*36d757f8SAdam Yang  ; CHECK-DAG: %[[min0:.+]] = call i64 @dx.op.binary.i64(i32 40, i64 %[[max0]], i64 %[[c0]])
276*36d757f8SAdam Yang  ; CHECK-DAG: %[[min1:.+]] = call i64 @dx.op.binary.i64(i32 40, i64 %[[max1]], i64 %[[c1]])
277*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret0:.+]] = insertelement <2 x i64> poison, i64 %[[min0]], i64 0
278*36d757f8SAdam Yang  ; CHECK-DAG: %[[ret1:.+]] = insertelement <2 x i64> %[[ret0]], i64 %[[min1]], i64 1
279*36d757f8SAdam Yang  ; CHECK: ret <2 x i64> %[[ret1]]
280*36d757f8SAdam Yang  %dx.clamp = call <2 x i64> @llvm.dx.uclamp.v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c)
281*36d757f8SAdam Yang  ret <2 x i64> %dx.clamp
282*36d757f8SAdam Yang}
283*36d757f8SAdam Yang
284*36d757f8SAdam Yang
285*36d757f8SAdam Yangdeclare <3 x half> @llvm.dx.nclamp.v3f16(<3 x half>, <3 x half>, <3 x half>)
286*36d757f8SAdam Yangdeclare <4 x float> @llvm.dx.nclamp.v4f32(<4 x float>, <4 x float>, <4 x float>)
287*36d757f8SAdam Yangdeclare <2 x double> @llvm.dx.nclamp.v2f64(<2 x double>, <2 x double>, <2 x double>)
288*36d757f8SAdam Yangdeclare <4 x i32> @llvm.dx.sclamp.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
289*36d757f8SAdam Yangdeclare <3 x i16> @llvm.dx.uclamp.v3i32(<3 x i16>, <3 x i32>, <3 x i16>)
290*36d757f8SAdam Yangdeclare <4 x i32> @llvm.dx.uclamp.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
291*36d757f8SAdam Yangdeclare <2 x i64> @llvm.dx.uclamp.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)
292*36d757f8SAdam Yang
293