This source file includes following definitions.
- DUMP
- DUMP
- GET_FIRST_NON_LOOP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #ifndef OPAL_DATATYPE_INTERNAL_H_HAS_BEEN_INCLUDED
28 #define OPAL_DATATYPE_INTERNAL_H_HAS_BEEN_INCLUDED
29
30 #include "opal_config.h"
31
32 #include <stdarg.h>
33 #include <string.h>
34
35 #if defined(VERBOSE)
36 #include "opal/util/output.h"
37
38 extern int opal_datatype_dfd;
39
40 # define DDT_DUMP_STACK( PSTACK, STACK_POS, PDESC, NAME ) \
41 opal_datatype_dump_stack( (PSTACK), (STACK_POS), (PDESC), (NAME) )
42 # if defined(ACCEPT_C99)
43 # define DUMP( ARGS... ) opal_output(opal_datatype_dfd, __VA_ARGS__)
44 # else
45 # if defined(__GNUC__) && !defined(__STDC__)
46 # define DUMP(ARGS...) opal_output( opal_datatype_dfd, ARGS)
47 # else
48 static inline void DUMP( char* fmt, ... )
49 {
50 va_list list;
51
52 va_start( list, fmt );
53 opal_output_vverbose( 0, opal_datatype_dfd, fmt, list );
54 va_end( list );
55 }
56 # endif
57 # endif
58 #else
59 # define DDT_DUMP_STACK( PSTACK, STACK_POS, PDESC, NAME )
60 # if defined(ACCEPT_C99)
61 # define DUMP(ARGS...)
62 # else
63 # if defined(__GNUC__) && !defined(__STDC__)
64 # define DUMP(ARGS...)
65 # else
66
67 # if !defined(__PGI)
68 # define __opal_attribute_unused_tmp__ __opal_attribute_unused__
69 # else
70 # define __opal_attribute_unused_tmp__
71 # endif
72 static inline void DUMP( char* fmt __opal_attribute_unused_tmp__, ... )
73 {
74 #if defined(__PGI)
75
76
77 va_list arglist;
78 va_start(arglist, fmt);
79 va_end(arglist);
80 #endif
81 }
82 # undef __opal_attribute_unused_tmp__
83 # endif
84 # endif
85 #endif
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 #define OPAL_DATATYPE_LOOP 0
105 #define OPAL_DATATYPE_END_LOOP 1
106 #define OPAL_DATATYPE_LB 2
107 #define OPAL_DATATYPE_UB 3
108 #define OPAL_DATATYPE_FIRST_TYPE 4
109 #define OPAL_DATATYPE_INT1 4
110 #define OPAL_DATATYPE_INT2 5
111 #define OPAL_DATATYPE_INT4 6
112 #define OPAL_DATATYPE_INT8 7
113 #define OPAL_DATATYPE_INT16 8
114 #define OPAL_DATATYPE_UINT1 9
115 #define OPAL_DATATYPE_UINT2 10
116 #define OPAL_DATATYPE_UINT4 11
117 #define OPAL_DATATYPE_UINT8 12
118 #define OPAL_DATATYPE_UINT16 13
119 #define OPAL_DATATYPE_FLOAT2 14
120 #define OPAL_DATATYPE_FLOAT4 15
121 #define OPAL_DATATYPE_FLOAT8 16
122 #define OPAL_DATATYPE_FLOAT12 17
123 #define OPAL_DATATYPE_FLOAT16 18
124 #define OPAL_DATATYPE_SHORT_FLOAT_COMPLEX 19
125 #define OPAL_DATATYPE_FLOAT_COMPLEX 20
126 #define OPAL_DATATYPE_DOUBLE_COMPLEX 21
127 #define OPAL_DATATYPE_LONG_DOUBLE_COMPLEX 22
128 #define OPAL_DATATYPE_BOOL 23
129 #define OPAL_DATATYPE_WCHAR 24
130 #define OPAL_DATATYPE_UNAVAILABLE 25
131
132 #ifndef OPAL_DATATYPE_MAX_PREDEFINED
133 #define OPAL_DATATYPE_MAX_PREDEFINED (OPAL_DATATYPE_UNAVAILABLE+1)
134 #elif OPAL_DATATYPE_MAX_PREDEFINED <= OPAL_DATATYPE_UNAVAILABLE
135
136
137
138
139 #error OPAL_DATATYPE_MAX_PREDEFINED should be updated to the next value after the OPAL_DATATYPE_UNAVAILABLE define
140 #endif
141
142 #define DT_INCREASE_STACK 8
143
144 BEGIN_C_DECLS
145
146 struct ddt_elem_id_description {
147 uint16_t flags;
148 uint16_t type;
149 };
150 typedef struct ddt_elem_id_description ddt_elem_id_description;
151
152
153
154
155
156
157 struct ddt_elem_desc {
158 ddt_elem_id_description common;
159 uint32_t blocklen;
160 size_t count;
161 ptrdiff_t extent;
162 ptrdiff_t disp;
163 };
164 typedef struct ddt_elem_desc ddt_elem_desc_t;
165
166
167
168
169
170
171
172
173
174 struct ddt_loop_desc {
175 ddt_elem_id_description common;
176 uint32_t items;
177 uint32_t loops;
178 size_t unused;
179 ptrdiff_t extent;
180 };
181 typedef struct ddt_loop_desc ddt_loop_desc_t;
182
183 struct ddt_endloop_desc {
184 ddt_elem_id_description common;
185 uint32_t items;
186 uint32_t unused;
187 size_t size;
188 ptrdiff_t first_elem_disp;
189 };
190 typedef struct ddt_endloop_desc ddt_endloop_desc_t;
191
192 union dt_elem_desc {
193 ddt_elem_desc_t elem;
194 ddt_loop_desc_t loop;
195 ddt_endloop_desc_t end_loop;
196 };
197
198 #define CREATE_LOOP_START( _place, _count, _items, _extent, _flags ) \
199 do { \
200 (_place)->loop.common.type = OPAL_DATATYPE_LOOP; \
201 (_place)->loop.common.flags = (_flags) & ~OPAL_DATATYPE_FLAG_DATA; \
202 (_place)->loop.loops = (_count); \
203 (_place)->loop.items = (_items); \
204 (_place)->loop.extent = (_extent); \
205 (_place)->loop.unused = -1; \
206 } while(0)
207
208 #define CREATE_LOOP_END( _place, _items, _first_item_disp, _size, _flags ) \
209 do { \
210 (_place)->end_loop.common.type = OPAL_DATATYPE_END_LOOP; \
211 (_place)->end_loop.common.flags = (_flags) & ~OPAL_DATATYPE_FLAG_DATA; \
212 (_place)->end_loop.items = (_items); \
213 (_place)->end_loop.first_elem_disp = (_first_item_disp); \
214 (_place)->end_loop.size = (_size); \
215 (_place)->end_loop.unused = -1; \
216 } while(0)
217
218
219
220
221
222
223
224
225 #define CREATE_ELEM( _place, _type, _flags, _count, _disp, _extent ) \
226 do { \
227 (_place)->elem.common.flags = (_flags) | OPAL_DATATYPE_FLAG_DATA; \
228 (_place)->elem.common.type = (_type); \
229 (_place)->elem.disp = (_disp); \
230 (_place)->elem.extent = (_extent); \
231 (_place)->elem.count = (_count); \
232 (_place)->elem.blocklen = 1; \
233 } while(0)
234
235
236
237 OPAL_DECLSPEC extern union dt_elem_desc opal_datatype_predefined_elem_desc[2 * OPAL_DATATYPE_MAX_PREDEFINED];
238 struct opal_datatype_t;
239
240
241
242
243
244
245
246
247
248
249 #define OPAL_DATATYPE_INIT_PTYPES_ARRAY_UNAVAILABLE NULL
250 #define OPAL_DATATYPE_INIT_PTYPES_ARRAY(NAME) (size_t[OPAL_DATATYPE_MAX_PREDEFINED]){ [OPAL_DATATYPE_ ## NAME] = 1, [OPAL_DATATYPE_MAX_PREDEFINED-1] = 0 }
251
252 #define OPAL_DATATYPE_INIT_NAME(NAME) "OPAL_" #NAME
253
254
255
256
257
258
259 #define OPAL_DATATYPE_INIT_DESC_PREDEFINED(NAME) \
260 { \
261 .length = 1, .used = 1, \
262 .desc = &(opal_datatype_predefined_elem_desc[2 * OPAL_DATATYPE_ ## NAME]) \
263 }
264 #define OPAL_DATATYPE_INIT_DESC_NULL {.length = 0, .used = 0, .desc = NULL}
265
266 #define OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( NAME, FLAGS ) \
267 { \
268 .super = OPAL_OBJ_STATIC_INIT(opal_datatype_t), \
269 .flags = OPAL_DATATYPE_FLAG_UNAVAILABLE | OPAL_DATATYPE_FLAG_PREDEFINED | (FLAGS), \
270 .id = OPAL_DATATYPE_ ## NAME, \
271 .bdt_used = 0, \
272 .size = 0, \
273 .true_lb = 0, .true_ub = 0, .lb = 0, .ub = 0, \
274 .align = 0, \
275 .nbElems = 1, \
276 .name = OPAL_DATATYPE_INIT_NAME(NAME), \
277 .desc = OPAL_DATATYPE_INIT_DESC_PREDEFINED(UNAVAILABLE), \
278 .opt_desc = OPAL_DATATYPE_INIT_DESC_PREDEFINED(UNAVAILABLE), \
279 .ptypes = OPAL_DATATYPE_INIT_PTYPES_ARRAY_UNAVAILABLE \
280 }
281
282 #define OPAL_DATATYPE_INITIALIZER_UNAVAILABLE( FLAGS ) \
283 OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( UNAVAILABLE, (FLAGS) )
284
285 #define OPAL_DATATYPE_INITIALIZER_EMPTY( FLAGS ) \
286 { \
287 .super = OPAL_OBJ_STATIC_INIT(opal_datatype_t), \
288 .flags = OPAL_DATATYPE_FLAG_PREDEFINED | (FLAGS), \
289 .id = 0, \
290 .bdt_used = 0, \
291 .size = 0, \
292 .true_lb = 0, .true_ub = 0, .lb = 0, .ub = 0, \
293 .align = 0, \
294 .nbElems = 1, \
295 .name = OPAL_DATATYPE_INIT_NAME(EMPTY), \
296 .desc = OPAL_DATATYPE_INIT_DESC_NULL, \
297 .opt_desc = OPAL_DATATYPE_INIT_DESC_NULL, \
298 .ptypes = OPAL_DATATYPE_INIT_PTYPES_ARRAY_UNAVAILABLE \
299 }
300
301 #define OPAL_DATATYPE_INIT_BASIC_TYPE( TYPE, NAME, FLAGS ) \
302 { \
303 .super = OPAL_OBJ_STATIC_INIT(opal_datatype_t), \
304 .flags = OPAL_DATATYPE_FLAG_PREDEFINED | (FLAGS), \
305 .id = TYPE, \
306 .bdt_used = (((uint32_t)1)<<(TYPE)), \
307 .size = 0, \
308 .true_lb = 0, .true_ub = 0, .lb = 0, .ub = 0, \
309 .align = 0, \
310 .nbElems = 1, \
311 .name = OPAL_DATATYPE_INIT_NAME(NAME), \
312 .desc = OPAL_DATATYPE_INIT_DESC_NULL, \
313 .opt_desc = OPAL_DATATYPE_INIT_DESC_NULL, \
314 .ptypes = OPAL_DATATYPE_INIT_PTYPES_ARRAY_UNAVAILABLE \
315 }
316
317 #define OPAL_DATATYPE_INIT_BASIC_DATATYPE( TYPE, ALIGN, NAME, FLAGS ) \
318 { \
319 .super = OPAL_OBJ_STATIC_INIT(opal_datatype_t), \
320 .flags = OPAL_DATATYPE_FLAG_BASIC | (FLAGS), \
321 .id = OPAL_DATATYPE_ ## NAME, \
322 .bdt_used = (((uint32_t)1)<<(OPAL_DATATYPE_ ## NAME)), \
323 .size = sizeof(TYPE), \
324 .true_lb = 0, .true_ub = sizeof(TYPE), .lb = 0, .ub = sizeof(TYPE), \
325 .align = (ALIGN), \
326 .nbElems = 1, \
327 .name = OPAL_DATATYPE_INIT_NAME(NAME), \
328 .desc = OPAL_DATATYPE_INIT_DESC_PREDEFINED(NAME), \
329 .opt_desc = OPAL_DATATYPE_INIT_DESC_PREDEFINED(NAME), \
330 .ptypes = OPAL_DATATYPE_INIT_PTYPES_ARRAY_UNAVAILABLE \
331 }
332
333 #define OPAL_DATATYPE_INITIALIZER_LOOP(FLAGS) OPAL_DATATYPE_INIT_BASIC_TYPE( OPAL_DATATYPE_LOOP, LOOP_S, FLAGS )
334 #define OPAL_DATATYPE_INITIALIZER_END_LOOP(FLAGS) OPAL_DATATYPE_INIT_BASIC_TYPE( OPAL_DATATYPE_END_LOOP, LOOP_E, FLAGS )
335 #define OPAL_DATATYPE_INITIALIZER_LB(FLAGS) OPAL_DATATYPE_INIT_BASIC_TYPE( OPAL_DATATYPE_LB, LB, FLAGS )
336 #define OPAL_DATATYPE_INITIALIZER_UB(FLAGS) OPAL_DATATYPE_INIT_BASIC_TYPE( OPAL_DATATYPE_UB, UB, FLAGS )
337 #define OPAL_DATATYPE_INITIALIZER_INT1(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( int8_t, OPAL_ALIGNMENT_INT8, INT1, FLAGS )
338 #define OPAL_DATATYPE_INITIALIZER_INT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( int16_t, OPAL_ALIGNMENT_INT16, INT2, FLAGS )
339 #define OPAL_DATATYPE_INITIALIZER_INT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( int32_t, OPAL_ALIGNMENT_INT32, INT4, FLAGS )
340 #define OPAL_DATATYPE_INITIALIZER_INT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( int64_t, OPAL_ALIGNMENT_INT64, INT8, FLAGS )
341 #ifdef HAVE_INT128_T
342 #define OPAL_DATATYPE_INITIALIZER_INT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( int128_t, OPAL_ALIGNMENT_INT128, INT16, FLAGS )
343 #else
344 #define OPAL_DATATYPE_INITIALIZER_INT16(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( INT16, FLAGS )
345 #endif
346 #define OPAL_DATATYPE_INITIALIZER_UINT1(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( uint8_t, OPAL_ALIGNMENT_INT8, UINT1, FLAGS )
347 #define OPAL_DATATYPE_INITIALIZER_UINT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( uint16_t, OPAL_ALIGNMENT_INT16, UINT2, FLAGS )
348 #define OPAL_DATATYPE_INITIALIZER_UINT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( uint32_t, OPAL_ALIGNMENT_INT32, UINT4, FLAGS )
349 #define OPAL_DATATYPE_INITIALIZER_UINT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( uint64_t, OPAL_ALIGNMENT_INT64, UINT8, FLAGS )
350 #ifdef HAVE_UINT128_T
351 #define OPAL_DATATYPE_INITIALIZER_UINT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( uint128_t, OPAL_ALIGNMENT_INT128, UINT16, FLAGS )
352 #else
353 #define OPAL_DATATYPE_INITIALIZER_UINT16(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( INT16, FLAGS )
354 #endif
355
356 #if defined(HAVE_SHORT_FLOAT) && SIZEOF_SHORT_FLOAT == 2
357 #define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float, OPAL_ALIGNMENT_SHORT_FLOAT, FLOAT2, FLAGS )
358 #elif SIZEOF_FLOAT == 2
359 #define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( float, OPAL_ALIGNMENT_FLOAT, FLOAT2, FLAGS )
360 #elif SIZEOF_DOUBLE == 2
361 #define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT2, FLAGS )
362 #elif SIZEOF_LONG_DOUBLE == 2
363 #define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT2, FLAGS )
364 #elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 2
365 #define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT2, FLAGS )
366 #else
367 #define OPAL_DATATYPE_INITIALIZER_FLOAT2(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT2, FLAGS )
368 #endif
369
370 #if defined(HAVE_SHORT_FLOAT) && SIZEOF_SHORT_FLOAT == 4
371 #define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float, OPAL_ALIGNMENT_SHORT_FLOAT, FLOAT4, FLAGS )
372 #elif SIZEOF_FLOAT == 4
373 #define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( float, OPAL_ALIGNMENT_FLOAT, FLOAT4, FLAGS )
374 #elif SIZEOF_DOUBLE == 4
375 #define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT4, FLAGS )
376 #elif SIZEOF_LONG_DOUBLE == 4
377 #define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT4, FLAGS )
378 #elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 4
379 #define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT4, FLAGS )
380 #else
381 #define OPAL_DATATYPE_INITIALIZER_FLOAT4(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT4, FLAGS )
382 #endif
383
384 #if defined(HAVE_SHORT_FLOAT) && SIZEOF_SHORT_FLOAT == 8
385 #define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float, OPAL_ALIGNMENT_SHORT_FLOAT, FLOAT8, FLAGS )
386 #elif SIZEOF_FLOAT == 8
387 #define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( float, OPAL_ALIGNMENT_FLOAT, FLOAT8, FLAGS )
388 #elif SIZEOF_DOUBLE == 8
389 #define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT8, FLAGS )
390 #elif SIZEOF_LONG_DOUBLE == 8
391 #define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT8, FLAGS )
392 #elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 8
393 #define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT8, FLAGS )
394 #else
395 #define OPAL_DATATYPE_INITIALIZER_FLOAT8(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT8, FLAGS )
396 #endif
397
398 #if defined(HAVE_SHORT_FLOAT) && SIZEOF_SHORT_FLOAT == 12
399 #define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float, OPAL_ALIGNMENT_SHORT_FLOAT, FLOAT12, FLAGS )
400 #elif SIZEOF_FLOAT == 12
401 #define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( float, OPAL_ALIGNMENT_FLOAT, FLOAT12, FLAGS )
402 #elif SIZEOF_DOUBLE == 12
403 #define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT12, FLAGS )
404 #elif SIZEOF_LONG_DOUBLE == 12
405 #define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT12, FLAGS )
406 #elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 12
407 #define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT12, FLAGS )
408 #else
409 #define OPAL_DATATYPE_INITIALIZER_FLOAT12(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT12, FLAGS )
410 #endif
411
412 #if defined(HAVE_SHORT_FLOAT) && SIZEOF_SHORT_FLOAT == 16
413 #define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float, OPAL_ALIGNMENT_SHORT_FLOAT, FLOAT16, FLAGS )
414 #elif SIZEOF_FLOAT == 16
415 #define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( float, OPAL_ALIGNMENT_FLOAT, FLOAT16, FLAGS )
416 #elif SIZEOF_DOUBLE == 16
417 #define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double, OPAL_ALIGNMENT_DOUBLE, FLOAT16, FLAGS )
418 #elif SIZEOF_LONG_DOUBLE == 16
419 #define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double, OPAL_ALIGNMENT_LONG_DOUBLE, FLOAT16, FLAGS )
420 #elif defined(HAVE_OPAL_SHORT_FLOAT_T) && SIZEOF_OPAL_SHORT_FLOAT_T == 16
421 #define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, FLOAT16, FLAGS )
422 #else
423 #define OPAL_DATATYPE_INITIALIZER_FLOAT16(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( FLOAT16, FLAGS )
424 #endif
425
426 #if defined(HAVE_SHORT_FLOAT__COMPLEX)
427 #define OPAL_DATATYPE_INITIALIZER_SHORT_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( short float _Complex, OPAL_ALIGNMENT_SHORT_FLOAT_COMPLEX, SHORT_FLOAT_COMPLEX, FLAGS )
428 #elif defined(HAVE_OPAL_SHORT_FLOAT_COMPLEX_T)
429 #define OPAL_DATATYPE_INITIALIZER_SHORT_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( opal_short_float_complex_t, OPAL_ALIGNMENT_OPAL_SHORT_FLOAT_T, SHORT_FLOAT_COMPLEX, FLAGS )
430 #else
431 #define OPAL_DATATYPE_INITIALIZER_SHORT_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( SHORT_FLOAT_COMPLEX, FLAGS)
432 #endif
433
434 #define OPAL_DATATYPE_INITIALIZER_FLOAT_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( float _Complex, OPAL_ALIGNMENT_FLOAT_COMPLEX, FLOAT_COMPLEX, FLAGS )
435
436 #define OPAL_DATATYPE_INITIALIZER_DOUBLE_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( double _Complex, OPAL_ALIGNMENT_DOUBLE_COMPLEX, DOUBLE_COMPLEX, FLAGS )
437
438 #define OPAL_DATATYPE_INITIALIZER_LONG_DOUBLE_COMPLEX(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( long double _Complex, OPAL_ALIGNMENT_LONG_DOUBLE_COMPLEX, LONG_DOUBLE_COMPLEX, FLAGS )
439
440 #define OPAL_DATATYPE_INITIALIZER_BOOL(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( _Bool, OPAL_ALIGNMENT_BOOL, BOOL, FLAGS )
441
442 #if OPAL_ALIGNMENT_WCHAR != 0
443 #define OPAL_DATATYPE_INITIALIZER_WCHAR(FLAGS) OPAL_DATATYPE_INIT_BASIC_DATATYPE( wchar_t, OPAL_ALIGNMENT_WCHAR, WCHAR, FLAGS )
444 #else
445 #define OPAL_DATATYPE_INITIALIZER_WCHAR(FLAGS) OPAL_DATATYPE_INITIALIZER_UNAVAILABLE_NAMED( WCHAR, FLAGS )
446 #endif
447
448 #define BASIC_DDT_FROM_ELEM( ELEM ) (opal_datatype_basicDatatypes[(ELEM).elem.common.type])
449
450 #define SAVE_STACK( PSTACK, INDEX, TYPE, COUNT, DISP) \
451 do { \
452 (PSTACK)->index = (INDEX); \
453 (PSTACK)->type = (TYPE); \
454 (PSTACK)->count = (COUNT); \
455 (PSTACK)->disp = (DISP); \
456 } while(0)
457
458 #define PUSH_STACK( PSTACK, STACK_POS, INDEX, TYPE, COUNT, DISP) \
459 do { \
460 dt_stack_t* pTempStack = (PSTACK) + 1; \
461 SAVE_STACK( pTempStack, (INDEX), (TYPE), (COUNT), (DISP) ); \
462 (STACK_POS)++; \
463 (PSTACK) = pTempStack; \
464 } while(0)
465
466 #if OPAL_ENABLE_DEBUG
467 #define OPAL_DATATYPE_SAFEGUARD_POINTER( ACTPTR, LENGTH, INITPTR, PDATA, COUNT ) \
468 { \
469 unsigned char *__lower_bound = (INITPTR), *__upper_bound; \
470 assert( ((LENGTH) != 0) && ((COUNT) != 0) ); \
471 __lower_bound += (PDATA)->true_lb; \
472 __upper_bound = (INITPTR) + (PDATA)->true_ub + \
473 ((PDATA)->ub - (PDATA)->lb) * ((COUNT) - 1); \
474 if( ((ACTPTR) < __lower_bound) || ((ACTPTR) >= __upper_bound) ) { \
475 opal_datatype_safeguard_pointer_debug_breakpoint( (ACTPTR), (LENGTH), (INITPTR), (PDATA), (COUNT) ); \
476 opal_output( 0, "%s:%d\n\tPointer %p size %lu is outside [%p,%p] for\n\tbase ptr %p count %lu and data \n", \
477 __FILE__, __LINE__, (void*)(ACTPTR), (unsigned long)(LENGTH), (void*)__lower_bound, (void*)__upper_bound, \
478 (void*)(INITPTR), (unsigned long)(COUNT) ); \
479 opal_datatype_dump( (PDATA) ); \
480 } \
481 }
482
483 #else
484 #define OPAL_DATATYPE_SAFEGUARD_POINTER( ACTPTR, LENGTH, INITPTR, PDATA, COUNT )
485 #endif
486
487 static inline int GET_FIRST_NON_LOOP( const union dt_elem_desc* _pElem )
488 {
489 int element_index = 0;
490
491
492
493
494 while( _pElem->elem.common.type == OPAL_DATATYPE_LOOP ) {
495 ++_pElem; element_index++;
496 }
497 return element_index;
498 }
499
500 #define UPDATE_INTERNAL_COUNTERS( DESCRIPTION, POSITION, ELEMENT, COUNTER ) \
501 do { \
502 (ELEMENT) = &((DESCRIPTION)[(POSITION)]); \
503 if( OPAL_DATATYPE_LOOP == (ELEMENT)->elem.common.type ) \
504 (COUNTER) = (ELEMENT)->loop.loops; \
505 else \
506 (COUNTER) = (ELEMENT)->elem.count; \
507 } while (0)
508
509 OPAL_DECLSPEC int opal_datatype_contain_basic_datatypes( const struct opal_datatype_t* pData, char* ptr, size_t length );
510 OPAL_DECLSPEC int opal_datatype_dump_data_flags( unsigned short usflags, char* ptr, size_t length );
511 OPAL_DECLSPEC int opal_datatype_dump_data_desc( union dt_elem_desc* pDesc, int nbElems, char* ptr, size_t length );
512
513 #if OPAL_ENABLE_DEBUG
514 extern bool opal_position_debug;
515 extern bool opal_copy_debug;
516 #endif
517
518 END_C_DECLS
519 #endif