diff --git a/compiler-rt/lib/builtins/udivmodti4.c b/compiler-rt/lib/builtins/udivmodti4.c --- a/compiler-rt/lib/builtins/udivmodti4.c +++ b/compiler-rt/lib/builtins/udivmodti4.c @@ -24,6 +24,8 @@ du_int *r) { const unsigned n_udword_bits = sizeof(du_int) * CHAR_BIT; const du_int b = (1ULL << (n_udword_bits / 2)); // Number base (32 bits) + const du_int mask = + (~0ULL >> (n_udword_bits / 2)); // Lower bits mask (32 bits) du_int un1, un0; // Norm. dividend LSD's du_int vn1, vn0; // Norm. divisor digits du_int q1, q0; // Quotient digits @@ -45,11 +47,11 @@ // Break divisor up into two 32-bit digits. vn1 = v >> (n_udword_bits / 2); - vn0 = v & 0xFFFFFFFF; + vn0 = v & mask; // Break right half of dividend into two digits. un1 = un10 >> (n_udword_bits / 2); - un0 = un10 & 0xFFFFFFFF; + un0 = un10 & mask; // Compute the first quotient digit, q1. q1 = un64 / vn1;