deps/openssl/asm/x86-win32-masm/rc4/rc4-586.asm

Summary

Maintainability
Test Coverage
TITLE    rc4-586.asm
IF @Version LT 800
ECHO MASM version 8.00 or later is strongly recommended.
ENDIF
.686
.XMM
IF @Version LT 800
XMMWORD STRUCT 16
DQ    2 dup (?)
XMMWORD    ENDS
ENDIF

.MODEL    FLAT
OPTION    DOTNAME
IF @Version LT 800
.text$    SEGMENT PAGE 'CODE'
ELSE
.text$    SEGMENT ALIGN(64) 'CODE'
ENDIF
;EXTERN    _OPENSSL_ia32cap_P:NEAR
ALIGN    16
_RC4    PROC PUBLIC
$L_RC4_begin::
    push    ebp
    push    ebx
    push    esi
    push    edi
    mov    edi,DWORD PTR 20[esp]
    mov    edx,DWORD PTR 24[esp]
    mov    esi,DWORD PTR 28[esp]
    mov    ebp,DWORD PTR 32[esp]
    xor    eax,eax
    xor    ebx,ebx
    cmp    edx,0
    je    $L000abort
    mov    al,BYTE PTR [edi]
    mov    bl,BYTE PTR 4[edi]
    add    edi,8
    lea    ecx,DWORD PTR [edx*1+esi]
    sub    ebp,esi
    mov    DWORD PTR 24[esp],ecx
    inc    al
    cmp    DWORD PTR 256[edi],-1
    je    $L001RC4_CHAR
    mov    ecx,DWORD PTR [eax*4+edi]
    and    edx,-4
    jz    $L002loop1
    test    edx,-8
    mov    DWORD PTR 32[esp],ebp
    jz    $L003go4loop4
    lea    ebp,DWORD PTR _OPENSSL_ia32cap_P
    bt    DWORD PTR [ebp],26
    jnc    $L003go4loop4
    mov    ebp,DWORD PTR 32[esp]
    and    edx,-8
    lea    edx,DWORD PTR [edx*1+esi-8]
    mov    DWORD PTR [edi-4],edx
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    movq    mm0,QWORD PTR [esi]
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm2,DWORD PTR [edx*4+edi]
    jmp    $L004loop_mmx_enter
ALIGN    16
$L005loop_mmx:
    add    bl,cl
    psllq    mm1,56
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    movq    mm0,QWORD PTR [esi]
    movq    QWORD PTR [esi*1+ebp-8],mm2
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm2,DWORD PTR [edx*4+edi]
$L004loop_mmx_enter:
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm0
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    add    bl,cl
    psllq    mm1,8
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    add    bl,cl
    psllq    mm1,16
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    add    bl,cl
    psllq    mm1,24
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    add    bl,cl
    psllq    mm1,32
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    add    bl,cl
    psllq    mm1,40
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    add    bl,cl
    psllq    mm1,48
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    inc    eax
    add    edx,ecx
    movzx    eax,al
    movzx    edx,dl
    pxor    mm2,mm1
    mov    ecx,DWORD PTR [eax*4+edi]
    movd    mm1,DWORD PTR [edx*4+edi]
    mov    edx,ebx
    xor    ebx,ebx
    mov    bl,dl
    cmp    esi,DWORD PTR [edi-4]
    lea    esi,DWORD PTR 8[esi]
    jb    $L005loop_mmx
    psllq    mm1,56
    pxor    mm2,mm1
    movq    QWORD PTR [esi*1+ebp-8],mm2
    emms
    cmp    esi,DWORD PTR 24[esp]
    je    $L006done
    jmp    $L002loop1
ALIGN    16
$L003go4loop4:
    lea    edx,DWORD PTR [edx*1+esi-4]
    mov    DWORD PTR 28[esp],edx
$L007loop4:
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    add    edx,ecx
    inc    al
    and    edx,255
    mov    ecx,DWORD PTR [eax*4+edi]
    mov    ebp,DWORD PTR [edx*4+edi]
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    add    edx,ecx
    inc    al
    and    edx,255
    ror    ebp,8
    mov    ecx,DWORD PTR [eax*4+edi]
    or    ebp,DWORD PTR [edx*4+edi]
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    add    edx,ecx
    inc    al
    and    edx,255
    ror    ebp,8
    mov    ecx,DWORD PTR [eax*4+edi]
    or    ebp,DWORD PTR [edx*4+edi]
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    add    edx,ecx
    inc    al
    and    edx,255
    ror    ebp,8
    mov    ecx,DWORD PTR 32[esp]
    or    ebp,DWORD PTR [edx*4+edi]
    ror    ebp,8
    xor    ebp,DWORD PTR [esi]
    cmp    esi,DWORD PTR 28[esp]
    mov    DWORD PTR [esi*1+ecx],ebp
    lea    esi,DWORD PTR 4[esi]
    mov    ecx,DWORD PTR [eax*4+edi]
    jb    $L007loop4
    cmp    esi,DWORD PTR 24[esp]
    je    $L006done
    mov    ebp,DWORD PTR 32[esp]
ALIGN    16
$L002loop1:
    add    bl,cl
    mov    edx,DWORD PTR [ebx*4+edi]
    mov    DWORD PTR [ebx*4+edi],ecx
    mov    DWORD PTR [eax*4+edi],edx
    add    edx,ecx
    inc    al
    and    edx,255
    mov    edx,DWORD PTR [edx*4+edi]
    xor    dl,BYTE PTR [esi]
    lea    esi,DWORD PTR 1[esi]
    mov    ecx,DWORD PTR [eax*4+edi]
    cmp    esi,DWORD PTR 24[esp]
    mov    BYTE PTR [esi*1+ebp-1],dl
    jb    $L002loop1
    jmp    $L006done
ALIGN    16
$L001RC4_CHAR:
    movzx    ecx,BYTE PTR [eax*1+edi]
$L008cloop1:
    add    bl,cl
    movzx    edx,BYTE PTR [ebx*1+edi]
    mov    BYTE PTR [ebx*1+edi],cl
    mov    BYTE PTR [eax*1+edi],dl
    add    dl,cl
    movzx    edx,BYTE PTR [edx*1+edi]
    add    al,1
    xor    dl,BYTE PTR [esi]
    lea    esi,DWORD PTR 1[esi]
    movzx    ecx,BYTE PTR [eax*1+edi]
    cmp    esi,DWORD PTR 24[esp]
    mov    BYTE PTR [esi*1+ebp-1],dl
    jb    $L008cloop1
$L006done:
    dec    al
    mov    DWORD PTR [edi-4],ebx
    mov    BYTE PTR [edi-8],al
$L000abort:
    pop    edi
    pop    esi
    pop    ebx
    pop    ebp
    ret
_RC4 ENDP
ALIGN    16
_private_RC4_set_key    PROC PUBLIC
$L_private_RC4_set_key_begin::
    push    ebp
    push    ebx
    push    esi
    push    edi
    mov    edi,DWORD PTR 20[esp]
    mov    ebp,DWORD PTR 24[esp]
    mov    esi,DWORD PTR 28[esp]
    lea    edx,DWORD PTR _OPENSSL_ia32cap_P
    lea    edi,DWORD PTR 8[edi]
    lea    esi,DWORD PTR [ebp*1+esi]
    neg    ebp
    xor    eax,eax
    mov    DWORD PTR [edi-4],ebp
    bt    DWORD PTR [edx],20
    jc    $L009c1stloop
ALIGN    16
$L010w1stloop:
    mov    DWORD PTR [eax*4+edi],eax
    add    al,1
    jnc    $L010w1stloop
    xor    ecx,ecx
    xor    edx,edx
ALIGN    16
$L011w2ndloop:
    mov    eax,DWORD PTR [ecx*4+edi]
    add    dl,BYTE PTR [ebp*1+esi]
    add    dl,al
    add    ebp,1
    mov    ebx,DWORD PTR [edx*4+edi]
    jnz    $L012wnowrap
    mov    ebp,DWORD PTR [edi-4]
$L012wnowrap:
    mov    DWORD PTR [edx*4+edi],eax
    mov    DWORD PTR [ecx*4+edi],ebx
    add    cl,1
    jnc    $L011w2ndloop
    jmp    $L013exit
ALIGN    16
$L009c1stloop:
    mov    BYTE PTR [eax*1+edi],al
    add    al,1
    jnc    $L009c1stloop
    xor    ecx,ecx
    xor    edx,edx
    xor    ebx,ebx
ALIGN    16
$L014c2ndloop:
    mov    al,BYTE PTR [ecx*1+edi]
    add    dl,BYTE PTR [ebp*1+esi]
    add    dl,al
    add    ebp,1
    mov    bl,BYTE PTR [edx*1+edi]
    jnz    $L015cnowrap
    mov    ebp,DWORD PTR [edi-4]
$L015cnowrap:
    mov    BYTE PTR [edx*1+edi],al
    mov    BYTE PTR [ecx*1+edi],bl
    add    cl,1
    jnc    $L014c2ndloop
    mov    DWORD PTR 256[edi],-1
$L013exit:
    xor    eax,eax
    mov    DWORD PTR [edi-8],eax
    mov    DWORD PTR [edi-4],eax
    pop    edi
    pop    esi
    pop    ebx
    pop    ebp
    ret
_private_RC4_set_key ENDP
ALIGN    16
_RC4_options    PROC PUBLIC
$L_RC4_options_begin::
    call    $L016pic_point
$L016pic_point:
    pop    eax
    lea    eax,DWORD PTR ($L017opts-$L016pic_point)[eax]
    lea    edx,DWORD PTR _OPENSSL_ia32cap_P
    mov    edx,DWORD PTR [edx]
    bt    edx,20
    jc    $L0181xchar
    bt    edx,26
    jnc    $L019ret
    add    eax,25
    ret
$L0181xchar:
    add    eax,12
$L019ret:
    ret
ALIGN    64
$L017opts:
DB    114,99,52,40,52,120,44,105,110,116,41,0
DB    114,99,52,40,49,120,44,99,104,97,114,41,0
DB    114,99,52,40,56,120,44,109,109,120,41,0
DB    82,67,52,32,102,111,114,32,120,56,54,44,32,67,82,89
DB    80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
DB    111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
ALIGN    64
_RC4_options ENDP
.text$    ENDS
.bss    SEGMENT 'BSS'
COMM    _OPENSSL_ia32cap_P:QWORD
.bss    ENDS
END