--- a/sys/platform/pc64/x86_64/__udivti3.c +++ b/sys/platform/pc64/x86_64/__udivti3.c @@ -228,20 +228,26 @@ * r.s.low = n.s.high >> (sr - n_udword_bits); * } */ - q.s.low = (n.s.low << (n_utword_bits - sr)) & - ((long)(int)(n_udword_bits - sr) >> (n_udword_bits-1)); - q.s.high = ((n.s.low << ( n_udword_bits - sr)) & - ((long)(int)(sr - n_udword_bits - 1) >> (n_udword_bits-1))) | - (((n.s.high << (n_utword_bits - sr)) | - (n.s.low >> (sr - n_udword_bits))) & - ((long)(int)(n_udword_bits - sr) >> (n_udword_bits-1))); - r.s.high = (n.s.high >> sr) & - ((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1)); - r.s.low = ((n.s.high >> (sr - n_udword_bits)) & - ((long)(int)(n_udword_bits - sr - 1) >> (n_udword_bits-1))) | - (((n.s.high << (n_udword_bits - sr)) | - (n.s.low >> sr)) & - ((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1))); + if (sr == n_udword_bits) { + q.s.low = 0; + q.s.high = n.s.low; + r.s.high = 0; + r.s.low = n.s.high; + } else if (sr < n_udword_bits) { + /* 2 <= sr <= n_udword_bits - 1 */ + q.s.low = 0; + q.s.high = n.s.low << (n_udword_bits - sr); + r.s.high = n.s.high >> sr; + r.s.low = (n.s.high << (n_udword_bits - sr)) | + (n.s.low >> sr); + } else { + /* n_udword_bits + 1 <= sr <= n_utword_bits - 1 */ + q.s.low = n.s.low << (n_utword_bits - sr); + q.s.high = (n.s.high << (n_utword_bits - sr)) | + (n.s.low >> (sr - n_udword_bits)); + r.s.high = 0; + r.s.low = n.s.high >> (sr - n_udword_bits); + } } else { /* K X * --- @@ -271,11 +277,14 @@ * r.s.low = n.s.high; * } */ - r.s.high = (n.s.high >> sr) & - ((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1)); - r.s.low = (n.s.high << (n_udword_bits - sr)) | - ((n.s.low >> sr) & - ((long)(int)(sr - n_udword_bits) >> (n_udword_bits-1))); + if (sr < n_udword_bits) { + r.s.high = n.s.high >> sr; + r.s.low = (n.s.high << (n_udword_bits - sr)) | + (n.s.low >> sr); + } else { + r.s.high = 0; + r.s.low = n.s.high; + } } } /* Not a special case