1 #define TEST(NUM,TMODE,VAL)				\
2 extern v##NUM##TMODE g_v##NUM##TMODE;			\
3 extern TMODE g_##TMODE;					\
4 							\
5 extern void pass_v##NUM##TMODE (v##NUM##TMODE);		\
6 extern v##NUM##TMODE return_v##NUM##TMODE (void);	\
7 							\
8 void							\
9 checkp_##NUM##TMODE (TMODE *p)				\
10 {							\
11   int i;						\
12   for (i = 0; i < NUM; i++)				\
13     {							\
14       if (p[i] != g_##TMODE + i)			\
15 	DEBUG_CHECK;					\
16     }							\
17 }							\
18 							\
19 void							\
20 checkg_##NUM##TMODE (void)				\
21 {							\
22   u##NUM##TMODE u;					\
23   TMODE *p = u.a;					\
24 							\
25   u.v = g_v##NUM##TMODE;				\
26   checkp_##NUM##TMODE (p);				\
27 }							\
28 							\
29 void							\
30 init_##NUM##TMODE (void)				\
31 {							\
32   int i;						\
33   u##NUM##TMODE u;					\
34   g_##TMODE = VAL;					\
35   for (i = 0; i < NUM; i++)				\
36     u.a[i] = VAL + i;					\
37   g_v##NUM##TMODE = u.v;				\
38 }							\
39 							\
40 void							\
41 test_v##NUM##TMODE (void)				\
42 {							\
43   v##NUM##TMODE v;					\
44   u##NUM##TMODE u;					\
45   TMODE *p = u.a;					\
46 							\
47   DEBUG_FPUTS ("v" #NUM #TMODE);			\
48   DEBUG_NL;						\
49   DEBUG_FPUTS ("  global variable:");			\
50   init_##NUM##TMODE ();					\
51   checkg_##NUM##TMODE ();				\
52   DEBUG_NL;						\
53   DEBUG_FPUTS ("  pass global variable:");		\
54   pass_v##NUM##TMODE (g_v##NUM##TMODE);			\
55   DEBUG_NL;						\
56   DEBUG_FPUTS ("  pass local variable:");		\
57   v = g_v##NUM##TMODE;					\
58   pass_v##NUM##TMODE (v);				\
59   DEBUG_NL;						\
60   DEBUG_FPUTS ("  function return:");			\
61   u.v = return_v##NUM##TMODE ();			\
62   checkp_##NUM##TMODE (p);				\
63   DEBUG_NL;						\
64 }
65