8 #define gs_gather_array PREFIXED_NAME(gs_gather_array )
9 #define gs_init_array PREFIXED_NAME(gs_init_array )
10 #define gs_gather PREFIXED_NAME(gs_gather )
11 #define gs_scatter PREFIXED_NAME(gs_scatter )
12 #define gs_init PREFIXED_NAME(gs_init )
13 #define gs_gather_vec PREFIXED_NAME(gs_gather_vec )
14 #define gs_scatter_vec PREFIXED_NAME(gs_scatter_vec )
15 #define gs_init_vec PREFIXED_NAME(gs_init_vec )
16 #define gs_gather_many PREFIXED_NAME(gs_gather_many )
17 #define gs_scatter_many PREFIXED_NAME(gs_scatter_many )
18 #define gs_init_many PREFIXED_NAME(gs_init_many )
19 #define gs_gather_vec_to_many PREFIXED_NAME(gs_gather_vec_to_many )
20 #define gs_scatter_many_to_vec PREFIXED_NAME(gs_scatter_many_to_vec)
21 #define gs_scatter_vec_to_many PREFIXED_NAME(gs_scatter_vec_to_many)
30 #define DEFINE_GATHER(T,OP) \
31 static void gather_array_##T##_##OP( \
32 T *restrict out, const T *restrict in, uint n) \
34 for(;n;--n) { T q = *in++, *p = out++; GS_DO_##OP(*p,q); } \
40 #define DEFINE_INIT(T) \
41 static void init_array_##T(T *restrict out, uint n, gs_op op) \
43 const T e = gs_identity_##T[op]; \
44 for(;n;--n) *out++=e; \
47 #define DEFINE_PROCS(T) \
48 GS_FOR_EACH_OP(T,DEFINE_GATHER) \
60 #define DEFINE_GATHER(T,OP) \
61 static void gather_##T##_##OP( \
62 T *restrict out, const T *restrict in, const unsigned in_stride, \
63 const uint *restrict map) \
66 while((i=*map++)!=-(uint)1) { \
68 j=*map++; do GS_DO_##OP(t,in[j*in_stride]); while((j=*map++)!=-(uint)1); \
76 #define DEFINE_SCATTER(T) \
77 static void scatter_##T( \
78 T *restrict out, const unsigned out_stride, \
79 const T *restrict in, const unsigned in_stride, \
80 const uint *restrict map) \
83 while((i=*map++)!=-(uint)1) { \
84 T t=in[i*in_stride]; \
85 j=*map++; do out[j*out_stride]=t; while((j=*map++)!=-(uint)1); \
92 #define DEFINE_INIT(T) \
93 static void init_##T(T *restrict out, const uint *restrict map, gs_op op) \
95 uint i; const T e = gs_identity_##T[op]; \
96 while((i=*map++)!=-(uint)1) out[i]=e; \
99 #define DEFINE_PROCS(T) \
100 GS_FOR_EACH_OP(T,DEFINE_GATHER) \
108 #undef DEFINE_SCATTER
114 #define DEFINE_GATHER(T,OP) \
115 static void gather_vec_##T##_##OP( \
116 T *restrict out, const T *restrict in, const unsigned vn, \
117 const uint *restrict map) \
120 while((i=*map++)!=-(uint)1) { \
121 T *restrict p = &out[i*vn], *pe = p+vn; \
123 const T *restrict q = &in[j*vn]; \
124 T *restrict pk=p; do { GS_DO_##OP(*pk,*q); ++pk, ++q; } while(pk!=pe); \
125 } while((j=*map++)!=-(uint)1); \
136 unsigned unit_size = vn*gs_dom_size[
dom];
138 while((i=*map++)!=-(
uint)1) {
139 const char *t = (
const char *)in + i*unit_size;
141 memcpy((
char *)out+j*unit_size,t,unit_size);
142 while((j=*map++)!=-(
uint)1);
149 #define DEFINE_INIT(T) \
150 static void init_vec_##T(T *restrict out, const unsigned vn, \
151 const uint *restrict map, gs_op op) \
153 uint i; const T e = gs_identity_##T[op]; \
154 while((i=*map++)!=-(uint)1) { \
155 T *restrict u = (T*)out + vn*i, *ue = u+vn; \
156 do *u++ = e; while(u!=ue); \
160 #define DEFINE_PROCS(T) \
161 GS_FOR_EACH_OP(T,DEFINE_GATHER) \
176 #define SWITCH_DOMAIN_CASE(T) case gs_##T: WITH_DOMAIN(T); break;
177 #define SWITCH_DOMAIN(dom) do switch(dom) { \
178 GS_FOR_EACH_DOMAIN(SWITCH_DOMAIN_CASE) case gs_dom_n: break; } while(0)
180 #define SWITCH_OP_CASE(T,OP) case gs_##OP: WITH_OP(T,OP); break;
181 #define SWITCH_OP(T,op) do switch(op) { \
182 GS_FOR_EACH_OP(T,SWITCH_OP_CASE) case gs_op_n: break; } while(0)
189 #define WITH_OP(T,OP) gather_array_##T##_##OP(out,in,n)
190 #define WITH_DOMAIN(T) SWITCH_OP(T,op)
198 #define WITH_DOMAIN(T) init_array_##T(out,n,op)
209 #define WITH_OP(T,OP) gather_##T##_##OP(out,in,1,map)
210 #define WITH_DOMAIN(T) SWITCH_OP(T,op)
219 #define WITH_DOMAIN(T) scatter_##T(out,1,in,1,map)
227 #define WITH_DOMAIN(T) init_##T(out,map,op)
238 #define WITH_OP(T,OP) gather_vec_##T##_##OP(out,in,vn,map)
239 #define WITH_DOMAIN(T) SWITCH_OP(T,op)
248 #define WITH_DOMAIN(T) init_vec_##T(out,vn,map,op)
260 typedef void *ptr_to_void;
typedef const void *ptr_to_const_void;
261 const ptr_to_void *
p =
out;
const ptr_to_const_void *q = in;
262 #define WITH_OP(T,OP) for(k=0;k<vn;++k) gather_##T##_##OP(p[k],q[k],1,map)
263 #define WITH_DOMAIN(T) SWITCH_OP(T,op)
273 typedef void *ptr_to_void;
typedef const void *ptr_to_const_void;
274 const ptr_to_void *
p =
out;
const ptr_to_const_void *q = in;
275 #define WITH_DOMAIN(T) for(k=0;k<vn;++k) scatter_##T(p[k],1,q[k],1,map)
284 typedef void *ptr_to_void;
const ptr_to_void *
p =
out;
285 #define WITH_DOMAIN(T) for(k=0;k<vn;++k) init_##T(p[k],map,op)
298 unsigned i;
const unsigned unit_size = gs_dom_size[
dom];
299 typedef void *ptr_to_void;
300 const ptr_to_void *
p =
out;
const char *q = in;
301 #define WITH_OP(T,OP) \
302 for(i=vn;i;--i) gather_##T##_##OP(*p++,(const T*)q,vn,map), q+=unit_size
303 #define WITH_DOMAIN(T) SWITCH_OP(T,op)
312 unsigned i;
const unsigned unit_size = gs_dom_size[
dom];
313 typedef const void *ptr_to_const_void;
314 char *
p =
out;
const ptr_to_const_void *q = in;
315 #define WITH_DOMAIN(T) \
316 for(i=vn;i;--i) scatter_##T((T*)p,vn,*q++,1,map), p+=unit_size
324 unsigned i;
const unsigned unit_size = gs_dom_size[
dom];
325 typedef void *ptr_to_void;
326 const ptr_to_void *
p =
out;
const char *q = in;
327 #define WITH_DOMAIN(T) \
328 for(i=vn;i;--i) scatter_##T(*p++,1,(const T*)q,vn,map), q+=unit_size
334 #undef SWITCH_OP_CASE
336 #undef SWITCH_DOMAIN_CASE
#define SWITCH_DOMAIN(dom)
#define GS_DEFINE_IDENTITIES()
#define gs_scatter_vec_to_many
#define GS_FOR_EACH_DOMAIN(macro)
#define GS_DEFINE_DOM_SIZES()
establishes some macros to establish naming conventions
#define gs_gather_vec_to_many
#define gs_scatter_many_to_vec