On 32-bit targets, gcc is able to do the right thing with a constant divisor that happens to be a power of two i.e. it turns the division into a right shift inline. Signed-off-by: Nicolas Pitre <nico@xxxxxxxxxx> --- include/asm-generic/div64.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/include/asm-generic/div64.h b/include/asm-generic/div64.h index 8f4e319334..47aa1e2134 100644 --- a/include/asm-generic/div64.h +++ b/include/asm-generic/div64.h @@ -41,7 +41,12 @@ extern uint32_t __div64_32(uint64_t *dividend, uint32_t divisor); uint32_t __base = (base); \ uint32_t __rem; \ (void)(((typeof((n)) *)0) == ((uint64_t *)0)); \ - if (likely(((n) >> 32) == 0)) { \ + if (__builtin_constant_p(__base) && \ + (__base & (__base - 1)) == 0) { \ + /* constant power of 2: gcc is fine */ \ + __rem = (n) & (__base - 1); \ + (n) /= __base; \ + } else if (likely(((n) >> 32) == 0)) { \ __rem = (uint32_t)(n) % __base; \ (n) = (uint32_t)(n) / __base; \ } else \ -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html