Home | History | Annotate | Download | only in skc
      1 /*
      2  * Copyright 2017 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can
      5  * be found in the LICENSE file.
      6  *
      7  */
      8 
      9 #ifndef SKC_ONCE_MACROS
     10 #define SKC_ONCE_MACROS
     11 
     12 //
     13 //
     14 //
     15 
     16 #include "types.h"
     17 
     18 //
     19 //
     20 //
     21 
     22 #define SKC_RESTRICT   __restrict
     23 
     24 //
     25 //
     26 //
     27 
     28 #define SKC_CONSTANT   __constant
     29 #define SKC_GLOBAL     __global
     30 
     31 //
     32 //
     33 //
     34 
     35 #define SKC_CALLBACK   __stdcall
     36 
     37 //
     38 //
     39 //
     40 
     41 #define SKC_TRUE   1
     42 #define SKC_FALSE  0
     43 
     44 //
     45 //
     46 //
     47 
     48 #define SKC_EMPTY
     49 #define SKC_COMMA  ,
     50 
     51 //
     52 // INDEX, SUFFIX, COMPONENT, PUNCTUATION, RGBA
     53 //
     54 
     55 #define SKC_EXPAND_1()                          \
     56   SKC_EXPAND_X(0,SKC_EMPTY,SKC_EMPTY,SKC_EMPTY,SKC_EMPTY)
     57 
     58 #define SKC_EXPAND_2()                          \
     59   SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,.even)        \
     60   SKC_EXPAND_X(1, 1,.s1,SKC_EMPTY,.odd)
     61 
     62 #define SKC_EXPAND_4()                          \
     63   SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,.even.even)   \
     64   SKC_EXPAND_X(1, 1,.s1,SKC_COMMA,.odd.even)    \
     65   SKC_EXPAND_X(2, 2,.s2,SKC_COMMA,.even.odd)    \
     66   SKC_EXPAND_X(3, 3,.s3,SKC_EMPTY,.odd.odd)
     67 
     68 #define SKC_EXPAND_8()                          \
     69   SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,SKC_EMPTY)    \
     70   SKC_EXPAND_X(1, 1,.s1,SKC_COMMA,SKC_EMPTY)    \
     71   SKC_EXPAND_X(2, 2,.s2,SKC_COMMA,SKC_EMPTY)    \
     72   SKC_EXPAND_X(3, 3,.s3,SKC_COMMA,SKC_EMPTY)    \
     73   SKC_EXPAND_X(4, 4,.s4,SKC_COMMA,SKC_EMPTY)    \
     74   SKC_EXPAND_X(5, 5,.s5,SKC_COMMA,SKC_EMPTY)    \
     75   SKC_EXPAND_X(6, 6,.s6,SKC_COMMA,SKC_EMPTY)    \
     76   SKC_EXPAND_X(7, 7,.s7,SKC_EMPTY,SKC_EMPTY)
     77 
     78 #define SKC_EXPAND_16()                         \
     79   SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,SKC_EMPTY)    \
     80   SKC_EXPAND_X(1, 1,.s1,SKC_COMMA,SKC_EMPTY)    \
     81   SKC_EXPAND_X(2, 2,.s2,SKC_COMMA,SKC_EMPTY)    \
     82   SKC_EXPAND_X(3, 3,.s3,SKC_COMMA,SKC_EMPTY)    \
     83   SKC_EXPAND_X(4, 4,.s4,SKC_COMMA,SKC_EMPTY)    \
     84   SKC_EXPAND_X(5, 5,.s5,SKC_COMMA,SKC_EMPTY)    \
     85   SKC_EXPAND_X(6, 6,.s6,SKC_COMMA,SKC_EMPTY)    \
     86   SKC_EXPAND_X(7, 7,.s7,SKC_COMMA,SKC_EMPTY)    \
     87   SKC_EXPAND_X(8, 8,.s8,SKC_COMMA,SKC_EMPTY)    \
     88   SKC_EXPAND_X(9, 9,.s9,SKC_COMMA,SKC_EMPTY)    \
     89   SKC_EXPAND_X(10,A,.sA,SKC_COMMA,SKC_EMPTY)    \
     90   SKC_EXPAND_X(11,B,.sB,SKC_COMMA,SKC_EMPTY)    \
     91   SKC_EXPAND_X(12,C,.sC,SKC_COMMA,SKC_EMPTY)    \
     92   SKC_EXPAND_X(13,D,.sD,SKC_COMMA,SKC_EMPTY)    \
     93   SKC_EXPAND_X(14,E,.sE,SKC_COMMA,SKC_EMPTY)    \
     94   SKC_EXPAND_X(15,F,.sF,SKC_EMPTY,SKC_EMPTY)
     95 
     96 //
     97 //
     98 //
     99 
    100 #define SKC_BITS_TO_MASK(n)         (((skc_uint)1<<(n))-1)
    101 #define SKC_BITS_TO_MASK_64(n)      (((skc_ulong)1<<(n))-1)
    102 
    103 #define SKC_BITS_TO_MASK_AT(n,b)    (SKC_BITS_TO_MASK(n)<<(b))
    104 #define SKC_BITS_TO_MASK_AT_64(n,b) (SKC_BITS_TO_MASK_64(n)<<(b))
    105 
    106 //
    107 // IF BFE IS SUPPORTED BY THE PLATFORM THEN IMPLEMENT DIFFERENTLY
    108 //
    109 
    110 #define SKC_BFE(x,n,i)        (((x) & SKC_BITS_TO_MASK_AT(n,i)) >> (i))
    111 
    112 //
    113 // IF BFI IS SUPPORTED BY THE PLATFORM THEN IMPLEMENT DIFFERENTLY
    114 //
    115 // Note this BFI assumes the destination bits were already set to zero
    116 //
    117 
    118 #define SKC_BFI(d,n,i,v)      ((((v) & SKC_BITS_TO_MASK(n)) << (i)) | (d))
    119 
    120 //
    121 //
    122 //
    123 
    124 #define SKC_STRINGIFY2(a)     #a
    125 #define SKC_STRINGIFY(a)      SKC_STRINGIFY2(a)
    126 
    127 //
    128 //
    129 //
    130 
    131 #define SKC_EVAL(x)           x
    132 #define SKC_CONCAT(a,b)       SKC_EVAL(a)##SKC_EVAL(b)
    133 
    134 //
    135 //
    136 //
    137 
    138 #define SKC_MAX_MACRO(a,b)    (((a) > (b)) ? (a) : (b))
    139 #define SKC_MIN_MACRO(a,b)    (((a) < (b)) ? (a) : (b))
    140 #define SKC_GTE_MACRO(a,b)    ((a) >= (b))
    141 #define SKC_LT_MACRO(a,b)     ((a) <  (b))
    142 
    143 //
    144 //
    145 //
    146 
    147 #define SKC_COUNT_OF(x)       (sizeof(x) / sizeof(x)[0])
    148 #define SKC_OFFSET_OF(t,m)    ((size_t)&(((t*)0)->m))
    149 #define SKC_MEMBER_SIZE(t,m)  sizeof(((t*)0)->m)
    150 
    151 
    152 //
    153 // Returns rounded up next power-of-2 for non-zero -- via bit
    154 // twiddling hacks, etc.
    155 //
    156 
    157 #define SKC_P2_OR_RS(n,x)     ((x)|(x)>>n)
    158 #define SKC_POW2_RU_U32(x)    (1+SKC_P2_OR_RS(16,SKC_P2_OR_RS(8,SKC_P2_OR_RS(4,SKC_P2_OR_RS(2,SKC_P2_OR_RS(1,x-1))))))
    159 
    160 //
    161 // Round up
    162 //
    163 
    164 #define SKC_ROUND_DOWN(v,q)      (((v) / (q)) * (q))
    165 #define SKC_ROUND_UP(v,q)        ((((v) + (q) - 1) / (q)) * (q))
    166 
    167 #define SKC_ROUND_DOWN_POW2(v,q) ((v) & ~((q) - 1))
    168 #define SKC_ROUND_UP_POW2(v,q)   SKC_ROUND_DOWN_POW2((v) + (q) - 1,q)
    169 
    170 //
    171 //
    172 //
    173 
    174 #if !defined(__OPENCL_C_VERSION__)
    175 
    176 #define SKC_STATIC_ASSERT(p)  static_assert((p),#p)
    177 
    178 #else
    179 
    180 #define SKC_STATIC_ASSERT(p)
    181 
    182 #endif
    183 
    184 //
    185 // Returns 1-based bit position of MSB
    186 //
    187 
    188 #define SKC_MSB_4(x,n)        (((x>>(n-0))&1)+((x>>(n-1))&1)+((x>>(n-2))&1)+((x>>(n-3))&1))
    189 #define SKC_MSB_7654(x)       SKC_MSB_4(x,31)+SKC_MSB_4(x,27)+SKC_MSB_4(x,23)+SKC_MSB_4(x,19)
    190 #define SKC_MSB_3210(x)       SKC_MSB_4(x,15)+SKC_MSB_4(x,11)+SKC_MSB_4(x, 7)+SKC_MSB_4(x, 3)
    191 #define SKC_MSB_U32(x)        ( SKC_MSB_7654(((skc_uint)x)) + SKC_MSB_3210(((skc_uint)x)) )
    192 
    193 //
    194 // FIXME -- handle other compilers besides MSVC/x86
    195 //
    196 
    197 #define SKC_LZCNT_32(v)       __lzcnt(v)
    198 
    199 //
    200 //
    201 //
    202 
    203 #endif
    204 
    205