OSDN Git Service

PR c++/43108
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / c-c++-common / complex-sign.h
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)