1 /******************************************************************************
2   Copyright (c) 2007-2011, Intel Corp.
3   All rights reserved.
4 
5   Redistribution and use in source and binary forms, with or without
6   modification, are permitted provided that the following conditions are met:
7 
8     * Redistributions of source code must retain the above copyright notice,
9       this list of conditions and the following disclaimer.
10     * Redistributions in binary form must reproduce the above copyright
11       notice, this list of conditions and the following disclaimer in the
12       documentation and/or other materials provided with the distribution.
13     * Neither the name of Intel Corporation nor the names of its contributors
14       may be used to endorse or promote products derived from this software
15       without specific prior written permission.
16 
17   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27   THE POSSIBILITY OF SUCH DAMAGE.
28 ******************************************************************************/
29 
30 #ifndef MPHOC_MACROS_H
31 #define MPHOC_MACROS_H
32 
33 
34 
35 #include "mp.h"
36 
37 
38 #ifndef MPHOC_EXECUTABLE
39 #   ifndef ENDIANESS
40 #       error  ENDIANESS is not defined
41 #   else
42 #	if (ENDIANESS == big_endian)
43 #		define MPHOC_EXECUTABLE mphoc -b
44 #	else
45 #		define MPHOC_EXECUTABLE mphoc
46 #	endif
47 #   endif
48 #endif
49 
50 #ifndef GENPOLY_EXECUTABLE
51 
52 #       define GENPOLY_EXECUTABLE genpoly
53 
54 #endif
55 
56 
57 
58 /* "MAX" and "MIN" denote a combination of magnitude and sign attributes. */
59 
60 #define MPHOC_MAX_CHAR  ((2 ^ (BITS_PER_CHAR - 1)) - 1)
61 #define MPHOC_MAX_SHORT ((2 ^ (BITS_PER_SHORT - 1)) - 1)
62 #define MPHOC_MAX_INT   ((2 ^ (BITS_PER_INT - 1)) - 1)
63 #define MPHOC_MAX_LONG  ((2 ^ (BITS_PER_LONG - 1)) - 1)
64 #define MPHOC_MAX_WORD  ((2 ^ (BITS_PER_WORD - 1)) - 1)
65 
66 #define MPHOC_MIN_CHAR  (-(2 ^ (BITS_PER_CHAR - 1)))
67 #define MPHOC_MIN_SHORT (-(2 ^ (BITS_PER_SHORT - 1)))
68 #define MPHOC_MIN_INT   (-(2 ^ (BITS_PER_INT - 1)))
69 #define MPHOC_MIN_LONG  (-(2 ^ (BITS_PER_LONG - 1)))
70 #define MPHOC_MIN_WORD  (-(2 ^ (BITS_PER_WORD - 1)))
71 
72 #define MPHOC_MAX_U_CHAR  ((2 ^ BITS_PER_CHAR) - 1)
73 #define MPHOC_MAX_U_SHORT ((2 ^ BITS_PER_SHORT) - 1)
74 #define MPHOC_MAX_U_INT   ((2 ^ BITS_PER_INT) - 1)
75 #define MPHOC_MAX_U_LONG  ((2 ^ BITS_PER_LONG) - 1)
76 #define MPHOC_MAX_U_WORD  ((2 ^ BITS_PER_WORD) - 1)
77 
78 
79 
80 /* "TINY" and "HUGE" denote only a magnitude attribute. */
81 
82 #define MPHOC_F_POS_ZERO 0.0
83 
84 #define MPHOC_F_POS_NORMAL_TINY (2 ^ (F_MIN_BIN_EXP + F_NORM))
85 #define MPHOC_F_NEG_NORMAL_TINY (-MPHOC_F_POS_NORMAL_TINY)
86 
87 #if IEEE_FLOATING
88 #	define MPHOC_F_POS_TINY (MPHOC_F_POS_NORMAL_TINY / 2 ^ (F_PRECISION - 1))
89 #else
90 #	define MPHOC_F_POS_TINY MPHOC_F_POS_NORMAL_TINY
91 #endif
92 #define MPHOC_F_NEG_TINY (-MPHOC_F_POS_TINY)
93 
94 #define MPHOC_F_POS_HUGE (2 ^ (F_MAX_BIN_EXP + F_NORM + 1) * (1 - 1 / (2 ^ F_PRECISION)))
95 #define MPHOC_F_NEG_HUGE (-MPHOC_F_POS_HUGE)
96 
97 
98 
99 #if   (F_FORMAT == f_floating)
100 
101 #	define MPHOC_F_NAN          f:00008000
102 #	define MPHOC_F_NEG_ZERO     f:00000000
103 #	define MPHOC_F_POS_INFINITY f:ffff7fff
104 #	define MPHOC_F_NEG_INFINITY f:ffffffff
105 
106 #elif (F_FORMAT == d_floating)
107 
108 #	define MPHOC_F_NAN          d:0000000000008000
109 #	define MPHOC_F_NEG_ZERO     d:0000000000000000
110 #	define MPHOC_F_POS_INFINITY d:ffffffffffff7fff
111 #	define MPHOC_F_NEG_INFINITY d:ffffffffffffffff
112 
113 #elif (F_FORMAT == g_floating)
114 
115 #	define MPHOC_F_NAN          g:0000000000008000
116 #	define MPHOC_F_NEG_ZERO     g:0000000000000000
117 #	define MPHOC_F_POS_INFINITY g:ffffffffffff7fff
118 #	define MPHOC_F_NEG_INFINITY g:ffffffffffffffff
119 
120 #elif (F_FORMAT == h_floating)
121 
122 #	error H_floating not supported.
123 
124 #elif (F_FORMAT == s_floating)
125 
126 #	define MPHOC_F_NAN          s:7fbfffff
127 #	define MPHOC_F_NEG_ZERO     s:80000000
128 #	define MPHOC_F_POS_INFINITY s:7f800000
129 #	define MPHOC_F_NEG_INFINITY s:ff800000
130 
131 
132 #elif (F_FORMAT == t_floating)
133 
134 #	define MPHOC_F_NAN          t:7ff7ffffffffffff
135 #	define MPHOC_F_NEG_ZERO     t:8000000000000000
136 #	define MPHOC_F_POS_INFINITY t:7ff0000000000000
137 #	define MPHOC_F_NEG_INFINITY t:fff0000000000000
138 
139 #elif (F_FORMAT == x_floating)
140 
141 #	define MPHOC_F_NAN          x:7fff7fffffffffffffffffffffffffff
142 #	define MPHOC_F_NEG_ZERO     x:80000000000000000000000000000000
143 #	define MPHOC_F_POS_INFINITY x:7fff0000000000000000000000000000
144 #	define MPHOC_F_NEG_INFINITY x:ffff0000000000000000000000000000
145 
146 #else
147 
148 #	error Unsupported floating format.
149 
150 #endif
151 
152 
153 
154 #define MPHOC_F_POS_PI	 3.1415926535897932384626433832795028841972
155 #define MPHOC_F_NEG_PI	-3.1415926535897932384626433832795028841972
156 
157 #define	MPHOC_F_POS_PI_OVER_2	 1.5707963267948966192313216916397514420986
158 #define	MPHOC_F_NEG_PI_OVER_2	-1.5707963267948966192313216916397514420986
159 
160 
161 
162 /* Obsolete definitions */
163 
164 #define	MP_MAX_POS_SIGNED_INT	(2^(BITS_PER_WORD - 1) - 1)
165 #define	MP_MAX_UNSIGNED_INT	(2^BITS_PER_WORD - 1)
166 
167 #define MP_MIN_NORMAL_FLOAT	(2^(F_MIN_BIN_EXP + F_NORM))
168 #define MP_MAX_FLOAT		(2^(F_MAX_BIN_EXP + F_NORM + 1) * (1 - 1/2^F_PRECISION))
169 
170 #ifdef VAX_FLOATING
171 #    define     MP_MIN_FLOAT    MP_MIN_NORMAL_FLOAT
172 #else
173 #    define     MP_MIN_FLOAT    (MP_MIN_NORMAL_FLOAT/2^(F_PRECISION - 1))
174 #endif
175 
176 #define MPHOC_S_POS_NORMAL_TINY (2 ^ (S_MIN_BIN_EXP + F_NORM))
177 #define MPHOC_D_POS_NORMAL_TINY (2 ^ (D_MIN_BIN_EXP + F_NORM))
178 
179 #if IEEE_FLOATING
180 #    define MPHOC_S_POS_TINY \
181         ( MPHOC_S_POS_NORMAL_TINY / 2 ^ (S_PRECISION - 1) )
182 #    define MPHOC_D_POS_TINY \
183         ( MPHOC_D_POS_NORMAL_TINY / 2 ^ (D_PRECISION - 1) )
184 #else
185 #    define MPHOC_S_POS_TINY   MPHOC_S_POS_NORMAL_TINY
186 #    define MPHOC_D_POS_TINY   MPHOC_D_POS_NORMAL_TINY
187 #endif
188 
189 #define MPHOC_S_POS_HUGE \
190    (2 ^ (S_MAX_BIN_EXP + F_NORM + 1) * (1 - 1 / (2 ^ S_PRECISION)))
191 #define MPHOC_D_POS_HUGE \
192    (2 ^ (D_MAX_BIN_EXP + F_NORM + 1) * (1 - 1 / (2 ^ D_PRECISION)))
193 
194 
195 #define	BYTES(n)		((n) >> 3)
196 
197 #define	START_STATIC_TABLE(name, offset) \
198 		printf("    static const TABLE_UNION " STR(name) "[] = { \n"); \
199 		offset = 0
200 #define	START_GLOBAL_TABLE(name, offset) \
201 		printf("    const " STR(TABLE_WORD) " " STR(name) "[] = { \n"); \
202 		offset = 0
203 #define	END_TABLE			printf("};\n\n")
204 
205 #define	TABLE_COMMENT(s)		printf("\n\t/* " s " */\n")
206 #define	PRINT_1_TYPE_ENTRY(c,x,o)	printf("\t/* %3i */ %#.4" STR(c) ",\n", BYTES(o), x); \
207 		                        o += PASTE(BITS_PER_, c)
208 #define	PRINT_2_TYPE_ENTRY(c,x,y,o)	printf("\t/* %3i */ %#.4" STR(c) \
209 					  ", %#.4" STR(c) ", \n", BYTES(o), x, y); \
210 		                        o += 2*PASTE(BITS_PER_, c)
211 
212 #define	PRINT_1_F_TYPE_ENTRY(x,o)	PRINT_1_TYPE_ENTRY(F_CHAR, x, o)
213 #define	PRINT_2_F_TYPE_ENTRY(x,y,o)	PRINT_2_TYPE_ENTRY(F_CHAR, x, y, o)
214 #define	PAD_IF_NEEDED(o, i)		while ((i)*floor(o/(i)) != o) { \
215 					    printf( "\t/* padding for alignment */ " \
216 					    "0x00000000,\n"); \
217 					    o += BITS_PER_TABLE_WORD; }
218 
219 
220 #define	BITS_PER_f		BITS_PER_FLOAT
221 #define	BITS_PER_s		BITS_PER_FLOAT
222 #define	BITS_PER_g		BITS_PER_DOUBLE
223 #define	BITS_PER_t		BITS_PER_DOUBLE
224 #define	BITS_PER_x		BITS_PER_LONG_DOUBLE
225 #define	BITS_PER_w		BITS_PER_WORD
226 
227 #define	PRINT_TABLE_DEFINE(name,table,offset,type,xxx) \
228 		printf("#define\t" STR(name) "\t" xxx \
229 		"((" STR(type) " *) ((char *)" STR(table) \
230 		" + %i))\n", BYTES(offset))
231 
232 #define	PRINT_TABLE_VALUE_DEFINE(name,table,offset,type) \
233 		PRINT_TABLE_DEFINE(name,table,offset,type,"*")
234 
235 #define	PRINT_TABLE_ADDRESS_DEFINE(name,table,offset,type) \
236 		PRINT_TABLE_DEFINE(name,table,offset,type,"")
237 
238 #define	BREAK_INTO_HI_LO(x,h,l,p)	h = TRUNCATE(x, p); l = x - h
239 
240 
241 /* Some global definitions for the remes program */
242 
243 #define SET_REMES_ABSOLUTE_ERROR        remes_weight = 1
244 #define SET_REMES_RELATIVE_ERROR        remes_weight = 2
245 #define SET_REMES_GENERAL_ERROR         remes_weight = 3
246 #define SET_REMES_MODE_TO_STATIC        remes_mode = 1
247 #define SET_REMES_MODE_TO_FIND_POLY     remes_mode = 2
248 
249 /*
250  * Format specifiers for print integers in hex format
251  */
252 
253 #define	HEX_FORMAT_FOR_16_BITS	"0x%4.4.16i"
254 #define	HEX_FORMAT_FOR_32_BITS	"0x%8.8.16i"
255 #define	HEX_FORMAT_FOR_64_BITS	"0x%16.16.16i"
256 
257 
258 #if NEW_DPML_MACROS == 1
259 
260     /*
261      * Set up default table name and offset for printing macros
262      */
263 
264 #   if !defined(MP_TABLE_NAME)
265 #       define MP_TABLE_NAME	TABLE_NAME
266 #   endif
267 
268 #   if !defined(MP_BIT_OFFSET)
269 #       define MP_BIT_OFFSET	offset
270 #   endif
271 
272 #   if defined(MAKE_COMMON)
273 #       define _START_TABLE	START_GLOBAL_TABLE(MP_TABLE_NAME, MP_BIT_OFFSET)
274 #   else
275 #       define _START_TABLE	START_STATIC_TABLE(MP_TABLE_NAME, MP_BIT_OFFSET)
276 #   endif
277 
278 #   if !defined(START_TABLE)
279 #       define START_TABLE	_START_TABLE
280 #   endif
281 
282 #undef 	END_TABLE
283 #define	END_TABLE		printf("\t};\n\n")
284 
285 #   if !defined(MP_T_TYPE)
286 #       define MP_T_TYPE	F_TYPE
287 #       define MP_T_CHAR	F_CHAR
288 #       define MP_T_PRECISION	F_PRECISION
289 #   endif
290 
291 #   define	W_CHAR		w
292 #   define	U_CHAR		u
293 
294 #   define BITS_PER_u	BITS_PER_WORD
295 
296 #   define	f_TYPE		float
297 #   define	s_TYPE		float
298 #   define	g_TYPE		double
299 #   define	t_TYPE		double
300 #   define	x_TYPE		long double
301 #   define	w_TYPE		WORD
302 #   define	u_TYPE		U_WORD
303 
304 #   define	f_FMT		"%#.4f"
305 #   define	s_FMT		"%#.4s"
306 #   define	g_FMT		"%#.4g"
307 #   define	t_FMT		"%#.4t"
308 #   define	x_FMT		"%#.4x"
309 #   if (BITS_PER_WORD <= 32)
310 #       define	w_FMT		"%#8.4.16i"
311 #       define	u_FMT		"%#8.4.16i"
312 #   else
313 #       define	w_FMT		"%#16.4.16i"
314 #       define	u_FMT		"%#16.4.16i"
315 #   endif
316 
317 #   define	CHAR_TO_TYPE(tchar)	PASTE(tchar,_TYPE)
318 #   define	CHAR_TO_BITS(tchar)	PASTE(BITS_PER_, tchar)
319 #   define	CHAR_TO_FMT(tchar)	PASTE(tchar, _FMT)
320 
321 #   define PRINT_TBL_DEF(name, table, offset, tchar, xxx) \
322 		 printf("#define\t" name "\t" xxx "((" STR(CHAR_TO_TYPE(tchar)) \
323 		    " *) ((char *) " STR(table) " + %i))\n", BYTES(offset))
324 
325 #   define PRINT_TYPED_TBL_ITEM(v,tchar)			\
326 		printf( "\t/* %3i */ " CHAR_TO_FMT(tchar)	\
327 		   ",\n", BYTES(MP_BIT_OFFSET), v);		\
328 		MP_BIT_OFFSET += CHAR_TO_BITS(tchar)
329 
330 #   define PRINT_TYPED_TBL_VDEF(name, tchar) \
331 		PRINT_TBL_DEF(name, MP_TABLE_NAME, MP_BIT_OFFSET, \
332 		    tchar, "*")
333 
334 #   define PRINT_TYPED_TBL_ADEF(name, tchar)	\
335 		PRINT_TBL_DEF(name, MP_TABLE_NAME, MP_BIT_OFFSET, \
336 		    tchar, "")
337 
338 #   define PRINT_TYPED_TBL_VDEF_ITEM(n,v,tchar) \
339 		PRINT_TYPED_TBL_VDEF(n, tchar); PRINT_TYPED_TBL_ITEM(v, tchar)
340 
341 #   define PRINT_TYPED_TBL_ADEF_ITEM(n,v,tchar) \
342 		PRINT_TYPED_TBL_ADEF(n, tchar); PRINT_TYPED_TBL_ITEM(v, tchar)
343 
344 #   define PRINT_TYPED_COM_VDEF(c,n,tchar) \
345 		TABLE_COMMENT(c); PRINT_TYPED_TBL_VDEF(n,tchar)
346 
347 #   define PRINT_TYPED_COM_ADEF(c,n,tchar) \
348 		TABLE_COMMENT(c); PRINT_TYPED_TBL_ADEF(n,tchar)
349 
350 #   define PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,tchar) \
351 		TABLE_COMMENT(c); PRINT_TYPED_TBL_VDEF_ITEM(n,v,tchar)
352 
353 #   define PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,tchar) \
354 		TABLE_COMMENT(c); PRINT_TYPED_BL_ADEF_ITEM(n,v,tchar)
355 
356 #   define PRINT_TBL_ITEM(v)                PRINT_TYPED_TBL_ITEM(v, MP_T_CHAR)
357 #   define PRINT_TBL_VDEF(n)                PRINT_TYPED_TBL_VDEF(n, MP_T_CHAR)
358 #   define PRINT_TBL_ADEF(n)                PRINT_TYPED_TBL_ADEF(n, MP_T_CHAR)
359 #   define PRINT_TBL_VDEF_ITEM(n,v)         PRINT_TYPED_TBL_VDEF_ITEM(n,v,MP_T_CHAR)
360 #   define PRINT_TBL_ADEF_ITEM(n,v)         PRINT_TYPED_TBL_ADEF_ITEM(n,v,MP_T_CHAR)
361 #   define PRINT_TBL_COM_VDEF(c,n)          PRINT_TYPED_COM_VDEF(c,n,MP_T_CHAR)
362 #   define PRINT_TBL_COM_ADEF(c,n)          PRINT_TYPED_COM_ADEF(c,n,MP_T_CHAR)
363 #   define PRINT_TBL_COM_VDEF_ITEM(c,n,v)   PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,MP_T_CHAR)
364 #   define PRINT_TBL_COM_ADEF_ITEM(c,n,v)   PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,MP_T_CHAR)
365 
366 #   define PRINT_R_TBL_ITEM(v)              PRINT_TYPED_TBL_ITEM(v,R_CHAR)
367 #   define PRINT_R_TBL_VDEF(n)              PRINT_TYPED_TBL_VDEF(n,R_CHAR)
368 #   define PRINT_R_TBL_ADEF(n)              PRINT_TYPED_TBL_ADEF(n,R_CHAR)
369 #   define PRINT_R_TBL_VDEF_ITEM(n,v)       PRINT_TYPED_TBL_VDEF_ITEM(n,v,R_CHAR)
370 #   define PRINT_R_TBL_ADEF_ITEM(n,v)       PRINT_TYPED_TBL_ADEF_ITEM(n,v,R_CHAR)
371 #   define PRINT_R_TBL_COM_VDEF(c,n)        PRINT_TYPED_COM_VDEF(c,n,R_CHAR)
372 #   define PRINT_R_TBL_COM_ADEF(c,n)        PRINT_TYPED_COM_ADEF(c,n,R_CHAR)
373 #   define PRINT_R_TBL_COM_VDEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,R_CHAR)
374 #   define PRINT_R_TBL_COM_ADEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,R_CHAR)
375 
376 #   define PRINT_F_TBL_ITEM(v)              PRINT_TYPED_TBL_ITEM(v,F_CHAR)
377 #   define PRINT_F_TBL_VDEF(n)              PRINT_TYPED_TBL_VDEF(n,F_CHAR)
378 #   define PRINT_F_TBL_ADEF(n)              PRINT_TYPED_TBL_ADEF(n,F_CHAR)
379 #   define PRINT_F_TBL_VDEF_ITEM(n,v)       PRINT_TYPED_TBL_VDEF_ITEM(n,v,F_CHAR)
380 #   define PRINT_F_TBL_ADEF_ITEM(n,v)       PRINT_TYPED_TBL_ADEF_ITEM(n,v,F_CHAR)
381 #   define PRINT_F_TBL_COM_VDEF(c,n)        PRINT_TYPED_COM_VDEF(c,n,F_CHAR)
382 #   define PRINT_F_TBL_COM_ADEF(c,n)        PRINT_TYPED_COM_ADEF(c,n,F_CHAR)
383 #   define PRINT_F_TBL_COM_VDEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,F_CHAR)
384 #   define PRINT_F_TBL_COM_ADEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,F_CHAR)
385 
386 #   define PRINT_B_TBL_ITEM(v)              PRINT_TYPED_TBL_ITEM(v,B_CHAR)
387 #   define PRINT_B_TBL_VDEF(n)              PRINT_TYPED_TBL_VDEF(n,B_CHAR)
388 #   define PRINT_B_TBL_ADEF(n)              PRINT_TYPED_TBL_ADEF(n,B_CHAR)
389 #   define PRINT_B_TBL_VDEF_ITEM(n,v)       PRINT_TYPED_TBL_VDEF_ITEM(n,v,B_CHAR)
390 #   define PRINT_B_TBL_ADEF_ITEM(n,v)       PRINT_TYPED_TBL_ADEF_ITEM(n,v,B_CHAR)
391 #   define PRINT_B_COM_VDEF(c,n)            PRINT_TYPED_COM_VDEF(c,n,B_CHAR)
392 #   define PRINT_B_COM_ADEF(c,n)            PRINT_TYPED_COM_ADEF(c,n,B_CHAR)
393 #   define PRINT_B_TBL_COM_VDEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,B_CHAR)
394 #   define PRINT_B_TBL_COM_ADEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,B_CHAR)
395 
396 #   define PRINT_W_TBL_ITEM(v)              PRINT_TYPED_TBL_ITEM(v,W_CHAR)
397 #   define PRINT_W_TBL_VDEF(n)              PRINT_TYPED_TBL_VDEF(n,W_CHAR)
398 #   define PRINT_W_TBL_ADEF(n)              PRINT_TYPED_TBL_ADEF(n,W_CHAR)
399 #   define PRINT_W_TBL_VDEF_ITEM(n,v)       PRINT_TYPED_TBL_VDEF_ITEM(n,v,W_CHAR)
400 #   define PRINT_W_TBL_ADEF_ITEM(n,v)       PRINT_TYPED_TBL_ADEF_ITEM(n,v,W_CHAR)
401 #   define PRINT_W_COM_VDEF(c,n)            PRINT_TYPED_COM_VDEF(c,n,W_CHAR)
402 #   define PRINT_W_COM_ADEF(c,n)            PRINT_TYPED_COM_ADEF(c,n,W_CHAR)
403 #   define PRINT_W_TBL_COM_VDEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,W_CHAR)
404 #   define PRINT_W_TBL_COM_ADEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,W_CHAR)
405 
406 #   define PRINT_U_TBL_ITEM(v)              PRINT_TYPED_TBL_ITEM(v,U_CHAR)
407 #   define PRINT_U_TBL_VDEF(n)              PRINT_TYPED_TBL_VDEF(n,U_CHAR)
408 #   define PRINT_U_TBL_ADEF(n)              PRINT_TYPED_TBL_ADEF(n,U_CHAR)
409 #   define PRINT_U_TBL_VDEF_ITEM(n,v)       PRINT_TYPED_TBL_VDEF_ITEM(n,v,U_CHAR)
410 #   define PRINT_U_TBL_ADEF_ITEM(n,v)       PRINT_TYPED_TBL_ADEF_ITEM(n,v,U_CHAR)
411 #   define PRINT_U_COM_VDEF(c,n)            PRINT_TYPED_COM_VDEF(c,n,U_CHAR)
412 #   define PRINT_U_COM_ADEF(c,n)            PRINT_TYPED_COM_ADEF(c,n,U_CHAR)
413 #   define PRINT_U_TBL_COM_VDEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_VDEF_ITEM(c,n,v,U_CHAR)
414 #   define PRINT_U_TBL_COM_ADEF_ITEM(c,n,v) PRINT_TYPED_TBL_COM_ADEF_ITEM(c,n,v,U_CHAR)
415 
416 #   define I16_HEX_FORMAT	"0x%4.4.16i"
417 #   define I32_HEX_FORMAT	"0x%8.8.16i"
418 #   define I64_HEX_FORMAT	"0x%16.16.16i"
419 
420 #   define WORD_HEX_FORMAT	PASTE_3(I, BITS_PER_WORD, _HEX_FORMAT)
421 
422 #   define PRINT_ITYPE_DEF(name, value, itype, format) \
423 		printf("#define\t" name "\t(( " STR(itype) " ) " format " )\n", value)
424 
425 #   define PRINT_WORD_DEF(n, v)		PRINT_ITYPE_DEF(n, v, WORD,   WORD_HEX_FORMAT)
426 #   define PRINT_I32_DEF( n, v)		PRINT_ITYPE_DEF(n, v, INT_32, I32_HEX_FORMAT)
427 #   define PRINT_I64_DEF( n, v)		PRINT_ITYPE_DEF(n, v, INT_64, I64_HEX_FORMAT)
428 
429 #   define PRINT_U_WORD_DEF(n, v)	PRINT_ITYPE_DEF(n, v, U_WORD,   WORD_HEX_FORMAT)
430 #   define PRINT_U32_DEF(  n, v)	PRINT_ITYPE_DEF(n, v, U_INT_32, I32_HEX_FORMAT)
431 #   define PRINT_U64_DEF(  n, v)	PRINT_ITYPE_DEF(n, v, U_INT_64, I64_HEX_FORMAT)
432 
433 #   define MP_RN	0  /* ieee round to nearest           */
434 #   define MP_RZ	1  /* ieee round to zero (i.e. chop)  */
435 #   define MP_RP	2  /* ieee round to positive infinity */
436 #   define MP_RM	3  /* ieee round to minus infinity    */
437 
438 #   define PRINT_TYPED_ARRAY(array, first, last, scale, type) \
439 		{								\
440 		auto i, tmp;							\
441 		tmp = scale^first;						\
442 		for (i = first; i <= last; i++)					\
443 		    {								\
444 		    PRINT_1_TYPE_ENTRY(type, array[i]*tmp, MP_BIT_OFFSET);	\
445 		    tmp *= scale;						\
446 		    }								\
447 		}
448 
449 #   define PRINT_R_ARRAY(a,f,l,s)	PRINT_TYPED_ARRAY(a,f,l,s,R_CHAR)
450 #   define PRINT_F_ARRAY(a,f,l,s)	PRINT_TYPED_ARRAY(a,f,l,s,F_CHAR)
451 #   define PRINT_B_ARRAY(a,f,l,s)	PRINT_TYPED_ARRAY(a,f,l,s,B_CHAR)
452 
453 
454 #if IEEE_FLOATING
455 #   define MPHOC_R_DENORM_FACTOR	2^(1 - R_PRECISION)
456 #   define MPHOC_F_DENORM_FACTOR	2^(1 - F_PRECISION)
457 #   define MPHOC_B_DENORM_FACTOR	2^(1 - B_PRECISION)
458 #else
459 #   define MPHOC_R_DENORM_FACTOR 1
460 #   define MPHOC_F_DENORM_FACTOR 1
461 #   define MPHOC_B_DENORM_FACTOR 1
462 #endif
463 
464 #define MPHOC_R_POS_NORMAL_TINY	(2 ^ (R_MIN_BIN_EXP + R_NORM))
465 #define MPHOC_R_POS_TINY	(MPHOC_R_POS_NORMAL_TINY*MPHOC_R_DENORM_FACTOR)
466 #define MPHOC_R_POS_HUGE	(2^(R_MAX_BIN_EXP + R_NORM + 1)*(1 - 2^(-R_PRECISION)))
467 #define MPHOC_R_NEG_NORMAL_TINY	(-MPHOC_R_POS_NORMAL_TINY)
468 #define MPHOC_R_NEG_TINY	(-MPHOC_R_POS_TINY)
469 #define MPHOC_R_NEG_HUGE 	(-MPHOC_R_POS_HUGE)
470 
471 #define MPHOC_B_POS_NORMAL_TINY	(2 ^ (B_MIN_BIN_EXP + B_NORM))
472 #define MPHOC_B_POS_TINY	(MPHOC_B_POS_NORMAL_TINY*MPHOC_B_DENORM_FACTOR)
473 #define MPHOC_B_POS_HUGE	(2^(B_MAX_BIN_EXP + B_NORM + 1)*(1 - 2^(-B_PRECISION)))
474 #define MPHOC_B_NEG_NORMAL_TINY	(-MPHOC_B_POS_NORMAL_TINY)
475 #define MPHOC_B_NEG_TINY	(-MPHOC_B_POS_TINY)
476 #define MPHOC_B_NEG_HUGE 	(-MPHOC_B_POS_HUGE)
477 
478 #define _GENPOLY(coef, name, _offset, options, _degree)		\
479 	printf(STR(GENPOLY_EXECUTABLE one degree=%i cn=), _degree);	\
480 	printf(STR(STR(coef) define=));					\
481 	printf(STR(STR(name) offset=%i options), _offset);		\
482 	printf(" ; echo \"\"\n" )
483 
484 #define GENPOLY(coef, name, _degree)				\
485 	printf(STR(GENPOLY_EXECUTABLE one degree=%i cn=), _degree);	\
486 	printf(STR(STR(coef) define=));					\
487 	printf(STR(STR(name)));						\
488 	printf(" ; echo \"\"\n" )
489 
490 
491 #endif /* defined(NEW_MPHOC_MACROS) */
492 
493 #endif  /* MPHOC_MACROS_H */
494