From f0d9eecc52fe3ec980467bf421f2f46c77209450 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 20 Jun 2010 07:12:37 +0200 Subject: [PATCH] [MINOR] tools: add a fast div64_32 function We'll need to divide 64 bits by 32 bits with new frequency counters. Gcc does not know when it can safely do that, but the way we build our operations let us be sure. So let's provide an optimised version for that purpose. --- include/common/standard.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/common/standard.h b/include/common/standard.h index 2366f9e43..fcfb52f8b 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -364,6 +364,23 @@ static inline unsigned int mul32hi(unsigned int a, unsigned int b) return ((unsigned long long)a * b) >> 32; } +/* gcc does not know when it can safely divide 64 bits by 32 bits. Use this + * function when you know for sure that the result fits in 32 bits, because + * it is optimal on x86 and on 64bit processors. + */ +static inline unsigned int div64_32(unsigned long long o1, unsigned int o2) +{ + unsigned int result; +#ifdef __i386__ + asm("divl %2" + : "=a" (result) + : "A"(o1), "rm"(o2)); +#else + result = o1 / o2; +#endif + return result; +} + /* copies at most characters from and always terminates with '\0' */ char *my_strndup(const char *src, int n);