Re: [PATCHSET][2.6-test4][0/6]Support for HPET based timer - Take 2

Erik Andersen
2003-08-29T21:03:50Z

On Fri Aug 29, 2003 at 11:23:47AM -0700, Andrew Morton wrote:
> "Pallipadi, Venkatesh" <venkatesh.pallipadi@intel.com> wrote:
> >
> > Resending the patch.
>
> Thanks, I'll include these in the next -mm kernel.
>
> Reading the code, the only thing which leaps out is:
>
> +/* Use our own asm for 64 bit multiply/divide */
> +#define ASM_MUL64_REG(eax_out,edx_out,reg_in,eax_in) \
> + __asm__ __volatile__("mull %2" \
> + :"=a" (eax_out), "=d" (edx_out) \
> + :"r" (reg_in), "0" (eax_in))
> +
> +#define ASM_DIV64_REG(eax_out,edx_out,reg_in,eax_in,edx_in) \
> + __asm__ __volatile__("divl %2" \
> + :"=a" (eax_out), "=d" (edx_out) \
> + :"r" (reg_in), "0" (eax_in), "1" (edx_in))
>
> We seem to keep on proliferating home-grown x86 64-bit math functions.
>
> Do you really need these? Is it possible to use do_div() and the C 64x64
> `*' operator instead?

The fundamental reason these are proliferating is that given
some random bit of code such as:

u64 foo=9, bar=3, baz;
baz = foo / bar;
baz = foo % bar;

gcc then generates code calling __udivdi3 and __umoddi3. Since
the kernel does not provide these, people keep reinventing them.
Perhaps it is time to kill off do_div and all its little friends
and simply copy __udivdi3 and __umoddi3 from libgcc.....

-Erik

--
Erik B. Andersen http://codepoet-consulting.com/
--This message was written using 73% post-consumer electrons--