• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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