From: Bernardo Innocenti <bernie@develer.com>
To: Andrea Arcangeli <andrea@suse.de>,
Peter Chubb <peter@chubb.wattle.id.au>
Cc: Andrew Morton <akpm@digeo.com>,
linux-kernel@vger.kernel.org,
Linus Torvalds <torvalds@transmeta.com>
Subject: Re: [PATCH] Kill div64.h dupes, parenthesize do_div() macro params
Date: Wed, 2 Jul 2003 08:52:17 +0200 [thread overview]
Message-ID: <200307020852.17782.bernie@develer.com> (raw)
In-Reply-To: <20030702055759.GJ3040@dualathlon.random>
On Wednesday 02 July 2003 07:57, Andrea Arcangeli wrote:
> this doesn't even sounds safe. If it's just for printing not a big
> deal, but there may be functional usages where they should not
> truncate the high 32bit of the 64bit words.
I've seen some of them already. Even if none were currently present,
this would easily lead to architecture specific bugs in future kernels.
> Bernardo, you should definitely add an #if BITS_PER_LONG == 64 around
> your implementation of do_div in asm-generic, just to make an example
> sparc is still silenty broken (and that's not an embedded thing).
> [...]
How does this new patch look? The 32bit version comes from asm-ppc/div64.h
and seems to work fine on m68knommu too, so I assume it to be at least
correct.
Ciao!
--- /dev/null 1970-01-01 01:00:00.000000000 +0100
+++ asm-generic/div64.h 2003-07-02 08:23:48.000000000 +0200
@@ -0,0 +1,66 @@
+#ifndef _ASM_GENERIC_DIV64_H
+#define _ASM_GENERIC_DIV64_H
+
+#include <linux/types.h>
+
+/*
+ * do_div() performs a 64bit/32bit unsigned division and modulo.
+ * The 64bit result is stored back in the divisor, the 32bit
+ * remainder is returned.
+ *
+ * A semantically correct implementation would do this:
+ *
+ * static inline uint32_t do_div(uint64_t &n, uint32_t base)
+ * {
+ * uint32_t rem;
+ * rem = n % base;
+ * n = n / base;
+ * return rem;
+ * }
+ *
+ * We can't rely on GCC's "long long" math since it would turn
+ * everything into a full 64bit division implemented through _udivdi3(),
+ * which is much slower.
+ */
+
+#if BITS_PER_LONG == 64
+
+# define do_div(n,base) ({ \
+ uint32_t __res; \
+ __res = ((uint64_t)(n)) % (uint32_t)(base); \
+ (n) = ((uint64_t)(n)) / (uint32_t)(base); \
+ __res; \
+ })
+
+#elif BITS_PER_LONG == 32
+
+# define do_div(n,base) ({ \
+ \
+ uint32_t __low, __low2, __high, __rem; \
+ __low = (n) & 0xffffffff; \
+ __high = (n) >> 32; \
+ if (__high) { \
+ __rem = __high % (uint32_t)(base); \
+ __high = __high / (uint32_t)(base); \
+ __low2 = __low >> 16; \
+ __low2 += __rem << 16; \
+ __rem = __low2 % (uint32_t)(base); \
+ __low2 = __low2 / (uint32_t)(base); \
+ __low = __low & 0xffff; \
+ __low += __rem << 16; \
+ __rem = __low % (uint32_t)(base); \
+ __low = __low / (uint32_t)(base); \
+ (n) = __low + ((uint64_t)__low2 << 16) + \
+ ((uint64_t) __high << 32); \
+ } else { \
+ __rem = __low % (uint32_t)(base); \
+ (n) = (__low / (uint32_t)(base)); \
+ } \
+ __rem; \
+ })
+
+#else /* BITS_PER_LONG == ?? */
+# error do_div() does not yet support the C64
+#endif /* BITS_PER_LONG */
+
+#endif /* _ASM_GENERIC_DIV64_H */
--
// Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/ http://www.develer.com/
Please don't send Word attachments - http://www.gnu.org/philosophy/no-word-attachments.html
next prev parent reply other threads:[~2003-07-02 6:38 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-02 0:32 [PATCH] Kill div64.h dupes, parenthesize do_div() macro params Bernardo Innocenti
[not found] ` <20030701173612.280d1296.akpm@digeo.com>
2003-07-02 2:24 ` Bernardo Innocenti
2003-07-02 2:32 ` Andrew Morton
2003-07-02 3:15 ` Bernardo Innocenti
2003-07-02 5:12 ` Linus Torvalds
2003-07-02 7:53 ` Russell King
2003-07-02 8:14 ` Ian Molton
2003-07-02 5:09 ` Linus Torvalds
2003-07-02 7:02 ` Bernardo Innocenti
2003-07-02 7:54 ` Matti Aarnio
2003-07-02 3:36 ` Peter Chubb
2003-07-02 4:37 ` Bernardo Innocenti
2003-07-02 5:57 ` Andrea Arcangeli
2003-07-02 6:52 ` Bernardo Innocenti [this message]
2003-07-02 7:19 ` Andrea Arcangeli
2003-07-02 7:28 ` Bernardo Innocenti
2003-07-02 8:38 ` Andrea Arcangeli
2003-07-02 16:16 ` Linus Torvalds
2003-07-03 10:43 ` [PATCH] Fix do_div() for all architectures Bernardo Innocenti
2003-07-02 7:56 ` [PATCH] Kill div64.h dupes, parenthesize do_div() macro params Russell King
2003-07-02 5:06 ` Linus Torvalds
2003-07-02 14:23 ` Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200307020852.17782.bernie@develer.com \
--to=bernie@develer.com \
--cc=akpm@digeo.com \
--cc=andrea@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=peter@chubb.wattle.id.au \
--cc=torvalds@transmeta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.