Thread (6 messages) 6 messages, 3 authors, 2010-11-20

Re: abs() vs. abs64() (was: Re: [PATCH] fbdev: fix nearest mode

From: Michal Januszewski <hidden>
Date: 2010-11-19 22:28:33
Also in: lkml

On Fri, Nov 19, 2010 at 02:07:21PM -0800, Andrew Morton wrote:
On Thu, 18 Nov 2010 07:40:19 +0100
Geert Uytterhoeven [off-list ref] wrote:
quoted
quoted
'c' will end up with a value of 0xffffffff instead of the expected 0x1.
This happens on 64-bit only, right?
Absolutely, I should have mentioned it in the patch description.
quoted hunk ↗ jump to hunk
How does this look?

[..]

Reported-by: Michal Januszewski <redacted>
Cc: Rolf Eike Beer <eike-kernel@sf-tec.de
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 include/linux/kernel.h |   13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff -puN include/linux/kernel.h~include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit include/linux/kernel.h
--- a/include/linux/kernel.h~include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit
+++ a/include/linux/kernel.h
@@ -143,9 +143,16 @@ extern int _cond_resched(void);
 
 #define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0)
 
-#define abs(x) ({				\
-		long __x = (x);			\
-		(__x < 0) ? -__x : __x;		\
+#define abs(x) ({						\
+		long ret;					\
+		if (sizeof(x) = sizeof(long)) {		\
+			long __x = (x);				\
+			ret = (__x < 0) ? -__x : __x;		\
+		} else {					\
+			int __x = (x);				\
+			ret = (__x < 0) ? -__x : __x;		\
+		}						\
+		ret;						\
 	})
 
 #define abs64(x) ({				\
_
Looks good to me.  I posted essentially the same thing some 3 months ago
(http://marc.info/?l=linux-kernel&m8033094822201&w=2) but it then
failed to get any traction.  At any rate, I like your version better as
it seems more readable.

Michal
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help