Home | History | Annotate | Download | only in libSPIRV
      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