1#define TEST(NUM,TMODE,VAL)				\
2extern v##NUM##TMODE g_v##NUM##TMODE;			\
3extern TMODE g_##TMODE;					\
4							\
5extern void pass_v##NUM##TMODE (v##NUM##TMODE);		\
6extern v##NUM##TMODE return_v##NUM##TMODE (void);	\
7							\
8void							\
9checkp_##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							\
19void							\
20checkg_##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							\
29void							\
30init_##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							\
40void							\
41test_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