/* 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)