1 //===- SPIRVBuiltin.h - SPIR-V extended instruction --------------*- C++ -*-===// 2 // 3 // The LLVM/SPIRV Translator 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 // Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved. 9 // 10 // Permission is hereby granted, free of charge, to any person obtaining a 11 // copy of this software and associated documentation files (the "Software"), 12 // to deal with the Software without restriction, including without limitation 13 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 // and/or sell copies of the Software, and to permit persons to whom the 15 // Software is furnished to do so, subject to the following conditions: 16 // 17 // Redistributions of source code must retain the above copyright notice, 18 // this list of conditions and the following disclaimers. 19 // Redistributions in binary form must reproduce the above copyright notice, 20 // this list of conditions and the following disclaimers in the documentation 21 // and/or other materials provided with the distribution. 22 // Neither the names of Advanced Micro Devices, Inc., nor the names of its 23 // contributors may be used to endorse or promote products derived from this 24 // Software without specific prior written permission. 25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 28 // CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 29 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 30 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH 31 // THE SOFTWARE. 32 // 33 //===----------------------------------------------------------------------===// 34 /// \file 35 /// 36 /// This file defines SPIR-V extended instructions. 37 /// 38 //===----------------------------------------------------------------------===// 39 40 #ifndef SPIRVBUILTIN_HPP_ 41 #define SPIRVBUILTIN_HPP_ 42 43 #include "SPIRVUtil.h" 44 #include "OpenCL.std.h" 45 46 #include <string> 47 #include <vector> 48 49 namespace SPIRV{ 50 51 52 inline bool 53 isOpenCLBuiltinSet (SPIRVExtInstSetKind Set) { 54 return Set == SPIRVEIS_OpenCL; 55 } 56 57 typedef OpenCLLIB::Entrypoints OCLExtOpKind; 58 59 template<> inline void 60 SPIRVMap<OCLExtOpKind, std::string>::init() { 61 add(OpenCLLIB::Acos, "acos"); 62 add(OpenCLLIB::Acosh, "acosh"); 63 add(OpenCLLIB::Acospi, "acospi"); 64 add(OpenCLLIB::Asin, "asin"); 65 add(OpenCLLIB::Asinh, "asinh"); 66 add(OpenCLLIB::Asinpi, "asinpi"); 67 add(OpenCLLIB::Atan, "atan"); 68 add(OpenCLLIB::Atan2, "atan2"); 69 add(OpenCLLIB::Atanh, "atanh"); 70 add(OpenCLLIB::Atanpi, "atanpi"); 71 add(OpenCLLIB::Atan2pi, "atan2pi"); 72 add(OpenCLLIB::Cbrt, "cbrt"); 73 add(OpenCLLIB::Ceil, "ceil"); 74 add(OpenCLLIB::Copysign, "copysign"); 75 add(OpenCLLIB::Cos, "cos"); 76 add(OpenCLLIB::Cosh, "cosh"); 77 add(OpenCLLIB::Cospi, "cospi"); 78 add(OpenCLLIB::Erfc, "erfc"); 79 add(OpenCLLIB::Erf, "erf"); 80 add(OpenCLLIB::Exp, "exp"); 81 add(OpenCLLIB::Exp2, "exp2"); 82 add(OpenCLLIB::Exp10, "exp10"); 83 add(OpenCLLIB::Expm1, "expm1"); 84 add(OpenCLLIB::Fabs, "fabs"); 85 add(OpenCLLIB::Fdim, "fdim"); 86 add(OpenCLLIB::Floor, "floor"); 87 add(OpenCLLIB::Fma, "fma"); 88 add(OpenCLLIB::Fmax, "fmax"); 89 add(OpenCLLIB::Fmin, "fmin"); 90 add(OpenCLLIB::Fmod, "fmod"); 91 add(OpenCLLIB::Fract, "fract"); 92 add(OpenCLLIB::Frexp, "frexp"); 93 add(OpenCLLIB::Hypot, "hypot"); 94 add(OpenCLLIB::Ilogb, "ilogb"); 95 add(OpenCLLIB::Ldexp, "ldexp"); 96 add(OpenCLLIB::Lgamma, "lgamma"); 97 add(OpenCLLIB::Lgamma_r, "lgamma_r"); 98 add(OpenCLLIB::Log, "log"); 99 add(OpenCLLIB::Log2, "log2"); 100 add(OpenCLLIB::Log10, "log10"); 101 add(OpenCLLIB::Log1p, "log1p"); 102 add(OpenCLLIB::Logb, "logb"); 103 add(OpenCLLIB::Mad, "mad"); 104 add(OpenCLLIB::Maxmag, "maxmag"); 105 add(OpenCLLIB::Minmag, "minmag"); 106 add(OpenCLLIB::Modf, "modf"); 107 add(OpenCLLIB::Nan, "nan"); 108 add(OpenCLLIB::Nextafter, "nextafter"); 109 add(OpenCLLIB::Pow, "pow"); 110 add(OpenCLLIB::Pown, "pown"); 111 add(OpenCLLIB::Powr, "powr"); 112 add(OpenCLLIB::Remainder, "remainder"); 113 add(OpenCLLIB::Remquo, "remquo"); 114 add(OpenCLLIB::Rint, "rint"); 115 add(OpenCLLIB::Rootn, "rootn"); 116 add(OpenCLLIB::Round, "round"); 117 add(OpenCLLIB::Rsqrt, "rsqrt"); 118 add(OpenCLLIB::Sin, "sin"); 119 add(OpenCLLIB::Sincos, "sincos"); 120 add(OpenCLLIB::Sinh, "sinh"); 121 add(OpenCLLIB::Sinpi, "sinpi"); 122 add(OpenCLLIB::Sqrt, "sqrt"); 123 add(OpenCLLIB::Tan, "tan"); 124 add(OpenCLLIB::Tanh, "tanh"); 125 add(OpenCLLIB::Tanpi, "tanpi"); 126 add(OpenCLLIB::Tgamma, "tgamma"); 127 add(OpenCLLIB::Trunc, "trunc"); 128 add(OpenCLLIB::Half_cos, "half_cos"); 129 add(OpenCLLIB::Half_divide, "half_divide"); 130 add(OpenCLLIB::Half_exp, "half_exp"); 131 add(OpenCLLIB::Half_exp2, "half_exp2"); 132 add(OpenCLLIB::Half_exp10, "half_exp10"); 133 add(OpenCLLIB::Half_log, "half_log"); 134 add(OpenCLLIB::Half_log2, "half_log2"); 135 add(OpenCLLIB::Half_log10, "half_log10"); 136 add(OpenCLLIB::Half_powr, "half_powr"); 137 add(OpenCLLIB::Half_recip, "half_recip"); 138 add(OpenCLLIB::Half_rsqrt, "half_rsqrt"); 139 add(OpenCLLIB::Half_sin, "half_sin"); 140 add(OpenCLLIB::Half_sqrt, "half_sqrt"); 141 add(OpenCLLIB::Half_tan, "half_tan"); 142 add(OpenCLLIB::Native_cos, "native_cos"); 143 add(OpenCLLIB::Native_divide, "native_divide"); 144 add(OpenCLLIB::Native_exp, "native_exp"); 145 add(OpenCLLIB::Native_exp2, "native_exp2"); 146 add(OpenCLLIB::Native_exp10, "native_exp10"); 147 add(OpenCLLIB::Native_log, "native_log"); 148 add(OpenCLLIB::Native_log2, "native_log2"); 149 add(OpenCLLIB::Native_log10, "native_log10"); 150 add(OpenCLLIB::Native_powr, "native_powr"); 151 add(OpenCLLIB::Native_recip, "native_recip"); 152 add(OpenCLLIB::Native_rsqrt, "native_rsqrt"); 153 add(OpenCLLIB::Native_sin, "native_sin"); 154 add(OpenCLLIB::Native_sqrt, "native_sqrt"); 155 add(OpenCLLIB::Native_tan, "native_tan"); 156 add(OpenCLLIB::FClamp, "fclamp"); 157 add(OpenCLLIB::Degrees, "degrees"); 158 add(OpenCLLIB::Mix, "mix"); 159 add(OpenCLLIB::FMax_common, "fmax_common"); 160 add(OpenCLLIB::FMin_common, "fmin_common"); 161 add(OpenCLLIB::Radians, "radians"); 162 add(OpenCLLIB::Step, "step"); 163 add(OpenCLLIB::Smoothstep, "smoothstep"); 164 add(OpenCLLIB::Sign, "sign"); 165 add(OpenCLLIB::Cross, "cross"); 166 add(OpenCLLIB::Distance, "distance"); 167 add(OpenCLLIB::Length, "length"); 168 add(OpenCLLIB::Normalize, "normalize"); 169 add(OpenCLLIB::Fast_distance, "fast_distance"); 170 add(OpenCLLIB::Fast_length, "fast_length"); 171 add(OpenCLLIB::Fast_normalize, "fast_normalize"); 172 add(OpenCLLIB::Read_imagef, "read_imagef"); 173 add(OpenCLLIB::Read_imagei, "read_imagei"); 174 add(OpenCLLIB::Read_imageui, "read_imageui"); 175 add(OpenCLLIB::Read_imageh, "read_imageh"); 176 add(OpenCLLIB::Read_imagef_samplerless, "read_imagef_samplerless"); 177 add(OpenCLLIB::Read_imagei_samplerless, "read_imagei_samplerless"); 178 add(OpenCLLIB::Read_imageui_samplerless, "read_imageui_samplerless"); 179 add(OpenCLLIB::Read_imageh_samplerless, "read_imageh_samplerless"); 180 add(OpenCLLIB::Write_imagef, "write_imagef"); 181 add(OpenCLLIB::Write_imagei, "write_imagei"); 182 add(OpenCLLIB::Write_imageui, "write_imageui"); 183 add(OpenCLLIB::Write_imageh, "write_imageh"); 184 add(OpenCLLIB::Read_imagef_mipmap_lod, "read_imagef_mipmap_lod"); 185 add(OpenCLLIB::Read_imagei_mipmap_lod, "read_imagei_mipmap_lod"); 186 add(OpenCLLIB::Read_imageui_mipmap_lod, "read_imageui_mipmap_lod"); 187 add(OpenCLLIB::Read_imagef_mipmap_grad, "read_imagef_mipmap_gradient"); 188 add(OpenCLLIB::Read_imagei_mipmap_grad, "read_imagei_mipmap_gradient"); 189 add(OpenCLLIB::Read_imageui_mipmap_grad, "read_imageui_mipmap_gradient"); 190 add(OpenCLLIB::Write_imagef_mipmap_lod, "write_imagef_mipmap_lod"); 191 add(OpenCLLIB::Write_imagei_mipmap_lod, "write_imagei_mipmap_lod"); 192 add(OpenCLLIB::Write_imageui_mipmap_lod, "write_imageui_mipmap_lod"); 193 add(OpenCLLIB::Get_image_width, "get_image_width"); 194 add(OpenCLLIB::Get_image_height, "get_image_height"); 195 add(OpenCLLIB::Get_image_depth, "get_image_depth"); 196 add(OpenCLLIB::Get_image_channel_data_type, "get_image_channel_data_type"); 197 add(OpenCLLIB::Get_image_channel_order, "get_image_channel_order"); 198 add(OpenCLLIB::Get_image_dim, "get_image_dim"); 199 add(OpenCLLIB::Get_image_array_size, "get_image_array_size"); 200 add(OpenCLLIB::Get_image_num_samples, "get_image_num_samples"); 201 add(OpenCLLIB::Get_image_num_mip_levels, "get_image_num_mip_levels"); 202 add(OpenCLLIB::SAbs, "s_abs"); 203 add(OpenCLLIB::SAbs_diff, "s_abs_diff"); 204 add(OpenCLLIB::SAdd_sat, "s_add_sat"); 205 add(OpenCLLIB::UAdd_sat, "u_add_sat"); 206 add(OpenCLLIB::SHadd, "s_hadd"); 207 add(OpenCLLIB::UHadd, "u_hadd"); 208 add(OpenCLLIB::SRhadd, "s_rhadd"); 209 add(OpenCLLIB::URhadd, "u_rhadd"); 210 add(OpenCLLIB::SClamp, "s_clamp"); 211 add(OpenCLLIB::UClamp, "u_clamp"); 212 add(OpenCLLIB::Clz, "clz"); 213 add(OpenCLLIB::Ctz, "ctz"); 214 add(OpenCLLIB::SMad_hi, "s_mad_hi"); 215 add(OpenCLLIB::SMad_sat, "s_mad_sat"); 216 add(OpenCLLIB::UMad_sat, "u_mad_sat"); 217 add(OpenCLLIB::SMax, "s_max"); 218 add(OpenCLLIB::SMin, "s_min"); 219 add(OpenCLLIB::UMax, "u_max"); 220 add(OpenCLLIB::UMin, "u_min"); 221 add(OpenCLLIB::SMul_hi, "s_mul_hi"); 222 add(OpenCLLIB::Rotate, "rotate"); 223 add(OpenCLLIB::SSub_sat, "s_sub_sat"); 224 add(OpenCLLIB::USub_sat, "u_sub_sat"); 225 add(OpenCLLIB::U_Upsample, "u_upsample"); 226 add(OpenCLLIB::S_Upsample, "s_upsample"); 227 add(OpenCLLIB::Popcount, "popcount"); 228 add(OpenCLLIB::SMad24, "s_mad24"); 229 add(OpenCLLIB::UMad24, "u_mad24"); 230 add(OpenCLLIB::SMul24, "s_mul24"); 231 add(OpenCLLIB::UMul24, "u_mul24"); 232 add(OpenCLLIB::Vloadn, "vloadn"); 233 add(OpenCLLIB::Vstoren, "vstoren"); 234 add(OpenCLLIB::Vload_half, "vload_half"); 235 add(OpenCLLIB::Vload_halfn, "vload_halfn"); 236 add(OpenCLLIB::Vstore_half, "vstore_half"); 237 add(OpenCLLIB::Vstore_half_r, "vstore_half_r"); 238 add(OpenCLLIB::Vstore_halfn, "vstore_halfn"); 239 add(OpenCLLIB::Vstore_halfn_r, "vstore_halfn_r"); 240 add(OpenCLLIB::Vloada_halfn, "vloada_halfn"); 241 add(OpenCLLIB::Vstorea_halfn, "vstorea_halfn"); 242 add(OpenCLLIB::Vstorea_halfn_r, "vstorea_halfn_r"); 243 add(OpenCLLIB::Shuffle, "shuffle"); 244 add(OpenCLLIB::Shuffle2, "shuffle2"); 245 add(OpenCLLIB::Printf, "printf"); 246 add(OpenCLLIB::Prefetch, "prefetch"); 247 add(OpenCLLIB::Bitselect, "bitselect"); 248 add(OpenCLLIB::Select, "select"); 249 add(OpenCLLIB::UAbs, "u_abs"); 250 add(OpenCLLIB::UAbs_diff, "u_abs_diff"); 251 add(OpenCLLIB::UMul_hi, "u_mul_hi"); 252 add(OpenCLLIB::UMad_hi, "u_mad_hi"); 253 } 254 SPIRV_DEF_NAMEMAP(OCLExtOpKind, OCLExtOpMap) 255 256 inline bool 257 isReadImage(SPIRVWord EntryPoint) { 258 return EntryPoint >= OpenCLLIB::Read_imagef && 259 EntryPoint <= OpenCLLIB::Read_imageui; 260 } 261 262 inline bool 263 isWriteImage(SPIRVWord EntryPoint) { 264 return EntryPoint >= OpenCLLIB::Write_imagef && 265 EntryPoint <= OpenCLLIB::Write_imageui; 266 } 267 268 inline bool 269 isReadOrWriteImage(SPIRVWord EntryPoint) { 270 return isReadImage(EntryPoint) || isWriteImage(EntryPoint); 271 } 272 273 } 274 275 #endif 276