- GET_HIGH_WORD(hx, x);
- ix = hx & 0x7fffffff;
- if (ix >= 0x40900000) { /* |x| >= 1024 */
- if (ix >= 0x7ff00000) {
- GET_LOW_WORD(ix, x);
- if (hx == 0xfff00000 && ix == 0) /* -inf */
- return 0;
- return x;
- }
- if (x >= 1024) {
- STRICT_ASSIGN(double, x, x * 0x1p1023);
+ ix = u.i>>32 & 0x7fffffff;
+ if (ix >= 0x408ff000) { /* |x| >= 1022 or nan */
+ if (ix >= 0x40900000 && u.i>>63 == 0) { /* x >= 1024 or nan */
+ /* overflow */
+ x *= 0x1p1023;