| /* PR rtl-optimization/52060 */ |
| /* { dg-do run { target int32plus } } */ |
| |
| extern void abort (void); |
| union U { float f; unsigned int i; }; |
| |
| static inline __attribute__((always_inline)) unsigned int |
| foo (float x) |
| { |
| union U u; |
| unsigned int a, b, c; |
| int d; |
| int e; |
| u.f = x; |
| d = ((unsigned) u.i >> 23) & 0xFF; |
| c = d < 126 ? 0 : ~0; |
| e = 127 + 30 - d; |
| a = (u.i << 8) | 0x80000000U; |
| b = a & ((1 << e) - 1); |
| a = a >> e; |
| c &= (b | (a & 2)) ? ~0 : ~1; |
| a = ((a + 1U) >> 1) & c; |
| return a; |
| } |
| |
| __attribute__((noinline)) unsigned int |
| bar (float x) |
| { |
| unsigned int a, b, c; |
| static const unsigned int d[128] = |
| { |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7 |
| }; |
| a = foo (1048575.0f * x); |
| c = d[a >> 13]; |
| b = (c << 13) | ((a >> (7 - c)) & 0x1fff); |
| return b; |
| } |
| |
| int |
| main () |
| { |
| union U u; |
| u.f = 1048575.0f; |
| if (sizeof (u.i) == sizeof (u.f) |
| && u.i == 0x497ffff0U |
| && bar (1.0f) != 65535) |
| abort (); |
| return 0; |
| } |