 
    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;
+   lsb = uaddCarry_polyfill(
+      uaddCarry_polyfill(
+         x_low * y_low,
+         ((x_high * y_low) & 0xffff) << 16, c1
+      ),
+      ((x_low * y_high) & 0xffff) << 16,
+      c2
+   );
+   msb = x_high * y_high + (x_high * y_low + x_low * y_high) >> 16 + c1 + c2;
 }
 
 #define umulExtended(x, y, msb, lsb) umulExtended_impl(x, y, msb, lsb)

 */
#define RELAXED_NAN_PROPAGATION

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

 * require a temporary.
 */
#define EXCHANGE(a, b) \
   {                \
       a ^= b;         \
       b ^= a;         \
       a ^= b;         \
   }

/* Returns the result of adding the double-precision floating-point values
 * `a' and `b'.  The operation is performed according to the IEEE Standard for
