Files
TheRock/compiler/amd-llvm/clang/test/TableGen/hlsl-intrinsics.td
T
derek.holloway 7502bf64a4
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
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

472 lines
17 KiB
TableGen

// RUN: clang-tblgen -gen-hlsl-alias-intrinsics -I%p/../../include %s | FileCheck %s --check-prefix=ALIAS
// RUN: clang-tblgen -gen-hlsl-inline-intrinsics -I%p/../../include %s | FileCheck %s --check-prefix=INLINE
// Tests for the HLSL intrinsic TableGen backend (HLSLEmitter). Each test def
// exercises a specific feature. Def names are numbered (test_NN_) to control
// TableGen's alphabetical emission order so that CHECK lines read top-to-bottom.
include "clang/Basic/HLSLIntrinsics.td"
//===----------------------------------------------------------------------===//
// Basic alias builtin: scalar + vector overloads, no availability.
// Exercises: Varying arg/return, VaryingScalar, VaryingVecSizes, builtin
// alias emission, multiple regular types.
//===----------------------------------------------------------------------===//
def test_01_basic_alias : HLSLBuiltin<"myfunc", "__builtin_myfunc"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingVecSizes = [2, 3];
let VaryingTypes = [IntTy, FloatTy];
}
// ALIAS-LABEL: // myfunc overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_myfunc)
// ALIAS-NEXT: int myfunc(int);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_myfunc)
// ALIAS-NEXT: int2 myfunc(int2);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_myfunc)
// ALIAS-NEXT: int3 myfunc(int3);
//
// ALIAS-NOT: half myfunc
// ALIAS-NOT: uint myfunc
// ALIAS-NOT: double myfunc
//
// ALIAS: _HLSL_BUILTIN_ALIAS(__builtin_myfunc)
// ALIAS-NEXT: float myfunc(float);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_myfunc)
// ALIAS-NEXT: float2 myfunc(float2);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_myfunc)
// ALIAS-NEXT: float3 myfunc(float3);
//
// ALIAS-NOT: myfunc
//===----------------------------------------------------------------------===//
// VaryingElemType return: return type is scalar even for vector args.
// Exercises: VaryingElemType as ReturnType, two Varying args.
//===----------------------------------------------------------------------===//
def test_02_elem_return : HLSLBuiltin<"dotlike", "__builtin_dotlike"> {
let Args = [Varying, Varying];
let ReturnType = VaryingElemType;
let VaryingScalar = 1;
let VaryingVecSizes = [3];
let VaryingTypes = [FloatTy];
}
// ALIAS-LABEL: // dotlike overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_dotlike)
// ALIAS-NEXT: float dotlike(float, float);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_dotlike)
// ALIAS-NEXT: float dotlike(float3, float3);
//
// ALIAS-NOT: dotlike
//===----------------------------------------------------------------------===//
// VaryingShape return: return shape matches arg shape but with a different
// element type.
// Exercises: VaryingShape<BoolTy> as ReturnType.
//===----------------------------------------------------------------------===//
def test_03_shape_return : HLSLBuiltin<"isspecial", "__builtin_isspecial"> {
let Args = [Varying];
let ReturnType = VaryingShape<BoolTy>;
let VaryingScalar = 1;
let VaryingVecSizes = [2];
let VaryingTypes = [FloatTy];
}
// ALIAS-LABEL: // isspecial overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_isspecial)
// ALIAS-NEXT: bool isspecial(float);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_isspecial)
// ALIAS-NEXT: bool2 isspecial(float2);
//
// ALIAS-NOT: isspecial
//===----------------------------------------------------------------------===//
// Fixed VectorType args and return: no Varying types at all.
// Exercises: VectorType in Args and ReturnType, single overload.
//===----------------------------------------------------------------------===//
def test_04_fixed_vector : HLSLBuiltin<"fixedfunc", "__builtin_fixedfunc"> {
let Args = [VectorType<FloatTy, 3>, VectorType<FloatTy, 3>];
let ReturnType = VectorType<FloatTy, 3>;
}
// ALIAS-LABEL: // fixedfunc overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_fixedfunc)
// ALIAS-NEXT: float3 fixedfunc(float3, float3);
//
// ALIAS-NOT: fixedfunc
//===----------------------------------------------------------------------===//
// Matrix overloads.
// Exercises: VaryingMatDims emission with matrix type names.
//===----------------------------------------------------------------------===//
def test_05_matrix : HLSLBuiltin<"matfunc", "__builtin_matfunc"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingMatDims = [Mat2x3];
let VaryingTypes = [FloatTy];
}
// ALIAS-LABEL: // matfunc overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_matfunc)
// ALIAS-NEXT: float2x3 matfunc(float2x3);
//
// ALIAS-NOT: matfunc
//===----------------------------------------------------------------------===//
// Half type: conditionally-16-bit availability.
// Exercises: _HLSL_16BIT_AVAILABILITY for half, no ifdef guard.
//===----------------------------------------------------------------------===//
def test_06_half : HLSLBuiltin<"halffunc", "__builtin_halffunc"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingTypes = [HalfTy, FloatTy];
}
// ALIAS-LABEL: // halffunc overloads
// ALIAS-NEXT: _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_halffunc)
// ALIAS-NEXT: half halffunc(half);
//
// ALIAS-NOT: int halffunc
// ALIAS-NOT: double halffunc
//
// ALIAS: _HLSL_BUILTIN_ALIAS(__builtin_halffunc)
// ALIAS-NEXT: float halffunc(float);
//
// ALIAS-NOT: halffunc
//===----------------------------------------------------------------------===//
// 16-bit integer type: ifdef guard + availability.
// Exercises: #ifdef __HLSL_ENABLE_16_BIT guard, _HLSL_AVAILABILITY for
// Is16Bit types, guard closing before non-16-bit types.
//===----------------------------------------------------------------------===//
def test_07_16bit : HLSLBuiltin<"i16func", "__builtin_i16func"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingTypes = [Int16Ty, IntTy];
}
// ALIAS-LABEL: // i16func overloads
// ALIAS-NEXT: #ifdef __HLSL_ENABLE_16_BIT
// ALIAS-NEXT: _HLSL_AVAILABILITY(shadermodel, 6.2)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_i16func)
// ALIAS-NEXT: int16_t i16func(int16_t);
// ALIAS-NEXT: #endif
//
// ALIAS-NOT: half i16func
// ALIAS-NOT: float i16func
// ALIAS-NOT: double i16func
//
// ALIAS: _HLSL_BUILTIN_ALIAS(__builtin_i16func)
// ALIAS-NEXT: int i16func(int);
//
// ALIAS-NOT: i16func
//===----------------------------------------------------------------------===//
// Explicit availability (>= SM6.2): half and int16_t both use
// _HLSL_AVAILABILITY with the intrinsic's version instead of the 16-bit
// specific macros, since SM >= 6.2 already implies 16-bit support.
// Exercises: Availability field, SM override for conditionally-16-bit and
// 16-bit integer types.
//===----------------------------------------------------------------------===//
def test_08_avail_ge62 : HLSLBuiltin<"availfunc", "__builtin_availfunc"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingTypes = [HalfTy, Int16Ty, IntTy, FloatTy];
let Availability = SM6_4;
}
// ALIAS-LABEL: // availfunc overloads
// ALIAS-NEXT: _HLSL_AVAILABILITY(shadermodel, 6.4)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availfunc)
// ALIAS-NEXT: half availfunc(half);
// ALIAS: #ifdef __HLSL_ENABLE_16_BIT
// ALIAS-NEXT: _HLSL_AVAILABILITY(shadermodel, 6.4)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availfunc)
// ALIAS-NEXT: int16_t availfunc(int16_t);
// ALIAS-NEXT: #endif
// ALIAS: _HLSL_AVAILABILITY(shadermodel, 6.4)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availfunc)
// ALIAS-NEXT: int availfunc(int);
// ALIAS: _HLSL_AVAILABILITY(shadermodel, 6.4)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availfunc)
// ALIAS-NEXT: float availfunc(float);
//
// ALIAS-NOT: availfunc
//===----------------------------------------------------------------------===//
// Explicit availability (< SM6.2) with 16-bit types: int16_t gets the ifdef
// guard and _HLSL_AVAILABILITY(shadermodel, 6.2) regardless of the intrinsic's
// stated availability, because 16-bit types require SM6.2. Half gets a 3-arg
// _HLSL_16BIT_AVAILABILITY so that 16-bit half uses SM6.2 availability while
// the non-16-bit float fallback uses the intrinsic's original availability.
// Exercises: Availability < SM6.2 with Is16Bit and IsConditionally16Bit types.
//===----------------------------------------------------------------------===//
def test_08b_avail_lt62 : HLSLBuiltin<"availlt62", "__builtin_availlt62"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingTypes = [HalfTy, Int16Ty, IntTy];
let Availability = SM6_1;
}
// ALIAS-LABEL: // availlt62 overloads
// ALIAS-NEXT: _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2, 6.1)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availlt62)
// ALIAS-NEXT: half availlt62(half);
// ALIAS: #ifdef __HLSL_ENABLE_16_BIT
// ALIAS-NEXT: _HLSL_AVAILABILITY(shadermodel, 6.2)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availlt62)
// ALIAS-NEXT: int16_t availlt62(int16_t);
// ALIAS-NEXT: #endif
// ALIAS: _HLSL_AVAILABILITY(shadermodel, 6.1)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_availlt62)
// ALIAS-NEXT: int availlt62(int);
//
// ALIAS-NOT: availlt62
//===----------------------------------------------------------------------===//
// Fixed half VectorType arg: conditionally-16-bit flag from fixed arg.
// Exercises: 16-bit flag propagation through fixed VectorType args.
//===----------------------------------------------------------------------===//
def test_09_fixed_half_vec : HLSLBuiltin<"fixedhalffunc", "__builtin_fixedhalffunc"> {
let Args = [VectorType<HalfTy, 2>, VectorType<HalfTy, 2>, FloatTy];
let ReturnType = FloatTy;
}
// ALIAS-LABEL: // fixedhalffunc overloads
// ALIAS-NEXT: _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_fixedhalffunc)
// ALIAS-NEXT: float fixedhalffunc(half2, half2, float);
//
// ALIAS-NOT: fixedhalffunc
//===----------------------------------------------------------------------===//
// No-arg void function with convergent attribute.
// Exercises: VoidTy return, empty Args, IsConvergent.
//===----------------------------------------------------------------------===//
def test_10_void_convergent : HLSLBuiltin<"barrier", "__builtin_barrier"> {
let IsConvergent = 1;
}
// ALIAS-LABEL: // barrier overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_barrier)
// ALIAS-NEXT: __attribute__((convergent)) void barrier();
//
// ALIAS-NOT: barrier
//===----------------------------------------------------------------------===//
// Inline body: constexpr function with literal body.
// Exercises: Body field, IsConstexpr, ParamNames, inline backend only.
//===----------------------------------------------------------------------===//
def test_11_inline_body : HLSLBuiltin<"inline_only_func"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingTypes = [UIntTy];
let Body = "return V;";
let ParamNames = ["V"];
let IsConstexpr = 1;
}
// INLINE-NOT: _HLSL_BUILTIN_ALIAS
// INLINE-LABEL: // inline_only_func overloads
// INLINE-NEXT: constexpr uint inline_only_func(uint V) { return V; }
//
// INLINE-NOT: inline_only_func
//===----------------------------------------------------------------------===//
// Detail function: inline function calling __detail::helper.
// Exercises: DetailFunc, ParamNames, VaryingElemType arg, mixed Varying and
// non-Varying args in inline backend.
//===----------------------------------------------------------------------===//
def test_12_detail_func : HLSLBuiltin<"detailfunc"> {
let DetailFunc = "detail_impl";
let Args = [Varying, Varying, VaryingElemType];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingVecSizes = [2];
let VaryingTypes = [FloatTy];
let ParamNames = ["A", "B", "C"];
}
// INLINE-LABEL: // detailfunc overloads
// INLINE-NEXT: inline float detailfunc(float A, float B, float C) {
// INLINE-NEXT: return __detail::detail_impl(A, B, C);
// INLINE-NEXT: }
// INLINE-NEXT: inline float2 detailfunc(float2 A, float2 B, float C) {
// INLINE-NEXT: return __detail::detail_impl(A, B, C);
// INLINE-NEXT: }
//
// INLINE-NOT: detailfunc
//===----------------------------------------------------------------------===//
// Doc comment emission.
// Exercises: Doc field producing /// lines with blank-line handling.
//===----------------------------------------------------------------------===//
def test_13_doc : HLSLBuiltin<"docfunc", "__builtin_docfunc"> {
let Doc = [{
\fn void docfunc()
\brief A documented function.
}];
}
// ALIAS: /// \fn void docfunc()
// ALIAS-NEXT: /// \brief A documented function.
// ALIAS-NEXT: // docfunc overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_docfunc)
// ALIAS-NEXT: void docfunc();
//
// ALIAS-NOT: docfunc
//===----------------------------------------------------------------------===//
// Canonical type sort order: types emitted in priority order regardless of
// declaration order.
// Exercises: getTypeSortPriority ordering (half before int before float).
//===----------------------------------------------------------------------===//
def test_14_sort_order : HLSLBuiltin<"sortedfunc", "__builtin_sortedfunc"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingTypes = [FloatTy, IntTy, HalfTy];
}
// ALIAS-LABEL: // sortedfunc overloads
// ALIAS-NEXT: _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_sortedfunc)
// ALIAS-NEXT: half sortedfunc(half);
//
// ALIAS-NOT: double sortedfunc
// ALIAS-NOT: uint sortedfunc
//
// ALIAS: _HLSL_BUILTIN_ALIAS(__builtin_sortedfunc)
// ALIAS-NEXT: int sortedfunc(int);
// ALIAS: _HLSL_BUILTIN_ALIAS(__builtin_sortedfunc)
// ALIAS-NEXT: float sortedfunc(float);
//
// ALIAS-NOT: sortedfunc
//===----------------------------------------------------------------------===//
// Vector and matrix dimension sort order: vector sizes are emitted ascending
// and matrix dimensions sorted by rows then columns, regardless of declaration
// order.
// Exercises: VaryingVecSizes sorting, VaryingMatDims sorting.
//===----------------------------------------------------------------------===//
def test_15_shape_sort : HLSLBuiltin<"shapesorted", "__builtin_shapesorted"> {
let Args = [Varying];
let ReturnType = Varying;
let VaryingVecSizes = [4, 2, 3];
let VaryingMatDims = [Mat3x2, Mat2x1, Mat2x3];
let VaryingTypes = [FloatTy];
}
// ALIAS-LABEL: // shapesorted overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapesorted)
// ALIAS-NEXT: float2 shapesorted(float2);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapesorted)
// ALIAS-NEXT: float3 shapesorted(float3);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapesorted)
// ALIAS-NEXT: float4 shapesorted(float4);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapesorted)
// ALIAS-NEXT: float2x1 shapesorted(float2x1);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapesorted)
// ALIAS-NEXT: float2x3 shapesorted(float2x3);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapesorted)
// ALIAS-NEXT: float3x2 shapesorted(float3x2);
//
// ALIAS-NOT: shapesorted
//===----------------------------------------------------------------------===//
// VaryingElemType as argument: arg is always the scalar element type even when
// the overload shape is a vector.
// Exercises: VaryingElemType in Args position.
//===----------------------------------------------------------------------===//
def test_16_elemtype_arg : HLSLBuiltin<"elemarg", "__builtin_elemarg"> {
let Args = [Varying, VaryingElemType];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingVecSizes = [3];
let VaryingTypes = [FloatTy];
}
// ALIAS-LABEL: // elemarg overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_elemarg)
// ALIAS-NEXT: float elemarg(float, float);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_elemarg)
// ALIAS-NEXT: float3 elemarg(float3, float);
//
// ALIAS-NOT: elemarg
//===----------------------------------------------------------------------===//
// VaryingShape as argument: arg uses the varying shape but with a fixed element
// type.
// Exercises: VaryingShape<UIntTy> in Args position.
//===----------------------------------------------------------------------===//
def test_17_shape_arg : HLSLBuiltin<"shapearg", "__builtin_shapearg"> {
let Args = [Varying, VaryingShape<UIntTy>];
let ReturnType = Varying;
let VaryingScalar = 1;
let VaryingVecSizes = [2];
let VaryingTypes = [FloatTy];
}
// ALIAS-LABEL: // shapearg overloads
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapearg)
// ALIAS-NEXT: float shapearg(float, uint);
// ALIAS-NEXT: _HLSL_BUILTIN_ALIAS(__builtin_shapearg)
// ALIAS-NEXT: float2 shapearg(float2, uint2);
//
// ALIAS-NOT: shapearg
//===----------------------------------------------------------------------===//
// Verify no alias intrinsics are generated in the inline header.
//===----------------------------------------------------------------------===//
// INLINE-NOT: myfunc
// INLINE-NOT: dotlike
// INLINE-NOT: isspecial
// INLINE-NOT: fixedfunc
// INLINE-NOT: matfunc
// INLINE-NOT: halffunc
// INLINE-NOT: i16func
// INLINE-NOT: availfunc
// INLINE-NOT: availlt62
// INLINE-NOT: fixedhalffunc
// INLINE-NOT: barrier
// INLINE-NOT: docfunc
// INLINE-NOT: sortedfunc
// INLINE-NOT: shapesorted
// INLINE-NOT: elemarg
// INLINE-NOT: shapearg
//===----------------------------------------------------------------------===//
// Verify no inline intrinsics are generated in the alias header.
//===----------------------------------------------------------------------===//
// ALIAS-NOT: inline_only_func
// ALIAS-NOT: detailfunc