diff --git a/arcfour.c b/arcfour.c
index 03c9cd8801e0a9bb8c9a2f678abe596c46871ff2..d5424348eecde3420f8ff76d734152098b4e4f0e 100644
--- a/arcfour.c
+++ b/arcfour.c
@@ -63,14 +63,16 @@ arcfour_crypt(struct arcfour_ctx *ctx,
 	      const uint8_t *src)
 {
   register uint8_t i, j;
+  register int si, sj;
 
   i = ctx->i; j = ctx->j;
   while(length--)
     {
       i++; i &= 0xff;
-      j += ctx->S[i]; j &= 0xff;
-      SWAP(ctx->S[i], ctx->S[j]);
-      *dst++ = *src++ ^ ctx->S[ (ctx->S[i] + ctx->S[j]) & 0xff ];
+      si = ctx->S[i];
+      j += si; j &= 0xff;
+      sj = ctx->S[i] = ctx->S[j];
+      *dst++ = *src++ ^ ctx->S[ (si + sj) & 0xff ];
     }
   ctx->i = i; ctx->j = j;
 }
@@ -80,14 +82,16 @@ arcfour_stream(struct arcfour_ctx *ctx,
 	       unsigned length, uint8_t *dst)
 {
   register uint8_t i, j;
+  register int si, sj;
 
   i = ctx->i; j = ctx->j;
   while(length--)
     {
       i++; i &= 0xff;
-      j += ctx->S[i]; j &= 0xff;
-      SWAP(ctx->S[i], ctx->S[j]);
-      *dst++ = ctx->S[ (ctx->S[i] + ctx->S[j]) & 0xff ];
+      si = ctx->S[i];
+      j += si; j &= 0xff;
+      sj = ctx->S[i] = ctx->S[j];
+      *dst++ = ctx->S[ (si + sj) & 0xff ];
     }
   ctx->i = i; ctx->j = j;
 }