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
|
|
|
|
bool test_too_few_arg() {
|
|
return __builtin_hlsl_elementwise_isinf();
|
|
// expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
|
|
}
|
|
|
|
bool2 test_too_many_arg(float2 p0) {
|
|
return __builtin_hlsl_elementwise_isinf(p0, p0);
|
|
// expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
|
|
}
|
|
|
|
bool builtin_bool_to_float_type_promotion(bool p1) {
|
|
return __builtin_hlsl_elementwise_isinf(p1);
|
|
// expected-error@-1 {passing 'bool' to parameter of incompatible type 'float'}}
|
|
}
|
|
|
|
bool builtin_isinf_int_to_float_promotion(int p1) {
|
|
return __builtin_hlsl_elementwise_isinf(p1);
|
|
// expected-error@-1 {{passing 'int' to parameter of incompatible type 'float'}}
|
|
}
|
|
|
|
bool2 builtin_isinf_int2_to_float2_promotion(int2 p1) {
|
|
return __builtin_hlsl_elementwise_isinf(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_isinf_half_scalar (half p0) {
|
|
return __builtin_hlsl_elementwise_isinf (p0);
|
|
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}}
|
|
}
|
|
|
|
float builtin_isinf_float_scalar ( float p0) {
|
|
return __builtin_hlsl_elementwise_isinf (p0);
|
|
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}}
|
|
}
|