[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 07/13] x86: Add functions for 64-bit integer arithmetic
>>> On 31.12.15 at 04:03, <haozhong.zhang@xxxxxxxxx> wrote: > --- /dev/null > +++ b/xen/include/asm-x86/math64.h > @@ -0,0 +1,105 @@ > +#ifndef __X86_MATH64 > +#define __X86_MATH64 > + > +/* > + * Functions defined in this file are derived from Linux kernel > + * (include/linux/math64.h). > + */ This is not true. At least mul64() doesn't exist in Linux (as of 4.4-rc8). > +static inline void mul64(u64 *lo, u64 *hi, u64 a, u64 b) > +{ > + typedef union { > + u64 ll; > + struct { > + u32 low, high; > + } l; > + } LL; > + LL rl, rm, rn, rh, a0, b0; > + u64 c; > + > + a0.ll = a; > + b0.ll = b; > + > + rl.ll = (u64)a0.l.low * b0.l.low; > + rm.ll = (u64)a0.l.low * b0.l.high; > + rn.ll = (u64)a0.l.high * b0.l.low; > + rh.ll = (u64)a0.l.high * b0.l.high; > + > + c = (u64)rl.l.high + rm.l.low + rn.l.low; > + rl.l.high = c; > + c >>= 32; > + c = c + rm.l.high + rn.l.high + rh.l.low; > + rh.l.low = c; > + rh.l.high += (u32)(c >> 32); > + > + *lo = rl.ll; > + *hi = rh.ll; > +} For this one in particular, but likely also for the others: If this was put in include/xen/math64.h I might buy it. As an x86-specific implementation this could (and should) be done with a single asm() statement using the MUL instruction (I didn't check whether gcc also offers a built-in, which then could be used generically). Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |