1 /* Common header for complex arithmetic sign tests.  */
2 
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 extern void abort (void);
7 extern void exit (int);
8 #ifdef __cplusplus
9 }
10 #endif
11 
12 #define CHECK_RES(VALUE, COPY, SIGN_REAL, SIGN_IMAG)		\
13   do {								\
14     if ((VALUE) != 0						\
15 	|| COPY (1.0, __real__ (VALUE)) != SIGN_REAL 1.0	\
16 	|| COPY (1.0, __imag__ (VALUE)) != SIGN_IMAG 1.0)	\
17       abort ();							\
18   } while (0)
19 
20 /* This definition is intended to work with or without imaginary
21    types, as long as mixed real/complex arithmetic is handled
22    correctly.  */
23 #define ENCODE(ZERO, ZEROI, SA, SB)			\
24   (SA 1 == 1						\
25    ? SB 1 == 1 ? ZERO + ZEROI : ZERO - ZEROI		\
26    : SB 1 == 1 ? -(ZERO - ZEROI) : -(ZERO + ZEROI))
27 
28 #define CHECK_ARITH(TYPE, COPY, ZERO, ZEROI, OP, S1, S2, S3, S4, SR, SI) \
29   do {									\
30     _Complex TYPE a1, b1, c1;						\
31     volatile _Complex TYPE a2, b2, c2;					\
32     a1 = ENCODE(ZERO, ZEROI, S1, S2);					\
33     CHECK_RES (a1, COPY, S1, S2);					\
34     b1 = ENCODE(ZERO, ZEROI, S3, S4);					\
35     CHECK_RES (b1, COPY, S3, S4);					\
36     c1 = a1 OP b1;							\
37     CHECK_RES (c1, COPY, SR, SI);					\
38     a2 = ENCODE(ZERO, ZEROI, S1, S2);					\
39     CHECK_RES (a2, COPY, S1, S2);					\
40     b2 = ENCODE(ZERO, ZEROI, S3, S4);					\
41     CHECK_RES (b2, COPY, S3, S4);					\
42     c2 = a2 OP b2;							\
43     CHECK_RES (c2, COPY, SR, SI);					\
44   } while (0)
45 
46 #define CHECK_ARITH_RC(TYPE, COPY, ZERO, ZEROI, OP, S1, S3, S4, SR, SI) \
47   do {									\
48     TYPE a1;								\
49     _Complex TYPE b1, c1;						\
50     volatile TYPE a2;							\
51     volatile _Complex TYPE b2, c2;					\
52     a1 = S1 ZERO;							\
53     b1 = ENCODE(ZERO, ZEROI, S3, S4);					\
54     CHECK_RES (b1, COPY, S3, S4);					\
55     c1 = a1 OP b1;							\
56     CHECK_RES (c1, COPY, SR, SI);					\
57     a2 = S1 ZERO;							\
58     b2 = ENCODE(ZERO, ZEROI, S3, S4);					\
59     CHECK_RES (b2, COPY, S3, S4);					\
60     c2 = a2 OP b2;							\
61     CHECK_RES (c2, COPY, SR, SI);					\
62   } while (0)
63 
64 #define CHECK_ARITH_CR(TYPE, COPY, ZERO, ZEROI, OP, S1, S2, S3, V3, SR, SI) \
65   do {									\
66     _Complex TYPE a1, c1;						\
67     TYPE b1;								\
68     volatile _Complex TYPE a2, c2;					\
69     volatile TYPE b2;							\
70     a1 = ENCODE(ZERO, ZEROI, S1, S2);					\
71     CHECK_RES (a1, COPY, S1, S2);					\
72     b1 = S3 V3;								\
73     c1 = a1 OP b1;							\
74     CHECK_RES (c1, COPY, SR, SI);					\
75     a2 = ENCODE(ZERO, ZEROI, S1, S2);					\
76     CHECK_RES (a2, COPY, S1, S2);					\
77     b2 = S3 V3;								\
78     c2 = a2 OP b2;							\
79     CHECK_RES (c2, COPY, SR, SI);					\
80   } while (0)
81