diff --git a/ChangeLog b/ChangeLog
index e2180172364fc8253704839dc1c4466990fded7c..354ef00ee90da53118e16b448050425367e6d60f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2011-06-12  Niels M�ller  <nisse@lysator.liu.se>
 
+	* serpent-encrypt.c (SBOX6): Renamed arguments. Eliminated
+	temporaries.
+	(SBOX7): Likewise.
+	(All SBOX-macros): Deleted type argument, and updated users.
+
 	* configure.ac: Display summary at the end oc configure..
 	(asm_path): Set only if enable_assember is yes.
 
diff --git a/serpent-encrypt.c b/serpent-encrypt.c
index 5b9dab02054e5fdc1a6cab9fbfab3b056c042c59..fd3a68bb9a58cf57eda7110dd42136be502bab77 100644
--- a/serpent-encrypt.c
+++ b/serpent-encrypt.c
@@ -72,7 +72,7 @@
 
 /* S0:  3  8 15  1 10  6  5 11 14 13  4  2  7  0  9 12 */
 /* Could easily let y0, y1 overlap with x0, x1, and possibly also x2 and y2 */
-#define SBOX0(type, x0, x1, x2, x3, y0, y1, y2, y3)	\
+#define SBOX0(x0, x1, x2, x3, y0, y1, y2, y3)	\
   do {							\
     y3  = x1 ^ x2;					\
     y0  = x0 | x3;					\
@@ -96,7 +96,7 @@
 
 /* FIXME: Arrange for some overlap between inputs and outputs? */
 /* S1: 15 12  2  7  9  0  5 10  1 11 14  8  6 13  3  4 */
-#define SBOX1(type, x0, x1, x2, x3, y0, y1, y2, y3)	\
+#define SBOX1(x0, x1, x2, x3, y0, y1, y2, y3)	\
   do {							\
     y1  = x0 | x3;					\
     y2  = x2 ^ x3;					\
@@ -120,7 +120,7 @@
 
 /* FIXME: Arrange for some overlap between inputs and outputs? */
 /* S2:  8  6  7  9  3 12 10 15 13  1 14  4  0 11  5  2 */
-#define SBOX2(type, x0, x1, x2, x3, y0, y1, y2, y3)	\
+#define SBOX2(x0, x1, x2, x3, y0, y1, y2, y3)	\
   do {							\
     y2  = x0 | x2;					\
     y1  = x0 ^ x1;					\
@@ -162,7 +162,7 @@
      y0  = t14 ^ t15;
      y1  = t05 ^ t04;
 */
-#define SBOX3(type, x0, x1, x2, x3, y0, y1, y2, y3)	\
+#define SBOX3(x0, x1, x2, x3, y0, y1, y2, y3)	\
   do {							\
     y2  = x0 ^ x2;					\
     y0  = x0 | x3;					\
@@ -207,7 +207,7 @@
     y1  = t15 ^ t16;
     y0  =     ~ t14;
 */
-#define SBOX4(type, x0, x1, x2, x3, y0, y1, y2, y3)	\
+#define SBOX4(x0, x1, x2, x3, y0, y1, y2, y3)	\
   do {							\
     y3  = x0 | x1;					\
     y2  = x1 | x2;					\
@@ -250,7 +250,7 @@
     y1  = t07 ^ t08;
     y3  = t12 ^ t14;
 */
-#define SBOX5(type, x0, x1, x2, x3, y0, y1, y2, y3)	\
+#define SBOX5(x0, x1, x2, x3, y0, y1, y2, y3)	\
   do {							\
     y0  = x1 | x3;					\
     y0 ^= x2;						\
@@ -272,55 +272,98 @@
   } while (0)
 
 /* S6:  7  2 12  5  8  4  6 11 14  9  1 15 13  3 10  0 */
-#define SBOX6(type, a, b, c, d, w, x, y, z) \
-  do { \
-    type t02, t03, t04, t05, t07, t08, t09, t10;	\
-    type t11, t12, t13, t15, t17, t18, t01; \
-    t01 = a   & d  ; \
-    t02 = b   ^ c  ; \
-    t03 = a   ^ d  ; \
-    t04 = t01 ^ t02; \
-    t05 = b   | c  ; \
-    x   =     ~ t04; \
-    t07 = t03 & t05; \
-    t08 = b   & x  ; \
-    t09 = a   | c  ; \
-    t10 = t07 ^ t08; \
-    t11 = b   | d  ; \
-    t12 = c   ^ t11; \
-    t13 = t09 ^ t10; \
-    y   =     ~ t13; \
-    t15 = x   & t03; \
-    z   = t12 ^ t07; \
-    t17 = a   ^ b  ; \
-    t18 = y   ^ t15; \
-    w   = t17 ^ t18; \
+/* Original single-assignment form:
+    t01 = x0  & x3;
+    t02 = x1  ^ x2;
+    t03 = x0  ^ x3;
+    t04 = t01 ^ t02;
+    t05 = x1  | x2;
+    y1  =     ~ t04;
+    t07 = t03 & t05;
+    t08 = x1  & y1;
+    t09 = x0  | x2;
+    t10 = t07 ^ t08;
+    t11 = x1  | x3;
+    t12 = x2  ^ t11;
+    t13 = t09 ^ t10;
+    y2  =     ~ t13;
+    t15 = y1  & t03;
+    y3  = t12 ^ t07;
+    t17 = x0  ^ x1;
+    t18 = y2  ^ t15;
+    y0  = t17 ^ t18;
+*/
+#define SBOX6(x0, x1, x2, x3, y0, y1, y2, y3)	\
+  do {							\
+    y0  = x0 ^ x3;					\
+    y1  = x0 & x3;					\
+    y2  = x0 | x2;					\
+    x3 |= x1;						\
+    x3 ^= x2;						\
+    x0 ^= x1;						\
+    y3  = x1 | x2;					\
+    x2 ^= x1;						\
+    y3 &= y0;						\
+    y1 ^= x2;						\
+    y1  = ~y1;						\
+    y0 &= y1;						\
+    x1 &= y1;						\
+    x1 ^= y3;						\
+    y3 ^= x3;						\
+    y2 ^= x1;						\
+    y2  = ~y2;						\
+    y0 ^= y2;						\
+    y0 ^= x0;						\
   } while (0)
 
 /* S7:  1 13 15  0 14  8  2 11  7  4 12 10  9  3  5  6 */
-#define SBOX7(type, a, b, c, d, w, x, y, z) \
-  do { \
-    type t02, t03, t04, t05, t06, t08, t09, t10;	\
-    type t11, t13, t14, t15, t16, t17, t01; \
-    t01 = a   & c  ; \
-    t02 =     ~ d  ; \
-    t03 = a   & t02; \
-    t04 = b   | t01; \
-    t05 = a   & b  ; \
-    t06 = c   ^ t04; \
-    z   = t03 ^ t06; \
-    t08 = c   | z  ; \
-    t09 = d   | t05; \
-    t10 = a   ^ t08; \
-    t11 = t04 & z  ; \
-    x   = t09 ^ t10; \
-    t13 = b   ^ x  ; \
-    t14 = t01 ^ x  ; \
-    t15 = c   ^ t05; \
-    t16 = t11 | t13; \
-    t17 = t02 | t14; \
-    w   = t15 ^ t17; \
-    y   = a   ^ t16; \
+/* Original single-assignment form:
+    t01 = x0  & x2;
+    t02 =     ~ x3;
+    t03 = x0  & t02;
+    t04 = x1  | t01;
+    t05 = x0  & x1;
+    t06 = x2  ^ t04;
+    y3  = t03 ^ t06;
+    t08 = x2  | y3;
+    t09 = x3  | t05;
+    t10 = x0  ^ t08;
+    t11 = t04 & y3;
+    y1  = t09 ^ t10;
+    t13 = x1  ^ y1;
+    t14 = t01 ^ y1;
+    t15 = x2  ^ t05;
+    t16 = t11 | t13;
+    t17 = t02 | t14;
+    y0  = t15 ^ t17;
+    y2  = x0  ^ t16;
+*/
+/* It appears impossible to do this with only 8 registers. We
+   recompute t02, and t04 (if we have spare registers, hopefully the
+   compiler can recognize it them as common subexpressions). */
+#define SBOX7(x0, x1, x2, x3, y0, y1, y2, y3)	\
+  do {							\
+    y0  = x0 & x2;					\
+    y3  = x1 | y0; /* t04 */				\
+    y3 ^= x2;						\
+    y1  = ~x3;     /* t02 */				\
+    y1 &= x0;						\
+    y3 ^= y1;						\
+    y1  = x2 | y3;					\
+    y1 ^= x0;						\
+    y2  = x0 & x1;					\
+    x2 ^= y2;						\
+    y2 |= x3;						\
+    y1 ^= y2;						\
+    y2  = x1 | y0; /* t04 */				\
+    y2 &= y3;						\
+    x1 ^= y1;						\
+    y2 |= x1;						\
+    y2 ^= x0;						\
+    y0 ^= y1;						\
+    x3  = ~x3;     /* t02 */				\
+    y0 |= x3;						\
+    y0 ^= x2;						\
   } while (0)
 
 /* In-place linear transformation.  */
@@ -343,7 +386,7 @@
 #define ROUND(which, subkey, x0,x1,x2,x3, y0,y1,y2,y3) \
   do {						       \
     KEYXOR(x0,x1,x2,x3, subkey);		       \
-    SBOX##which(uint32_t, x0,x1,x2,x3, y0,y1,y2,y3);	       \
+    SBOX##which(x0,x1,x2,x3, y0,y1,y2,y3);	       \
     LINEAR_TRANSFORMATION(y0,y1,y2,y3);		       \
   } while (0)
 
@@ -366,7 +409,7 @@
 #define ROUND64(which, subkey, x0,x1,x2,x3, y0,y1,y2,y3) \
   do {						       \
     KEYXOR64(x0,x1,x2,x3, subkey);		       \
-    SBOX##which(uint64_t, x0,x1,x2,x3, y0,y1,y2,y3);	       \
+    SBOX##which(x0,x1,x2,x3, y0,y1,y2,y3);	       \
     LINEAR_TRANSFORMATION64(y0,y1,y2,y3);		       \
   } while (0)
 
@@ -408,7 +451,7 @@ serpent_encrypt (const struct serpent_ctx *ctx,
 
       /* Special final round, using two subkeys. */
       KEYXOR (y0,y1,y2,y3, ctx->keys[31]);
-      SBOX7 (uint32_t, y0,y1,y2,y3, x0,x1,x2,x3);
+      SBOX7 (y0,y1,y2,y3, x0,x1,x2,x3);
       KEYXOR (x0,x1,x2,x3, ctx->keys[32]);
     
       LE_WRITE_UINT32 (dst, x0);
@@ -452,7 +495,7 @@ serpent_encrypt (const struct serpent_ctx *ctx,
 
       /* Special final round, using two subkeys. */
       KEYXOR64 (y0,y1,y2,y3, ctx->keys[31]);
-      SBOX7 (uint64_t, y0,y1,y2,y3, x0,x1,x2,x3);
+      SBOX7 (y0,y1,y2,y3, x0,x1,x2,x3);
       KEYXOR64 (x0,x1,x2,x3, ctx->keys[32]);
     
       LE_WRITE_UINT32 (dst + 16, x0);