[HLSL][longvec] Add longvector support for elementwise intrinsics in the frontend
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
The folowing HLSL intrinsics are elementwise making them trivially scalarizable which means we should be able to just add a vector template
to `clang/include/clang/Basic/HLSLIntrinsics.td` for all their clang builtins:
- [x] __builtin_elementwise_acos
- [x] __builtin_elementwise_asin
- [x] __builtin_elementwise_atan
- [x] __builtin_elementwise_atan2
- [x] __builtin_elementwise_ceil
- [x] __builtin_hlsl_elementwise_clamp
- [x] __builtin_elementwise_cos
- [x] __builtin_elementwise_cosh
- [x] __builtin_elementwise_popcount
- [x] __builtin_elementwise_exp
- [x] __builtin_elementwise_exp2
- [x] __builtin_hlsl_elementwise_f16tof32
- [x] __builtin_hlsl_elementwise_f32tof16
- [x] __builtin_elementwise_fma
- [ ] __builtin_hlsl_elementwise_firstbitlow
- [x] __builtin_elementwise_floor
- [x] __builtin_hlsl_elementwise_frac
- [ ] __builtin_hlsl_elementwise_isinf
- [ ] __builtin_hlsl_elementwise_isnan
- [x] __builtin_elementwise_log
- [x] __builtin_elementwise_log10
- [x] __builtin_elementwise_log2
- [x] __builtin_elementwise_max
- [x] __builtin_elementwise_min
- [x] __builtin_elementwise_pow
- [x] __builtin_hlsl_elementwise_rcp
- [ ] __builtin_elementwise_bitreverse
- [x] __builtin_elementwise_roundeven
- [x] __builtin_hlsl_elementwise_rsqrt
- [x] __builtin_hlsl_elementwise_saturate
- [x] __builtin_hlsl_elementwise_sign
- [x] __builtin_elementwise_sin
- [x] __builtin_elementwise_sinh
- [x] __builtin_elementwise_sqrt
- [x] __builtin_elementwise_tan
- [x] __builtin_elementwise_tanh
- [x] __builtin_elementwise_trunc
For the DirectX backed there are two classes of IntrTriviallyScalarizable intrinsics those defined in `llvm/include/llvm/IR/IntrinsicsDirectX.td` and those defined across all backends in `llvm/include/llvm/IR/Intrinsics.td`. We can assume the ones in `Intrinsics.td` are well tested and don't need backend tests for us. However we will want to make sure we can scalarize this set in `IntrinsicsDirectX.td`:
- int_dx_asdouble
- int_dx_saturate
- int_dx_frac
- int_dx_imad
- int_dx_umad
- int_dx_rsqrt
- int_dx_wave_all_equal
- int_dx_wave_reduce_or
- int_dx_wave_reduce_xor
- int_dx_wave_reduce_and
- int_dx_wave_reduce_max
- int_dx_wave_reduce_umax
- int_dx_wave_reduce_min
- int_dx_wave_reduce_umin
- int_dx_wave_reduce_sum
- int_dx_wave_reduce_usum
- int_dx_wave_product
- int_dx_wave_uproduct
- int_dx_wave_readlane
- int_dx_wave_prefix_sum
- int_dx_wave_prefix_usum
- int_dx_wave_prefix_product
- int_dx_wave_prefix_uproduct
- int_dx_quad_read_across_x
- int_dx_quad_read_across_y
- int_dx_quad_read_across_diagonal
- int_dx_ddx_coarse
- int_dx_ddy_coarse
- int_dx_ddx_fine
- int_dx_ddy_fine
- int_dx_firstbituhigh
- int_dx_firstbitshigh
- int_dx_firstbitlow
- int_dx_isinf
- int_dx_isnan
- int_dx_legacyf16tof32
- int_dx_legacyf32tof16
(37 intrinsics in total)
Contributor guide
Assessment
This issue has not been assessed yet.