/* { dg-do compile } */ /* { dg-options "-O2" } */ unsigned int _IDEC_glbround; unsigned int _IDEC_glbflags; typedef unsigned UINT32; typedef signed SINT32; typedef unsigned long long UINT64; typedef signed long long SINT64; typedef __attribute__ ((aligned(16))) struct { UINT64 w[2]; } UINT128; static __inline UINT64 unpack_BID128 (UINT64 * psign_x, int *pexponent_x, UINT128 * pcoefficient_x, UINT128 * px) { UINT128 coeff; UINT64 ex; *psign_x = (px->w[1]) & 0x8000000000000000ull; ex = (px->w[1]) >> 49; *pexponent_x = ((int) ex) & 0x3fff; return coeff.w[0] | coeff.w[1]; } static __inline UINT32 get_BID32 (UINT32 sgn, int expon, UINT64 coeff, int rmode, unsigned *fpsc) { UINT32 r; if (((unsigned) expon) > 191) { r = sgn | 0x78000000ul; switch (rmode) { case 0x00002: if (sgn) r = sgn | 0x77f8967f; } return r; } r = expon; return r; } UINT32 bid128_to_bid32 (UINT128 x) { UINT128 *px; UINT128 CX; UINT64 sign_x; UINT32 res; int exponent_x = 0; px = &x; if (!unpack_BID128 (&sign_x, &exponent_x, &CX, px)) { return(res); } res = get_BID32 ((UINT32) (sign_x >> 32), exponent_x, CX.w[0], _IDEC_glbround, &_IDEC_glbflags); return(res);; }