81 lines
2.5 KiB
C
81 lines
2.5 KiB
C
/* Common header for complex arithmetic sign tests. */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern void abort (void);
|
|
extern void exit (int);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#define CHECK_RES(VALUE, COPY, SIGN_REAL, SIGN_IMAG) \
|
|
do { \
|
|
if ((VALUE) != 0 \
|
|
|| COPY (1.0, __real__ (VALUE)) != SIGN_REAL 1.0 \
|
|
|| COPY (1.0, __imag__ (VALUE)) != SIGN_IMAG 1.0) \
|
|
abort (); \
|
|
} while (0)
|
|
|
|
/* This definition is intended to work with or without imaginary
|
|
types, as long as mixed real/complex arithmetic is handled
|
|
correctly. */
|
|
#define ENCODE(ZERO, ZEROI, SA, SB) \
|
|
(SA 1 == 1 \
|
|
? SB 1 == 1 ? ZERO + ZEROI : ZERO - ZEROI \
|
|
: SB 1 == 1 ? -(ZERO - ZEROI) : -(ZERO + ZEROI))
|
|
|
|
#define CHECK_ARITH(TYPE, COPY, ZERO, ZEROI, OP, S1, S2, S3, S4, SR, SI) \
|
|
do { \
|
|
_Complex TYPE a1, b1, c1; \
|
|
volatile _Complex TYPE a2, b2, c2; \
|
|
a1 = ENCODE(ZERO, ZEROI, S1, S2); \
|
|
CHECK_RES (a1, COPY, S1, S2); \
|
|
b1 = ENCODE(ZERO, ZEROI, S3, S4); \
|
|
CHECK_RES (b1, COPY, S3, S4); \
|
|
c1 = a1 OP b1; \
|
|
CHECK_RES (c1, COPY, SR, SI); \
|
|
a2 = ENCODE(ZERO, ZEROI, S1, S2); \
|
|
CHECK_RES (a2, COPY, S1, S2); \
|
|
b2 = ENCODE(ZERO, ZEROI, S3, S4); \
|
|
CHECK_RES (b2, COPY, S3, S4); \
|
|
c2 = a2 OP b2; \
|
|
CHECK_RES (c2, COPY, SR, SI); \
|
|
} while (0)
|
|
|
|
#define CHECK_ARITH_RC(TYPE, COPY, ZERO, ZEROI, OP, S1, S3, S4, SR, SI) \
|
|
do { \
|
|
TYPE a1; \
|
|
_Complex TYPE b1, c1; \
|
|
volatile TYPE a2; \
|
|
volatile _Complex TYPE b2, c2; \
|
|
a1 = S1 ZERO; \
|
|
b1 = ENCODE(ZERO, ZEROI, S3, S4); \
|
|
CHECK_RES (b1, COPY, S3, S4); \
|
|
c1 = a1 OP b1; \
|
|
CHECK_RES (c1, COPY, SR, SI); \
|
|
a2 = S1 ZERO; \
|
|
b2 = ENCODE(ZERO, ZEROI, S3, S4); \
|
|
CHECK_RES (b2, COPY, S3, S4); \
|
|
c2 = a2 OP b2; \
|
|
CHECK_RES (c2, COPY, SR, SI); \
|
|
} while (0)
|
|
|
|
#define CHECK_ARITH_CR(TYPE, COPY, ZERO, ZEROI, OP, S1, S2, S3, V3, SR, SI) \
|
|
do { \
|
|
_Complex TYPE a1, c1; \
|
|
TYPE b1; \
|
|
volatile _Complex TYPE a2, c2; \
|
|
volatile TYPE b2; \
|
|
a1 = ENCODE(ZERO, ZEROI, S1, S2); \
|
|
CHECK_RES (a1, COPY, S1, S2); \
|
|
b1 = S3 V3; \
|
|
c1 = a1 OP b1; \
|
|
CHECK_RES (c1, COPY, SR, SI); \
|
|
a2 = ENCODE(ZERO, ZEROI, S1, S2); \
|
|
CHECK_RES (a2, COPY, S1, S2); \
|
|
b2 = S3 V3; \
|
|
c2 = a2 OP b2; \
|
|
CHECK_RES (c2, COPY, SR, SI); \
|
|
} while (0)
|