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