1/* { dg-do compile } */
2/* { dg-options "-O2" } */
3
4unsigned int _IDEC_glbround;
5unsigned int _IDEC_glbflags;
6typedef unsigned UINT32;
7typedef signed SINT32;
8typedef unsigned long long UINT64;
9typedef signed long long SINT64;
10typedef
11__attribute__ ((aligned(16)))
12     struct {
13       UINT64 w[2];
14     } UINT128;
15
16static __inline UINT64
17unpack_BID128 (UINT64 * psign_x, int *pexponent_x,
18        UINT128 * pcoefficient_x, UINT128 * px) {
19  UINT128 coeff;
20  UINT64 ex;
21  *psign_x = (px->w[1]) & 0x8000000000000000ull;
22  ex = (px->w[1]) >> 49;
23  *pexponent_x = ((int) ex) & 0x3fff;
24  return coeff.w[0] | coeff.w[1];
25}
26
27static __inline UINT32
28get_BID32 (UINT32 sgn, int expon, UINT64 coeff, int rmode,
29    unsigned *fpsc) {
30  UINT32 r;
31
32  if (((unsigned) expon) > 191) {
33      r = sgn | 0x78000000ul;
34      switch (rmode) {
35      case 0x00002:
36        if (sgn)
37          r = sgn | 0x77f8967f;
38      }
39      return r;
40  }
41  r = expon;
42  return r;
43}
44
45UINT32
46bid128_to_bid32 (UINT128 x)
47{
48  UINT128 *px;
49  UINT128 CX;
50  UINT64 sign_x;
51  UINT32 res;
52  int exponent_x = 0;
53  px = &x;
54  if (!unpack_BID128 (&sign_x, &exponent_x, &CX, px)) {
55      return(res);
56  }
57  res = get_BID32 ((UINT32) (sign_x >> 32),
58        exponent_x, CX.w[0], _IDEC_glbround, &_IDEC_glbflags);
59  return(res);;
60}
61
62