This change implements lowering for #70076, #70100, #70072, & #70102 `CGBuiltin.cpp` - - simplify `lerp` intrinsic `IntrinsicsDirectX.td` - simplify `lerp` intrinsic `SemaChecking.cpp` - remove unnecessary check `DXILIntrinsicExpansion.*` - add intrinsic to instruction expansion cases `DXILOpLowering.cpp` - make sure `DXILIntrinsicExpansion` happens first `DirectX.h` - changes to support new pass `DirectXTargetMachine.cpp` - changes to support new pass Why `any`, and `lerp` as instruction expansion just for DXIL? - SPIR-V there is an [OpAny](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpAny) - SPIR-V has a GLSL lerp extension via [Fmix](https://registry.khronos.org/SPIR-V/specs/1.0/GLSL.std.450.html#FMix) Why `exp` instruction expansion? - We have an `exp2` opcode and `exp` reuses that opcode. So instruction expansion is a convenient way to do preprocessing. - Further SPIR-V has a GLSL exp extension via [Exp](https://registry.khronos.org/SPIR-V/specs/1.0/GLSL.std.450.html#Exp) and [Exp2](https://registry.khronos.org/SPIR-V/specs/1.0/GLSL.std.450.html#Exp2) Why `rcp` as instruction expansion? This one is a bit of the odd man out and might have to move to `cgbuiltins` when we better understand SPIRV requirements. However I included it because it seems like [fast math mode has an AllowRecip flag](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#_fp_fast_math_mode) which lets you compute the reciprocal without performing the division. We don't have that in DXIL so thought to include it.
39 lines
1.6 KiB
HLSL
39 lines
1.6 KiB
HLSL
|
|
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -verify -verify-ignore-unexpected
|
|
|
|
float test_too_few_arg() {
|
|
return __builtin_hlsl_elementwise_rsqrt();
|
|
// expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
|
|
}
|
|
|
|
float2 test_too_many_arg(float2 p0) {
|
|
return __builtin_hlsl_elementwise_rsqrt(p0, p0);
|
|
// expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
|
|
}
|
|
|
|
float builtin_bool_to_float_type_promotion(bool p1) {
|
|
return __builtin_hlsl_elementwise_rsqrt(p1);
|
|
// expected-error@-1 {{passing 'bool' to parameter of incompatible type 'float'}}
|
|
}
|
|
|
|
float builtin_rsqrt_int_to_float_promotion(int p1) {
|
|
return __builtin_hlsl_elementwise_rsqrt(p1);
|
|
// expected-error@-1 {{passing 'int' to parameter of incompatible type 'float'}}
|
|
}
|
|
|
|
float2 builtin_rsqrt_int2_to_float2_promotion(int2 p1) {
|
|
return __builtin_hlsl_elementwise_rsqrt(p1);
|
|
// expected-error@-1 {{passing 'int2' (aka 'vector<int, 2>') to parameter of incompatible type '__attribute__((__vector_size__(2 * sizeof(float)))) float' (vector of 2 'float' values)}}
|
|
}
|
|
|
|
// builtins are variadic functions and so are subject to DefaultVariadicArgumentPromotion
|
|
half builtin_rsqrt_half_scalar (half p0) {
|
|
return __builtin_hlsl_elementwise_rsqrt (p0);
|
|
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}}
|
|
}
|
|
|
|
float builtin_rsqrt_float_scalar ( float p0) {
|
|
return __builtin_hlsl_elementwise_rsqrt (p0);
|
|
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}}
|
|
}
|