diff options
author | Jon Loeliger <jdl@freescale.com> | 2007-08-13 11:01:52 -0500 |
---|---|---|
committer | Jon Loeliger <jdl@freescale.com> | 2007-08-13 11:01:52 -0500 |
commit | 8e2dd87eee01bb1b83beab7caf22b851c5cafb2c (patch) | |
tree | 47a43e05d90de7d64ed356bab5f15e8d89f5b5cc /lib_generic | |
parent | cca34967cbd13ff6bd352be29e3f1cc88ab24c05 (diff) | |
parent | 9986bc3e40e899bea372a99a2bca4071bdf2e24b (diff) | |
download | u-boot-imx-8e2dd87eee01bb1b83beab7caf22b851c5cafb2c.zip u-boot-imx-8e2dd87eee01bb1b83beab7caf22b851c5cafb2c.tar.gz u-boot-imx-8e2dd87eee01bb1b83beab7caf22b851c5cafb2c.tar.bz2 |
Merge commit 'remotes/wd/master'
Conflicts:
MAKEALL
With any luck, this is the last MAKEALL merge conflict!
Diffstat (limited to 'lib_generic')
-rw-r--r-- | lib_generic/Makefile | 2 | ||||
-rw-r--r-- | lib_generic/div64.c | 52 |
2 files changed, 53 insertions, 1 deletions
diff --git a/lib_generic/Makefile b/lib_generic/Makefile index b2091c5..bf37752 100644 --- a/lib_generic/Makefile +++ b/lib_generic/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)libgeneric.a COBJS = bzlib.o bzlib_crctable.o bzlib_decompress.o \ bzlib_randtable.o bzlib_huffman.o \ - crc32.o ctype.o display_options.o ldiv.o sha1.o \ + crc32.o ctype.o display_options.o div64.o ldiv.o sha1.o \ string.o vsprintf.o zlib.o SRCS := $(COBJS:.o=.c) diff --git a/lib_generic/div64.c b/lib_generic/div64.c new file mode 100644 index 0000000..d9951b5 --- /dev/null +++ b/lib_generic/div64.c @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2003 Bernardo Innocenti <bernie@develer.com> + * + * Based on former do_div() implementation from asm-parisc/div64.h: + * Copyright (C) 1999 Hewlett-Packard Co + * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com> + * + * + * Generic C version of 64bit/32bit division and modulo, with + * 64bit result and 32bit remainder. + * + * The fast case for (n>>32 == 0) is handled inline by do_div(). + * + * Code generated for this function might be very inefficient + * for some CPUs. __div64_32() can be overridden by linking arch-specific + * assembly versions such as arch/ppc/lib/div64.S and arch/sh/lib/div64.S. + */ + +#include <linux/types.h> + +uint32_t __div64_32(uint64_t *n, uint32_t base) +{ + uint64_t rem = *n; + uint64_t b = base; + uint64_t res, d = 1; + uint32_t high = rem >> 32; + + /* Reduce the thing a bit first */ + res = 0; + if (high >= base) { + high /= base; + res = (uint64_t) high << 32; + rem -= (uint64_t) (high*base) << 32; + } + + while ((int64_t)b > 0 && b < rem) { + b = b+b; + d = d+d; + } + + do { + if (rem >= b) { + rem -= b; + res += d; + } + b >>= 1; + d >>= 1; + } while (d); + + *n = res; + return rem; +} |