diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c
index fd894cdb808d008dfe7f46bacf9519d8af3be21d..5fe95e8d8a08f881e52c13e9554390e1ab6e9fcb 100644
--- a/libavutil/blowfish.c
+++ b/libavutil/blowfish.c
@@ -294,24 +294,12 @@ static const uint32_t orig_s[4][256] = {
       0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }
 };
 
-static void F(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int i)
-{
-    uint32_t Xl, Xr;
-    uint32_t y;
-
-    Xl = *xl;
-    Xr = *xr;
-
-    Xl ^= ctx->p[i];
-    y   = ctx->s[0][(Xl >> 24) & 0xFF];
-    y  += ctx->s[1][(Xl >> 16) & 0xFF];
-    y  ^= ctx->s[2][(Xl >>  8) & 0xFF];
-    y  += ctx->s[3][ Xl        & 0xFF];
-    Xr ^= y;
-
-    *xl = Xr;
-    *xr = Xl;
-}
+#define F(Xl, Xr, P) \
+    Xr ^=((( ctx->s[0][ Xl >> 24        ] \
+           + ctx->s[1][(Xl >> 16) & 0xFF])\
+           ^ ctx->s[2][(Xl >>  8) & 0xFF])\
+           + ctx->s[3][ Xl        & 0xFF])\
+           ^ P;
 
 av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
 {
@@ -358,17 +346,21 @@ void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
     Xr = *xr;
 
     if (decrypt) {
-        for (i = AV_BF_ROUNDS + 1; i > 1; --i)
-            F(ctx, &Xl, &Xr, i);
+        Xl ^= ctx->p[AV_BF_ROUNDS + 1];
+        for (i = AV_BF_ROUNDS; i > 0; i-=2) {
+            F(Xl, Xr, ctx->p[i  ]);
+            F(Xr, Xl, ctx->p[i-1]);
+        }
 
-        Xl = Xl ^ ctx->p[1];
-        Xr = Xr ^ ctx->p[0];
+        Xr ^= ctx->p[0];
     } else {
-        for (i = 0; i < AV_BF_ROUNDS; ++i)
-            F(ctx, &Xl, &Xr, i);
+        Xl ^= ctx->p[0];
+        for (i = 1; i < AV_BF_ROUNDS+1; i+=2){
+            F(Xl, Xr, ctx->p[i  ]);
+            F(Xr, Xl, ctx->p[i+1]);
+        }
 
-        Xl = Xl ^ ctx->p[AV_BF_ROUNDS];
-        Xr = Xr ^ ctx->p[AV_BF_ROUNDS + 1];
+        Xr ^= ctx->p[AV_BF_ROUNDS + 1];
     }
 
     *xl = Xr;