182 lines · plain
1// RUN: %clang_cc1 -std=hlsl202x -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -fnative-int16-type -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,NATIVE_HALF -DFNATTRS="hidden noundef nofpclass(nan inf)" -DTARGET=dx2// RUN: %clang_cc1 -std=hlsl202x -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,NO_HALF -DFNATTRS="hidden noundef nofpclass(nan inf)" -DTARGET=dx3// RUN: %clang_cc1 -std=hlsl202x -finclude-default-header -x hlsl -triple spirv-unknown-vulkan-compute %s -fnative-half-type -fnative-int16-type -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,NATIVE_HALF -DFNATTRS="hidden spir_func noundef nofpclass(nan inf)" -DTARGET=spv4// RUN: %clang_cc1 -std=hlsl202x -finclude-default-header -x hlsl -triple spirv-unknown-vulkan-compute %s -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,NO_HALF -DFNATTRS="hidden spir_func noundef nofpclass(nan inf)" -DTARGET=spv5 6// CHECK: define [[FNATTRS]] float @_Z16test_lerp_doubled(7// CHECK: [[CONV0:%.*]] = fptrunc {{.*}} double %{{.*}} to float8// CHECK: [[CONV1:%.*]] = fptrunc {{.*}} double %{{.*}} to float9// CHECK: [[CONV2:%.*]] = fptrunc {{.*}} double %{{.*}} to float10// CHECK: [[LERP:%.*]] = call {{.*}} float @llvm.[[TARGET]].lerp.f32(float [[CONV0]], float [[CONV1]], float [[CONV2]])11// CHECK: ret float [[LERP]]12float test_lerp_double(double p0) { return lerp(p0, p0, p0); }13 14// CHECK: define [[FNATTRS]] <2 x float> @_Z17test_lerp_double2Dv2_d(15// CHECK: [[CONV0:%.*]] = fptrunc {{.*}} <2 x double> %{{.*}} to <2 x float>16// CHECK: [[CONV1:%.*]] = fptrunc {{.*}} <2 x double> %{{.*}} to <2 x float>17// CHECK: [[CONV2:%.*]] = fptrunc {{.*}} <2 x double> %{{.*}} to <2 x float>18// CHECK: [[LERP:%.*]] = call {{.*}} <2 x float> @llvm.[[TARGET]].lerp.v2f32(<2 x float> [[CONV0]], <2 x float> [[CONV1]], <2 x float> [[CONV2]])19// CHECK: ret <2 x float> [[LERP]]20float2 test_lerp_double2(double2 p0) { return lerp(p0, p0, p0); }21 22// CHECK: define [[FNATTRS]] <3 x float> @_Z17test_lerp_double3Dv3_d(23// CHECK: [[CONV0:%.*]] = fptrunc {{.*}} <3 x double> %{{.*}} to <3 x float>24// CHECK: [[CONV1:%.*]] = fptrunc {{.*}} <3 x double> %{{.*}} to <3 x float>25// CHECK: [[CONV2:%.*]] = fptrunc {{.*}} <3 x double> %{{.*}} to <3 x float>26// CHECK: [[LERP:%.*]] = call {{.*}} <3 x float> @llvm.[[TARGET]].lerp.v3f32(<3 x float> [[CONV0]], <3 x float> [[CONV1]], <3 x float> [[CONV2]])27// CHECK: ret <3 x float> [[LERP]]28float3 test_lerp_double3(double3 p0) { return lerp(p0, p0, p0); }29 30// CHECK: define [[FNATTRS]] <4 x float> @_Z17test_lerp_double4Dv4_d(31// CHECK: [[CONV0:%.*]] = fptrunc {{.*}} <4 x double> %{{.*}} to <4 x float>32// CHECK: [[CONV1:%.*]] = fptrunc {{.*}} <4 x double> %{{.*}} to <4 x float>33// CHECK: [[CONV2:%.*]] = fptrunc {{.*}} <4 x double> %{{.*}} to <4 x float>34// CHECK: [[LERP:%.*]] = call {{.*}} <4 x float> @llvm.[[TARGET]].lerp.v4f32(<4 x float> [[CONV0]], <4 x float> [[CONV1]], <4 x float> [[CONV2]])35// CHECK: ret <4 x float> [[LERP]]36float4 test_lerp_double4(double4 p0) { return lerp(p0, p0, p0); }37 38// CHECK: define [[FNATTRS]] float @_Z13test_lerp_inti(39// CHECK: [[CONV0:%.*]] = sitofp i32 %{{.*}} to float40// CHECK: [[CONV1:%.*]] = sitofp i32 %{{.*}} to float41// CHECK: [[CONV2:%.*]] = sitofp i32 %{{.*}} to float42// CHECK: [[LERP:%.*]] = call {{.*}} float @llvm.[[TARGET]].lerp.f32(float [[CONV0]], float [[CONV1]], float [[CONV2]])43// CHECK: ret float [[LERP]]44float test_lerp_int(int p0) { return lerp(p0, p0, p0); }45 46// CHECK: define [[FNATTRS]] <2 x float> @_Z14test_lerp_int2Dv2_i(47// CHECK: [[CONV0:%.*]] = sitofp <2 x i32> %{{.*}} to <2 x float>48// CHECK: [[CONV1:%.*]] = sitofp <2 x i32> %{{.*}} to <2 x float>49// CHECK: [[CONV2:%.*]] = sitofp <2 x i32> %{{.*}} to <2 x float>50// CHECK: [[LERP:%.*]] = call {{.*}} <2 x float> @llvm.[[TARGET]].lerp.v2f32(<2 x float> [[CONV0]], <2 x float> [[CONV1]], <2 x float> [[CONV2]])51// CHECK: ret <2 x float> [[LERP]]52float2 test_lerp_int2(int2 p0) { return lerp(p0, p0, p0); }53 54// CHECK: define [[FNATTRS]] <3 x float> @_Z14test_lerp_int3Dv3_i(55// CHECK: [[CONV0:%.*]] = sitofp <3 x i32> %{{.*}} to <3 x float>56// CHECK: [[CONV1:%.*]] = sitofp <3 x i32> %{{.*}} to <3 x float>57// CHECK: [[CONV2:%.*]] = sitofp <3 x i32> %{{.*}} to <3 x float>58// CHECK: [[LERP:%.*]] = call {{.*}} <3 x float> @llvm.[[TARGET]].lerp.v3f32(<3 x float> [[CONV0]], <3 x float> [[CONV1]], <3 x float> [[CONV2]])59// CHECK: ret <3 x float> [[LERP]]60float3 test_lerp_int3(int3 p0) { return lerp(p0, p0, p0); }61 62// CHECK: define [[FNATTRS]] <4 x float> @_Z14test_lerp_int4Dv4_i(63// CHECK: [[CONV0:%.*]] = sitofp <4 x i32> %{{.*}} to <4 x float>64// CHECK: [[CONV1:%.*]] = sitofp <4 x i32> %{{.*}} to <4 x float>65// CHECK: [[CONV2:%.*]] = sitofp <4 x i32> %{{.*}} to <4 x float>66// CHECK: [[LERP:%.*]] = call {{.*}} <4 x float> @llvm.[[TARGET]].lerp.v4f32(<4 x float> [[CONV0]], <4 x float> [[CONV1]], <4 x float> [[CONV2]])67// CHECK: ret <4 x float> [[LERP]]68float4 test_lerp_int4(int4 p0) { return lerp(p0, p0, p0); }69 70// CHECK: define [[FNATTRS]] float @_Z14test_lerp_uintj(71// CHECK: [[CONV0:%.*]] = uitofp i32 %{{.*}} to float72// CHECK: [[CONV1:%.*]] = uitofp i32 %{{.*}} to float73// CHECK: [[CONV2:%.*]] = uitofp i32 %{{.*}} to float74// CHECK: [[LERP:%.*]] = call {{.*}} float @llvm.[[TARGET]].lerp.f32(float [[CONV0]], float [[CONV1]], float [[CONV2]])75// CHECK: ret float [[LERP]]76float test_lerp_uint(uint p0) { return lerp(p0, p0, p0); }77 78// CHECK: define [[FNATTRS]] <2 x float> @_Z15test_lerp_uint2Dv2_j(79// CHECK: [[CONV0:%.*]] = uitofp <2 x i32> %{{.*}} to <2 x float>80// CHECK: [[CONV1:%.*]] = uitofp <2 x i32> %{{.*}} to <2 x float>81// CHECK: [[CONV2:%.*]] = uitofp <2 x i32> %{{.*}} to <2 x float>82// CHECK: [[LERP:%.*]] = call {{.*}} <2 x float> @llvm.[[TARGET]].lerp.v2f32(<2 x float> [[CONV0]], <2 x float> [[CONV1]], <2 x float> [[CONV2]])83// CHECK: ret <2 x float> [[LERP]]84float2 test_lerp_uint2(uint2 p0) { return lerp(p0, p0, p0); }85 86// CHECK: define [[FNATTRS]] <3 x float> @_Z15test_lerp_uint3Dv3_j(87// CHECK: [[CONV0:%.*]] = uitofp <3 x i32> %{{.*}} to <3 x float>88// CHECK: [[CONV1:%.*]] = uitofp <3 x i32> %{{.*}} to <3 x float>89// CHECK: [[CONV2:%.*]] = uitofp <3 x i32> %{{.*}} to <3 x float>90// CHECK: [[LERP:%.*]] = call {{.*}} <3 x float> @llvm.[[TARGET]].lerp.v3f32(<3 x float> [[CONV0]], <3 x float> [[CONV1]], <3 x float> [[CONV2]])91// CHECK: ret <3 x float> [[LERP]]92float3 test_lerp_uint3(uint3 p0) { return lerp(p0, p0, p0); }93 94// CHECK: define [[FNATTRS]] <4 x float> @_Z15test_lerp_uint4Dv4_j(95// CHECK: [[CONV0:%.*]] = uitofp <4 x i32> %{{.*}} to <4 x float>96// CHECK: [[CONV1:%.*]] = uitofp <4 x i32> %{{.*}} to <4 x float>97// CHECK: [[CONV2:%.*]] = uitofp <4 x i32> %{{.*}} to <4 x float>98// CHECK: [[LERP:%.*]] = call {{.*}} <4 x float> @llvm.[[TARGET]].lerp.v4f32(<4 x float> [[CONV0]], <4 x float> [[CONV1]], <4 x float> [[CONV2]])99// CHECK: ret <4 x float> [[LERP]]100float4 test_lerp_uint4(uint4 p0) { return lerp(p0, p0, p0); }101 102// CHECK: define [[FNATTRS]] float @_Z17test_lerp_int64_tl(103// CHECK: [[CONV0:%.*]] = sitofp i64 %{{.*}} to float104// CHECK: [[CONV1:%.*]] = sitofp i64 %{{.*}} to float105// CHECK: [[CONV2:%.*]] = sitofp i64 %{{.*}} to float106// CHECK: [[LERP:%.*]] = call {{.*}} float @llvm.[[TARGET]].lerp.f32(float [[CONV0]], float [[CONV1]], float [[CONV2]])107// CHECK: ret float [[LERP]]108float test_lerp_int64_t(int64_t p0) { return lerp(p0, p0, p0); }109 110// CHECK: define [[FNATTRS]] <2 x float> @_Z18test_lerp_int64_t2Dv2_l(111// CHECK: [[CONV0:%.*]] = sitofp <2 x i64> %{{.*}} to <2 x float>112// CHECK: [[CONV1:%.*]] = sitofp <2 x i64> %{{.*}} to <2 x float>113// CHECK: [[CONV2:%.*]] = sitofp <2 x i64> %{{.*}} to <2 x float>114// CHECK: [[LERP:%.*]] = call {{.*}} <2 x float> @llvm.[[TARGET]].lerp.v2f32(<2 x float> [[CONV0]], <2 x float> [[CONV1]], <2 x float> [[CONV2]])115// CHECK: ret <2 x float> [[LERP]]116float2 test_lerp_int64_t2(int64_t2 p0) { return lerp(p0, p0, p0); }117 118// CHECK: define [[FNATTRS]] <3 x float> @_Z18test_lerp_int64_t3Dv3_l(119// CHECK: [[CONV0:%.*]] = sitofp <3 x i64> %{{.*}} to <3 x float>120// CHECK: [[CONV1:%.*]] = sitofp <3 x i64> %{{.*}} to <3 x float>121// CHECK: [[CONV2:%.*]] = sitofp <3 x i64> %{{.*}} to <3 x float>122// CHECK: [[LERP:%.*]] = call {{.*}} <3 x float> @llvm.[[TARGET]].lerp.v3f32(<3 x float> [[CONV0]], <3 x float> [[CONV1]], <3 x float> [[CONV2]])123// CHECK: ret <3 x float> [[LERP]]124float3 test_lerp_int64_t3(int64_t3 p0) { return lerp(p0, p0, p0); }125 126// CHECK: define [[FNATTRS]] <4 x float> @_Z18test_lerp_int64_t4Dv4_l(127// CHECK: [[CONV0:%.*]] = sitofp <4 x i64> %{{.*}} to <4 x float>128// CHECK: [[CONV1:%.*]] = sitofp <4 x i64> %{{.*}} to <4 x float>129// CHECK: [[CONV2:%.*]] = sitofp <4 x i64> %{{.*}} to <4 x float>130// CHECK: [[LERP:%.*]] = call {{.*}} <4 x float> @llvm.[[TARGET]].lerp.v4f32(<4 x float> [[CONV0]], <4 x float> [[CONV1]], <4 x float> [[CONV2]])131// CHECK: ret <4 x float> [[LERP]]132float4 test_lerp_int64_t4(int64_t4 p0) { return lerp(p0, p0, p0); }133 134// CHECK: define [[FNATTRS]] float @_Z18test_lerp_uint64_tm(135// CHECK: [[CONV0:%.*]] = uitofp i64 %{{.*}} to float136// CHECK: [[CONV1:%.*]] = uitofp i64 %{{.*}} to float137// CHECK: [[CONV2:%.*]] = uitofp i64 %{{.*}} to float138// CHECK: [[LERP:%.*]] = call {{.*}} float @llvm.[[TARGET]].lerp.f32(float [[CONV0]], float [[CONV1]], float [[CONV2]])139// CHECK: ret float [[LERP]]140float test_lerp_uint64_t(uint64_t p0) { return lerp(p0, p0, p0); }141 142// CHECK: define [[FNATTRS]] <2 x float> @_Z19test_lerp_uint64_t2Dv2_m(143// CHECK: [[CONV0:%.*]] = uitofp <2 x i64> %{{.*}} to <2 x float>144// CHECK: [[CONV1:%.*]] = uitofp <2 x i64> %{{.*}} to <2 x float>145// CHECK: [[CONV2:%.*]] = uitofp <2 x i64> %{{.*}} to <2 x float>146// CHECK: [[LERP:%.*]] = call {{.*}} <2 x float> @llvm.[[TARGET]].lerp.v2f32(<2 x float> [[CONV0]], <2 x float> [[CONV1]], <2 x float> [[CONV2]])147// CHECK: ret <2 x float> [[LERP]]148float2 test_lerp_uint64_t2(uint64_t2 p0) { return lerp(p0, p0, p0); }149 150// CHECK: define [[FNATTRS]] <3 x float> @_Z19test_lerp_uint64_t3Dv3_m(151// CHECK: [[CONV0:%.*]] = uitofp <3 x i64> %{{.*}} to <3 x float>152// CHECK: [[CONV1:%.*]] = uitofp <3 x i64> %{{.*}} to <3 x float>153// CHECK: [[CONV2:%.*]] = uitofp <3 x i64> %{{.*}} to <3 x float>154// CHECK: [[LERP:%.*]] = call {{.*}} <3 x float> @llvm.[[TARGET]].lerp.v3f32(<3 x float> [[CONV0]], <3 x float> [[CONV1]], <3 x float> [[CONV2]])155// CHECK: ret <3 x float> [[LERP]]156float3 test_lerp_uint64_t3(uint64_t3 p0) { return lerp(p0, p0, p0); }157 158// CHECK: define [[FNATTRS]] <4 x float> @_Z19test_lerp_uint64_t4Dv4_m(159// CHECK: [[CONV0:%.*]] = uitofp <4 x i64> %{{.*}} to <4 x float>160// CHECK: [[CONV1:%.*]] = uitofp <4 x i64> %{{.*}} to <4 x float>161// CHECK: [[CONV2:%.*]] = uitofp <4 x i64> %{{.*}} to <4 x float>162// CHECK: [[LERP:%.*]] = call {{.*}} <4 x float> @llvm.[[TARGET]].lerp.v4f32(<4 x float> [[CONV0]], <4 x float> [[CONV1]], <4 x float> [[CONV2]])163// CHECK: ret <4 x float> [[LERP]]164float4 test_lerp_uint64_t4(uint64_t4 p0) { return lerp(p0, p0, p0); }165 166// NATIVE_HALF: define [[FNATTRS]] <3 x [[TY:half]]> @_Z21test_lerp_half_scalarDv3_DhS_Dh{{.*}}(167// NO_HALF: define [[FNATTRS]] <3 x [[TY:float]]> @_Z21test_lerp_half_scalarDv3_DhS_Dh(168// CHECK: [[SPLATINSERT:%.*]] = insertelement <3 x [[TY]]> poison, [[TY]] %{{.*}}, i64 0169// CHECK: [[SPLAT:%.*]] = shufflevector <3 x [[TY]]> [[SPLATINSERT]], <3 x [[TY]]> poison, <3 x i32> zeroinitializer170// CHECK: [[LERP:%.*]] = call {{.*}} <3 x [[TY]]> @llvm.[[TARGET]].lerp.{{.*}}(<3 x [[TY]]> {{.*}}, <3 x [[TY]]> {{.*}}, <3 x [[TY]]> [[SPLAT]])171// CHECK: ret <3 x [[TY]]> [[LERP]]172half3 test_lerp_half_scalar(half3 x, half3 y, half s) { return lerp(x, y, s); }173 174// CHECK: define [[FNATTRS]] <3 x float> @_Z22test_lerp_float_scalarDv3_fS_f(175// CHECK: [[SPLATINSERT:%.*]] = insertelement <3 x float> poison, float %{{.*}}, i64 0176// CHECK: [[SPLAT:%.*]] = shufflevector <3 x float> [[SPLATINSERT]], <3 x float> poison, <3 x i32> zeroinitializer177// CHECK: [[LERP:%.*]] = call {{.*}} <3 x float> @llvm.[[TARGET]].lerp.v3f32(<3 x float> {{.*}}, <3 x float> {{.*}}, <3 x float> [[SPLAT]])178// CHECK: ret <3 x float> [[LERP]]179float3 test_lerp_float_scalar(float3 x, float3 y, float s) {180 return lerp(x, y, s);181}182