diff -urpN 179-b/src/dynamic_fmt.c 179-a/src/dynamic_fmt.c
--- 179-b/src/dynamic_fmt.c	2011-12-12 13:20:38.609375000 +0000
+++ 179-a/src/dynamic_fmt.c	2011-12-12 13:22:39.468750000 +0000
@@ -201,7 +201,6 @@ typedef union {
 // MD5_go is SUPER slow on big endian. In the case of bigendian, we simply
 // fall back, and use OpenSSL MD5 calls, which are usually MUCH faster.
 #define USE_MD5_Go
-#define ROTATE_LEFT(x, n) (x) = (((x)<<(n))|((MD5_word)(x)>>(32-(n))))
 #define MD5_swap(x, y, count)
 #define MD5_swap2(a,b,c,d,e)
 #ifdef SHA1_SSE_PARA
@@ -214,7 +213,6 @@ static void SHA1_swap(MD5_word *x, MD5_w
 #endif
 #else
 extern char *MD5_DumpHexStr(void *p);
-#define ROTATE_LEFT(x, n) (x) = (((x)<<(n))|((MD5_word)(x)>>(32-(n))))
 static void MD5_swap(MD5_word *x, MD5_word *y, int count)
 {
 	do {
diff -urpN 179-b/src/johnswap.h 179-a/src/johnswap.h
--- 179-b/src/johnswap.h	2011-12-05 16:43:17.296875000 +0000
+++ 179-a/src/johnswap.h	2011-12-12 14:41:06.140625000 +0000
@@ -1,6 +1,9 @@
 #if !defined __JOHN_SWAP_H__
 #define __JOHN_SWAP_H__
 
+/* reqired for the john_bswap_32 ARCH_WORD_32 declaration */
+#include "common.h"
+
 #if defined __GNUC__ && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 4))
 #	define JOHNSWAP(x)	__builtin_bswap32((x))
 #elif defined (__linux__)
@@ -12,18 +15,17 @@
 #	endif
 #	define JOHNSWAP(x)	_byteswap_ulong((x))
 #else
-#	define JOHNSWAP(x)	bswap_32((x))
+#	define JOHNSWAP(x)	john_bswap_32((x))
 #	define ROTATE_LEFT(x, n) (x) = (((x)<<(n))|((ARCH_WORD_32)(x)>>(32-(n))))
-	static inline ARCH_WORD_32 bswap_32(ARCH_WORD_32 x)
+	/* Note, the name bswap_32 clashed with a less efficient bswap_32 in gcc 3.4. */
+	/* Thus, we now call it john_bswap_32 to take 'ownership' */
+	static inline ARCH_WORD_32 john_bswap_32(ARCH_WORD_32 x)
 	{
-		/* since called in a macro, we only want to reference x 1 time, 'for safety' */
-		/* we could avoid this temp, if we KNEW that all callers gave us a proper */
-		/* safe lparam, but we have no way of knowing if code will be written correctly */
-		/* so the safe way is to use a temp in this inline function. Then things like: */
-		/* *y++ = JOHNSWAP(*x++);   work as we think they 'should' work. */
-		ARCH_WORD_32 tmp=x;
-		ROTATE_LEFT(tmp, 16);
-		return ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
+		/* Since this is an inline function, we do not have to worry about */
+		/* multiple reference of x.  Even though we are called from a macro */
+		/* this inline hides problems even with usage like  n=SWAP(*cp++); */
+		ROTATE_LEFT(x, 16);
+		return ((x & 0x00FF00FF) << 8) | ((x >> 8) & 0x00FF00FF);
 	}
 #endif
 
