1//===- IntrinsicsSPIRV.td - Defines SPIRV intrinsics -------*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines all of the SPIRV-specific intrinsics. 10// 11//===----------------------------------------------------------------------===// 12 13let TargetPrefix = "spv" in { 14 def int_spv_assign_type : Intrinsic<[], [llvm_any_ty, llvm_metadata_ty]>; 15 def int_spv_assign_ptr_type : Intrinsic<[], [llvm_any_ty, llvm_metadata_ty, llvm_i32_ty], [ImmArg<ArgIndex<2>>]>; 16 def int_spv_assign_name : Intrinsic<[], [llvm_any_ty, llvm_vararg_ty]>; 17 def int_spv_assign_decoration : Intrinsic<[], [llvm_any_ty, llvm_metadata_ty]>; 18 def int_spv_value_md : Intrinsic<[], [llvm_metadata_ty]>; 19 20 def int_spv_track_constant : Intrinsic<[llvm_any_ty], [llvm_any_ty, llvm_metadata_ty]>; 21 def int_spv_init_global : Intrinsic<[], [llvm_any_ty, llvm_any_ty]>; 22 def int_spv_unref_global : Intrinsic<[], [llvm_any_ty]>; 23 24 def int_spv_gep : Intrinsic<[llvm_anyptr_ty], [llvm_i1_ty, llvm_any_ty, llvm_vararg_ty], [ImmArg<ArgIndex<0>>]>; 25 def int_spv_load : Intrinsic<[llvm_i32_ty], [llvm_anyptr_ty, llvm_i16_ty, llvm_i8_ty], [ImmArg<ArgIndex<1>>, ImmArg<ArgIndex<2>>]>; 26 def int_spv_store : Intrinsic<[], [llvm_any_ty, llvm_anyptr_ty, llvm_i16_ty, llvm_i8_ty], [ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>; 27 def int_spv_extractv : Intrinsic<[llvm_any_ty], [llvm_i32_ty, llvm_vararg_ty]>; 28 def int_spv_insertv : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_any_ty, llvm_vararg_ty]>; 29 def int_spv_extractelt : Intrinsic<[llvm_any_ty], [llvm_any_ty, llvm_anyint_ty]>; 30 def int_spv_insertelt : Intrinsic<[llvm_any_ty], [llvm_any_ty, llvm_any_ty, llvm_anyint_ty]>; 31 def int_spv_const_composite : Intrinsic<[llvm_any_ty], [llvm_vararg_ty]>; 32 def int_spv_bitcast : Intrinsic<[llvm_any_ty], [llvm_any_ty]>; 33 def int_spv_ptrcast : Intrinsic<[llvm_any_ty], [llvm_any_ty, llvm_metadata_ty, llvm_i32_ty], [ImmArg<ArgIndex<2>>]>; 34 def int_spv_switch : Intrinsic<[], [llvm_any_ty, llvm_vararg_ty]>; 35 def int_spv_loop_merge : Intrinsic<[], [llvm_vararg_ty]>; 36 def int_spv_selection_merge : Intrinsic<[], [llvm_any_ty, llvm_i32_ty], [ImmArg<ArgIndex<1>>]>; 37 def int_spv_cmpxchg : Intrinsic<[llvm_i32_ty], [llvm_any_ty, llvm_vararg_ty]>; 38 def int_spv_unreachable : Intrinsic<[], []>; 39 def int_spv_alloca : Intrinsic<[llvm_any_ty], [llvm_i8_ty], [ImmArg<ArgIndex<0>>]>; 40 def int_spv_alloca_array : Intrinsic<[llvm_any_ty], [llvm_anyint_ty, llvm_i8_ty], [ImmArg<ArgIndex<1>>]>; 41 def int_spv_undef : Intrinsic<[llvm_i32_ty], []>; 42 def int_spv_inline_asm : Intrinsic<[], [llvm_metadata_ty, llvm_metadata_ty, llvm_vararg_ty]>; 43 44 // Expect, Assume Intrinsics 45 def int_spv_assume : Intrinsic<[], [llvm_i1_ty]>; 46 def int_spv_expect : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>]>; 47 48 // Memory Use Markers 49 def int_spv_lifetime_start : Intrinsic<[], 50 [llvm_i64_ty, llvm_anyptr_ty], 51 [IntrArgMemOnly, IntrWillReturn, 52 NoCapture<ArgIndex<1>>, 53 ImmArg<ArgIndex<0>>]>; 54 def int_spv_lifetime_end : Intrinsic<[], 55 [llvm_i64_ty, llvm_anyptr_ty], 56 [IntrArgMemOnly, IntrWillReturn, 57 NoCapture<ArgIndex<1>>, 58 ImmArg<ArgIndex<0>>]>; 59 60 // The following intrinsic(s) are mirrored from IntrinsicsDirectX.td for HLSL support. 61 def int_spv_thread_id : Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem, IntrWillReturn]>; 62 def int_spv_group_id : Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem, IntrWillReturn]>; 63 def int_spv_thread_id_in_group : Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem, IntrWillReturn]>; 64 def int_spv_all : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_any_ty], [IntrNoMem]>; 65 def int_spv_any : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_any_ty], [IntrNoMem]>; 66 def int_spv_cross : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; 67 def int_spv_degrees : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty], [IntrNoMem]>; 68 def int_spv_distance : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>], [llvm_anyfloat_ty, LLVMMatchType<0>], [IntrNoMem]>; 69 def int_spv_frac : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty], [IntrNoMem]>; 70 def int_spv_lerp : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty, LLVMMatchType<0>,LLVMMatchType<0>], 71 [IntrNoMem] >; 72 def int_spv_length : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>], [llvm_anyfloat_ty], [IntrNoMem]>; 73 def int_spv_normalize : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty], [IntrNoMem]>; 74 def int_spv_rsqrt : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty], [IntrNoMem]>; 75 def int_spv_saturate : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>; 76 def int_spv_step : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [LLVMMatchType<0>, llvm_anyfloat_ty], [IntrNoMem]>; 77 def int_spv_fdot : 78 DefaultAttrsIntrinsic<[LLVMVectorElementType<0>], 79 [llvm_anyfloat_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>], 80 [IntrNoMem, Commutative] >; 81 def int_spv_sdot : 82 DefaultAttrsIntrinsic<[LLVMVectorElementType<0>], 83 [llvm_anyint_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>], 84 [IntrNoMem, Commutative] >; 85 def int_spv_udot : 86 DefaultAttrsIntrinsic<[LLVMVectorElementType<0>], 87 [llvm_anyint_ty, LLVMScalarOrSameVectorWidth<0, LLVMVectorElementType<0>>], 88 [IntrNoMem, Commutative] >; 89 def int_spv_dot4add_i8packed : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>; 90 def int_spv_dot4add_u8packed : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>; 91 def int_spv_wave_active_countbits : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_i1_ty], [IntrConvergent, IntrNoMem]>; 92 def int_spv_wave_all : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_i1_ty], [IntrConvergent, IntrNoMem]>; 93 def int_spv_wave_any : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_i1_ty], [IntrConvergent, IntrNoMem]>; 94 def int_spv_wave_reduce_umax : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>], [IntrConvergent, IntrNoMem]>; 95 def int_spv_wave_reduce_max : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>], [IntrConvergent, IntrNoMem]>; 96 def int_spv_wave_reduce_sum : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>], [IntrConvergent, IntrNoMem]>; 97 def int_spv_wave_is_first_lane : DefaultAttrsIntrinsic<[llvm_i1_ty], [], [IntrConvergent]>; 98 def int_spv_wave_readlane : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>, llvm_i32_ty], [IntrConvergent, IntrNoMem]>; 99 def int_spv_sign : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_any_ty], [IntrNoMem]>; 100 def int_spv_radians : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty], [IntrNoMem]>; 101 def int_spv_group_memory_barrier_with_group_sync : DefaultAttrsIntrinsic<[], [], []>; 102 def int_spv_discard : DefaultAttrsIntrinsic<[], [], []>; 103 def int_spv_uclamp : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; 104 def int_spv_sclamp : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; 105 def int_spv_nclamp : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; 106 107 // Create resource handle given the binding information. Returns a 108 // type appropriate for the kind of resource given the set id, binding id, 109 // array size of the binding, as well as an index and an indicator 110 // whether that index may be non-uniform. 111 def int_spv_resource_handlefrombinding 112 : DefaultAttrsIntrinsic< 113 [llvm_any_ty], 114 [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty], 115 [IntrNoMem]>; 116 117 def int_spv_firstbituhigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>; 118 def int_spv_firstbitshigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>; 119 def int_spv_firstbitlow : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>; 120 121 def int_spv_resource_updatecounter 122 : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_any_ty, llvm_i8_ty], 123 [IntrInaccessibleMemOrArgMemOnly]>; 124 125 def int_spv_resource_getpointer 126 : DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_i32_ty], 127 [IntrNoMem]>; 128 129 // Read a value from the image buffer. It does not translate directly to a 130 // single OpImageRead because the result type is not necessarily a 4 element 131 // vector. 132 def int_spv_resource_load_typedbuffer 133 : DefaultAttrsIntrinsic<[llvm_any_ty], [llvm_any_ty, llvm_i32_ty]>; 134 135 // Write a value to the image buffer. Translates directly to a single 136 // OpImageWrite. 137 def int_spv_resource_store_typedbuffer 138 : DefaultAttrsIntrinsic<[], [llvm_any_ty, llvm_i32_ty, llvm_anyvector_ty]>; 139 140} 141