CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
332 lines
11 KiB
C++
332 lines
11 KiB
C++
//===----- hlsl_intrinsics.h - HLSL definitions for intrinsics ----------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _HLSL_HLSL_INTRINSICS_H_
|
|
#define _HLSL_HLSL_INTRINSICS_H_
|
|
|
|
#include "hlsl/hlsl_intrinsic_helpers.h"
|
|
|
|
namespace hlsl {
|
|
|
|
// Generated by clang-tblgen from HLSLIntrinsics.td (detail/inline intrinsics).
|
|
#include "hlsl_inline_intrinsics_gen.inc"
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// asfloat builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn float asfloat(T Val)
|
|
/// \brief Interprets the bit pattern of x as float point number.
|
|
/// \param Val The input value.
|
|
|
|
template <typename T, int R, int C>
|
|
constexpr matrix<float, R, C> asfloat(matrix<T, R, C> V) {
|
|
return __detail::bit_cast<float, T, R, C>(V);
|
|
}
|
|
|
|
template <typename T, int N>
|
|
constexpr vector<float, N> asfloat(vector<T, N> V) {
|
|
return __detail::bit_cast<float, T, N>(V);
|
|
}
|
|
|
|
template <typename T> constexpr float asfloat(T F) {
|
|
return __detail::bit_cast<float, T>(F);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// asint builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn int asint(T Val)
|
|
/// \brief Interprets the bit pattern of x as an integer.
|
|
/// \param Val The input value.
|
|
|
|
template <typename T, int R, int C>
|
|
constexpr matrix<int, R, C> asint(matrix<T, R, C> V) {
|
|
return __detail::bit_cast<int, T, R, C>(V);
|
|
}
|
|
|
|
template <typename T, int N> constexpr vector<int, N> asint(vector<T, N> V) {
|
|
return __detail::bit_cast<int, T, N>(V);
|
|
}
|
|
|
|
template <typename T> constexpr int asint(T F) {
|
|
return __detail::bit_cast<int, T>(F);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// asint16 builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn int16_t asint16(T X)
|
|
/// \brief Interprets the bit pattern of \a X as an 16-bit integer.
|
|
/// \param X The input value.
|
|
|
|
#ifdef __HLSL_ENABLE_16_BIT
|
|
|
|
template <typename T, int N>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr __detail::enable_if_t<__detail::is_same<int16_t, T>::value ||
|
|
__detail::is_same<uint16_t, T>::value ||
|
|
__detail::is_same<half, T>::value,
|
|
vector<int16_t, N>> asint16(vector<T, N> V) {
|
|
return __detail::bit_cast<int16_t, T, N>(V);
|
|
}
|
|
|
|
template <typename T>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr __detail::enable_if_t<__detail::is_same<int16_t, T>::value ||
|
|
__detail::is_same<uint16_t, T>::value ||
|
|
__detail::is_same<half, T>::value,
|
|
int16_t> asint16(T F) {
|
|
return __detail::bit_cast<int16_t, T>(F);
|
|
}
|
|
#endif
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// asuint builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn uint asuint(T Val)
|
|
/// \brief Interprets the bit pattern of x as an unsigned integer.
|
|
/// \param Val The input value.
|
|
|
|
template <typename T, int R, int C>
|
|
constexpr matrix<uint, R, C> asuint(matrix<T, R, C> V) {
|
|
return __detail::bit_cast<uint, T, R, C>(V);
|
|
}
|
|
|
|
template <typename T, int N> constexpr vector<uint, N> asuint(vector<T, N> V) {
|
|
return __detail::bit_cast<uint, T, N>(V);
|
|
}
|
|
|
|
template <typename T> constexpr uint asuint(T F) {
|
|
return __detail::bit_cast<uint, T>(F);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// asuint splitdouble builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn void asuint(double D, out uint lowbits, out int highbits)
|
|
/// \brief Split and interprets the lowbits and highbits of double D into uints.
|
|
/// \param D The input double.
|
|
/// \param lowbits The output lowbits of D.
|
|
/// \param highbits The output highbits of D.
|
|
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_splitdouble)
|
|
void asuint(double, out uint, out uint);
|
|
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_splitdouble)
|
|
void asuint(double2, out uint2, out uint2);
|
|
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_splitdouble)
|
|
void asuint(double3, out uint3, out uint3);
|
|
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_splitdouble)
|
|
void asuint(double4, out uint4, out uint4);
|
|
template <int R, int C>
|
|
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_splitdouble)
|
|
void asuint(matrix<double, R, C>, out matrix<uint, R, C>,
|
|
out matrix<uint, R, C>);
|
|
//===----------------------------------------------------------------------===//
|
|
// asuint16 builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn uint16_t asuint16(T X)
|
|
/// \brief Interprets the bit pattern of \a X as an 16-bit unsigned integer.
|
|
/// \param X The input value.
|
|
|
|
#ifdef __HLSL_ENABLE_16_BIT
|
|
|
|
template <typename T, int N>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr __detail::enable_if_t<__detail::is_same<int16_t, T>::value ||
|
|
__detail::is_same<uint16_t, T>::value ||
|
|
__detail::is_same<half, T>::value,
|
|
vector<uint16_t, N>> asuint16(vector<T, N> V) {
|
|
return __detail::bit_cast<uint16_t, T, N>(V);
|
|
}
|
|
|
|
template <typename T>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr __detail::enable_if_t<__detail::is_same<int16_t, T>::value ||
|
|
__detail::is_same<uint16_t, T>::value ||
|
|
__detail::is_same<half, T>::value,
|
|
uint16_t> asuint16(T F) {
|
|
return __detail::bit_cast<uint16_t, T>(F);
|
|
}
|
|
#endif
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// firstbithigh builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn T firstbithigh(T Val)
|
|
/// \brief Returns the location of the first set bit starting from the lowest
|
|
/// order bit and working upward, per component.
|
|
/// \param Val the input value.
|
|
|
|
#ifdef __HLSL_ENABLE_16_BIT
|
|
|
|
template <typename T>
|
|
_HLSL_AVAILABILITY(shadermodel, 6.2)
|
|
const inline __detail::enable_if_t<__detail::is_same<int16_t, T>::value ||
|
|
__detail::is_same<uint16_t, T>::value,
|
|
uint> firstbithigh(T X) {
|
|
return __detail::firstbithigh_impl<uint, T, 16>(X);
|
|
}
|
|
|
|
template <typename T, int N>
|
|
_HLSL_AVAILABILITY(shadermodel, 6.2)
|
|
const
|
|
inline __detail::enable_if_t<__detail::is_same<int16_t, T>::value ||
|
|
__detail::is_same<uint16_t, T>::value,
|
|
vector<uint, N>> firstbithigh(vector<T, N> X) {
|
|
return __detail::firstbithigh_impl<vector<uint, N>, vector<T, N>, 16>(X);
|
|
}
|
|
|
|
#endif
|
|
|
|
template <typename T>
|
|
const inline __detail::enable_if_t<
|
|
__detail::is_same<int, T>::value || __detail::is_same<uint, T>::value, uint>
|
|
firstbithigh(T X) {
|
|
return __detail::firstbithigh_impl<uint, T, 32>(X);
|
|
}
|
|
|
|
template <typename T, int N>
|
|
const inline __detail::enable_if_t<__detail::is_same<int, T>::value ||
|
|
__detail::is_same<uint, T>::value,
|
|
vector<uint, N>>
|
|
firstbithigh(vector<T, N> X) {
|
|
return __detail::firstbithigh_impl<vector<uint, N>, vector<T, N>, 32>(X);
|
|
}
|
|
|
|
template <typename T>
|
|
const inline __detail::enable_if_t<__detail::is_same<int64_t, T>::value ||
|
|
__detail::is_same<uint64_t, T>::value,
|
|
uint>
|
|
firstbithigh(T X) {
|
|
return __detail::firstbithigh_impl<uint, T, 64>(X);
|
|
}
|
|
|
|
template <typename T, int N>
|
|
const inline __detail::enable_if_t<__detail::is_same<int64_t, T>::value ||
|
|
__detail::is_same<uint64_t, T>::value,
|
|
vector<uint, N>>
|
|
firstbithigh(vector<T, N> X) {
|
|
return __detail::firstbithigh_impl<vector<uint, N>, vector<T, N>, 64>(X);
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// mul builtins
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// \fn R mul(X x, Y y)
|
|
/// \brief Multiplies x and y using matrix math.
|
|
/// \param x [in] The first input value. If x is a vector, it is treated as a
|
|
/// row vector.
|
|
/// \param y [in] The second input value. If y is a vector, it is treated as a
|
|
/// column vector.
|
|
///
|
|
/// The inner dimension x-columns and y-rows must be equal. The result has the
|
|
/// dimension x-rows x y-columns. When both x and y are vectors, the result is
|
|
/// a dot product (scalar). Scalar operands are multiplied element-wise.
|
|
///
|
|
/// This function supports 9 overloaded forms:
|
|
/// 1. scalar * scalar -> scalar
|
|
/// 2. scalar * vector -> vector
|
|
/// 3. scalar * matrix -> matrix
|
|
/// 4. vector * scalar -> vector
|
|
/// 5. vector * vector -> scalar (dot product)
|
|
/// 6. vector * matrix -> vector
|
|
/// 7. matrix * scalar -> matrix
|
|
/// 8. matrix * vector -> vector
|
|
/// 9. matrix * matrix -> matrix
|
|
|
|
// Cases 1, 2, 3, 4, 5, and 7 of mul are defined below as
|
|
// header-only implementations because they are elementwise operations and dot
|
|
// products easily expressed in HLSL.
|
|
|
|
// Cases 6, 8, and 9 are defined in hlsl_alias_intrinsics.h to alias the mul
|
|
// builtin so that they can be lowered to the llvm.matrix.multiply intrinsic
|
|
// which is not exposed directly to HLSL.
|
|
|
|
// Case 1: scalar * scalar -> scalar
|
|
template <typename T>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr __detail::enable_if_t<__detail::is_arithmetic<T>::Value &&
|
|
__detail::is_same<half, T>::value,
|
|
T> mul(T x, T y) {
|
|
return x * y;
|
|
}
|
|
|
|
template <typename T>
|
|
constexpr __detail::enable_if_t<
|
|
__detail::is_arithmetic<T>::Value && !__detail::is_same<half, T>::value, T>
|
|
mul(T x, T y) {
|
|
return x * y;
|
|
}
|
|
|
|
// Case 2: scalar * vector -> vector
|
|
template <int N>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr vector<half, N> mul(half x, vector<half, N> y) {
|
|
return x * y;
|
|
}
|
|
|
|
template <typename T, int N> constexpr vector<T, N> mul(T x, vector<T, N> y) {
|
|
return x * y;
|
|
}
|
|
|
|
// Case 3: scalar * matrix -> matrix
|
|
template <int R, int C>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr matrix<half, R, C> mul(half x, matrix<half, R, C> y) {
|
|
return x * y;
|
|
}
|
|
|
|
template <typename T, int R, int C>
|
|
constexpr matrix<T, R, C> mul(T x, matrix<T, R, C> y) {
|
|
return x * y;
|
|
}
|
|
|
|
// Case 4: vector * scalar -> vector
|
|
template <int N>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr vector<half, N> mul(vector<half, N> x, half y) {
|
|
return x * y;
|
|
}
|
|
|
|
template <typename T, int N> constexpr vector<T, N> mul(vector<T, N> x, T y) {
|
|
return x * y;
|
|
}
|
|
|
|
// Case 5: vector * vector -> scalar (dot product)
|
|
template <int N>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
half mul(vector<half, N> x, vector<half, N> y) {
|
|
return __detail::mul_vec_impl(x, y);
|
|
}
|
|
|
|
template <typename T, int N> T mul(vector<T, N> x, vector<T, N> y) {
|
|
return __detail::mul_vec_impl(x, y);
|
|
}
|
|
|
|
// Case 7: matrix * scalar -> matrix
|
|
template <int R, int C>
|
|
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
|
|
constexpr matrix<half, R, C> mul(matrix<half, R, C> x, half y) {
|
|
return x * y;
|
|
}
|
|
|
|
template <typename T, int R, int C>
|
|
constexpr matrix<T, R, C> mul(matrix<T, R, C> x, T y) {
|
|
return x * y;
|
|
}
|
|
|
|
} // namespace hlsl
|
|
#endif //_HLSL_HLSL_INTRINSICS_H_
|