old code (return x+x;) returns correct value and raises correct
flags only if the result is stored as double (or float)
e = ux.bits >> 52 & 0x7ff;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7ff)
e = ux.bits >> 52 & 0x7ff;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7ff)
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
e = ux.bits & 0x7f800000;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7f800000)
e = ux.bits & 0x7f800000;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7f800000)
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
e = ux.bits>>52 & 0x7ff;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7ff)
e = ux.bits>>52 & 0x7ff;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7ff)
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
e = ux.bits & 0x7f800000;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7f800000)
e = ux.bits & 0x7f800000;
/* raise overflow if ux.value is infinite and x is finite */
if (e == 0x7f800000)
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);
/* raise underflow if ux.value is subnormal or zero */
if (e == 0)
FORCE_EVAL(x*x + ux.value*ux.value);