+45% RC4 performance boost on Intel EM64T core. Unrolled loop providing
[openssl.git] / crypto / rc4 / asm / rc4-amd64.pl
index 35e426d..2d3dedd 100755 (executable)
@@ -30,7 +30,9 @@
 # RC4_CHAR. Kind of ironic, huh? As it's apparently impossible to
 # compose blended code, which would perform even within 30% marginal
 # on either AMD and Intel platforms, I implement both cases. See
 # RC4_CHAR. Kind of ironic, huh? As it's apparently impossible to
 # compose blended code, which would perform even within 30% marginal
 # on either AMD and Intel platforms, I implement both cases. See
-# rc4_skey.c for further details...
+# rc4_skey.c for further details... This applies to 0.9.8 and later.
+# In 0.9.7 context RC4_CHAR codepath is never engaged and ~70 bytes
+# of code remain redundant.
 
 $output=shift;
 
 
 $output=shift;
 
@@ -179,7 +181,7 @@ $code.=<<___;
 
 .align 16
 .LRC4_CHAR:
 
 .align 16
 .LRC4_CHAR:
-       inc     $XX#b
+       add     \$1,$XX#b
        movzb   `&PTR("BYTE:[$dat+$XX]")`,$TX#d
        add     $TX#b,$YY#b
        movzb   `&PTR("BYTE:[$dat+$YY]")`,$TY#d
        movzb   `&PTR("BYTE:[$dat+$XX]")`,$TX#d
        add     $TX#b,$YY#b
        movzb   `&PTR("BYTE:[$dat+$YY]")`,$TY#d
@@ -189,9 +191,9 @@ $code.=<<___;
        movzb   `&PTR("BYTE:[$dat+$TY]")`,$TY#d
        xorb    `&PTR("BYTE:[$inp]")`,$TY#b
        movb    $TY#b,`&PTR("BYTE:[$out]")`
        movzb   `&PTR("BYTE:[$dat+$TY]")`,$TY#d
        xorb    `&PTR("BYTE:[$inp]")`,$TY#b
        movb    $TY#b,`&PTR("BYTE:[$out]")`
-       inc     $inp
-       inc     $out
-       dec     $len
+       lea     1($inp),$inp
+       lea     1($out),$out
+       sub     \$1,$len
        jnz     .LRC4_CHAR
        jmp     .Lexit
 ___
        jnz     .LRC4_CHAR
        jmp     .Lexit
 ___