llvm / llvm/llvm-project

[HLSL][longvec] Add longvector support for elementwise intrinsics in the frontend

Open
#216,103 3 comments 0 reactions 1 assignee Claimed by @farzonl View on GitHub
HLSL metaissue
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.