  * require a temporary.
  */
 #define EXCHANGE(a, b) \
-   do {                \
+   {                \
        a ^= b;         \
        b ^= a;         \
        a ^= b;         \
-   } while (false)
+   }
 
 /* Returns the result of adding the double-precision floating-point values
  * `a' and `b'.  The operation is performed according to the IEEE Standard for


   uint c1, c2;

   lsb = uaddCarry(uaddCarry(x_low * y_low, ((x_high * y_low) & 0xffff) << 16, c2), ((x_low * y_high) & 0xffff) << 16, c2);
   msb = x_high * y_high + (x_high * y_low) >> 16 + (x_low * y_high) >> 16 + c1 + c2;
}

#define umulExtended(x, y, msb, lsb) umulExtended_impl(x, y, msb, lsb)

 */
#define RELAXED_NAN_PROPAGATION

uint uaddCarry_polyfill(uint x, uint y, out uint carry) {
   uint sum = x + y;
   carry = (sum < x) ? 1 : 0;
   return sum;
}

void umulExtended_impl(
   uint x,
  	uint y,
  	out uint msb,
  	out uint lsb)
{
   uint x_low = x & 0xffff;
   uint x_high = x >> 16;
