.text
.globl  OPENSSL_ia32_cpuid
.type   OPENSSL_ia32_cpuid,@function
.align  16
OPENSSL_ia32_cpuid:
.L_OPENSSL_ia32_cpuid_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushl   %ebp
        pushl   %ebx
        pushl   %esi
        pushl   %edi
        xorl    %edx,%edx
        pushfl
        popl    %eax
        movl    %eax,%ecx
        xorl    $2097152,%eax
        pushl   %eax
        popfl
        pushfl
        popl    %eax
        xorl    %eax,%ecx
        xorl    %eax,%eax
        movl    20(%esp),%esi
        movl    %eax,8(%esi)
        btl     $21,%ecx
        jnc     .L000nocpuid
        .byte   0x0f,0xa2
        movl    %eax,%edi
        xorl    %eax,%eax
        cmpl    $1970169159,%ebx
        setne   %al
        movl    %eax,%ebp
        cmpl    $1231384169,%edx
        setne   %al
        orl     %eax,%ebp
        cmpl    $1818588270,%ecx
        setne   %al
        orl     %eax,%ebp
        jz      .L001intel
        cmpl    $1752462657,%ebx
        setne   %al
        movl    %eax,%esi
        cmpl    $1769238117,%edx
        setne   %al
        orl     %eax,%esi
        cmpl    $1145913699,%ecx
        setne   %al
        orl     %eax,%esi
        jnz     .L001intel
        movl    $2147483648,%eax
        .byte   0x0f,0xa2
        cmpl    $2147483649,%eax
        jb      .L001intel
        movl    %eax,%esi
        movl    $2147483649,%eax
        .byte   0x0f,0xa2
        orl     %ecx,%ebp
        andl    $2049,%ebp
        cmpl    $2147483656,%esi
        jb      .L001intel
        movl    $2147483656,%eax
        .byte   0x0f,0xa2
        movzbl  %cl,%esi
        incl    %esi
        movl    $1,%eax
        xorl    %ecx,%ecx
        .byte   0x0f,0xa2
        btl     $28,%edx
        jnc     .L002generic
        shrl    $16,%ebx
        andl    $255,%ebx
        cmpl    %esi,%ebx
        ja      .L002generic
        andl    $4026531839,%edx
        jmp     .L002generic
.L001intel:
        cmpl    $4,%edi
        movl    $-1,%esi
        jb      .L003nocacheinfo
        movl    $4,%eax
        movl    $0,%ecx
        .byte   0x0f,0xa2
        movl    %eax,%esi
        shrl    $14,%esi
        andl    $4095,%esi
.L003nocacheinfo:
        movl    $1,%eax
        xorl    %ecx,%ecx
        .byte   0x0f,0xa2
        andl    $3220176895,%edx
        cmpl    $0,%ebp
        jne     .L004notintel
        orl     $1073741824,%edx
        andb    $15,%ah
        cmpb    $15,%ah
        jne     .L004notintel
        orl     $1048576,%edx
.L004notintel:
        btl     $28,%edx
        jnc     .L002generic
        andl    $4026531839,%edx
        cmpl    $0,%esi
        je      .L002generic
        orl     $268435456,%edx
        shrl    $16,%ebx
        cmpb    $1,%bl
        ja      .L002generic
        andl    $4026531839,%edx
.L002generic:
        andl    $2048,%ebp
        andl    $4294965247,%ecx
        movl    %edx,%esi
        orl     %ecx,%ebp
        cmpl    $7,%edi
        movl    20(%esp),%edi
        jb      .L005no_extended_info
        movl    $7,%eax
        xorl    %ecx,%ecx
        .byte   0x0f,0xa2
        movl    %ebx,8(%edi)
.L005no_extended_info:
        btl     $27,%ebp
        jnc     .L006clear_avx
        xorl    %ecx,%ecx
.byte   15,1,208
        andl    $6,%eax
        cmpl    $6,%eax
        je      .L007done
        cmpl    $2,%eax
        je      .L006clear_avx
.L008clear_xmm:
        andl    $4261412861,%ebp
        andl    $4278190079,%esi
.L006clear_avx:
        andl    $4026525695,%ebp
        andl    $4294967263,8(%edi)
.L007done:
        movl    %esi,%eax
        movl    %ebp,%edx
.L000nocpuid:
        popl    %edi
        popl    %esi
        popl    %ebx
        popl    %ebp
        ret
.size   OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
.globl  OPENSSL_rdtsc
.type   OPENSSL_rdtsc,@function
.align  16
OPENSSL_rdtsc:
.L_OPENSSL_rdtsc_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        xorl    %eax,%eax
        xorl    %edx,%edx
        leal    OPENSSL_ia32cap_P,%ecx
        btl     $4,(%ecx)
        jnc     .L009notsc
        .byte   0x0f,0x31
.L009notsc:
        ret
.size   OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
.globl  OPENSSL_instrument_halt
.type   OPENSSL_instrument_halt,@function
.align  16
OPENSSL_instrument_halt:
.L_OPENSSL_instrument_halt_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        leal    OPENSSL_ia32cap_P,%ecx
        btl     $4,(%ecx)
        jnc     .L010nohalt
.long   2421723150
        andl    $3,%eax
        jnz     .L010nohalt
        pushfl
        popl    %eax
        btl     $9,%eax
        jnc     .L010nohalt
        .byte   0x0f,0x31
        pushl   %edx
        pushl   %eax
        hlt
        .byte   0x0f,0x31
        subl    (%esp),%eax
        sbbl    4(%esp),%edx
        addl    $8,%esp
        ret
.L010nohalt:
        xorl    %eax,%eax
        xorl    %edx,%edx
        ret
.size   OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
.globl  OPENSSL_far_spin
.type   OPENSSL_far_spin,@function
.align  16
OPENSSL_far_spin:
.L_OPENSSL_far_spin_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushfl
        popl    %eax
        btl     $9,%eax
        jnc     .L011nospin
        movl    4(%esp),%eax
        movl    8(%esp),%ecx
.long   2430111262
        xorl    %eax,%eax
        movl    (%ecx),%edx
        jmp     .L012spin
.align  16
.L012spin:
        incl    %eax
        cmpl    (%ecx),%edx
        je      .L012spin
.long   529567888
        ret
.L011nospin:
        xorl    %eax,%eax
        xorl    %edx,%edx
        ret
.size   OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
.globl  OPENSSL_wipe_cpu
.type   OPENSSL_wipe_cpu,@function
.align  16
OPENSSL_wipe_cpu:
.L_OPENSSL_wipe_cpu_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        xorl    %eax,%eax
        xorl    %edx,%edx
        leal    OPENSSL_ia32cap_P,%ecx
        movl    (%ecx),%ecx
        btl     $1,(%ecx)
        jnc     .L013no_x87
        andl    $83886080,%ecx
        cmpl    $83886080,%ecx
        jne     .L014no_sse2
        pxor    %xmm0,%xmm0
        pxor    %xmm1,%xmm1
        pxor    %xmm2,%xmm2
        pxor    %xmm3,%xmm3
        pxor    %xmm4,%xmm4
        pxor    %xmm5,%xmm5
        pxor    %xmm6,%xmm6
        pxor    %xmm7,%xmm7
.L014no_sse2:
.long   4007259865,4007259865,4007259865,4007259865,2430851995
.L013no_x87:
        leal    4(%esp),%eax
        ret
.size   OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
.globl  OPENSSL_atomic_add
.type   OPENSSL_atomic_add,@function
.align  16
OPENSSL_atomic_add:
.L_OPENSSL_atomic_add_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        movl    4(%esp),%edx
        movl    8(%esp),%ecx
        pushl   %ebx
        nop
        movl    (%edx),%eax
.L015spin:
        leal    (%eax,%ecx,1),%ebx
        nop
.long   447811568
        jne     .L015spin
        movl    %ebx,%eax
        popl    %ebx
        ret
.size   OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
.globl  OPENSSL_cleanse
.type   OPENSSL_cleanse,@function
.align  16
OPENSSL_cleanse:
.L_OPENSSL_cleanse_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        movl    4(%esp),%edx
        movl    8(%esp),%ecx
        xorl    %eax,%eax
        cmpl    $7,%ecx
        jae     .L016lot
        cmpl    $0,%ecx
        je      .L017ret
.L018little:
        movb    %al,(%edx)
        subl    $1,%ecx
        leal    1(%edx),%edx
        jnz     .L018little
.L017ret:
        ret
.align  16
.L016lot:
        testl   $3,%edx
        jz      .L019aligned
        movb    %al,(%edx)
        leal    -1(%ecx),%ecx
        leal    1(%edx),%edx
        jmp     .L016lot
.L019aligned:
        movl    %eax,(%edx)
        leal    -4(%ecx),%ecx
        testl   $-4,%ecx
        leal    4(%edx),%edx
        jnz     .L019aligned
        cmpl    $0,%ecx
        jne     .L018little
        ret
.size   OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
.globl  CRYPTO_memcmp
.type   CRYPTO_memcmp,@function
.align  16
CRYPTO_memcmp:
.L_CRYPTO_memcmp_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushl   %esi
        pushl   %edi
        movl    12(%esp),%esi
        movl    16(%esp),%edi
        movl    20(%esp),%ecx
        xorl    %eax,%eax
        xorl    %edx,%edx
        cmpl    $0,%ecx
        je      .L020no_data
.L021loop:
        movb    (%esi),%dl
        leal    1(%esi),%esi
        xorb    (%edi),%dl
        leal    1(%edi),%edi
        orb     %dl,%al
        decl    %ecx
        jnz     .L021loop
        negl    %eax
        shrl    $31,%eax
.L020no_data:
        popl    %edi
        popl    %esi
        ret
.size   CRYPTO_memcmp,.-.L_CRYPTO_memcmp_begin
.globl  OPENSSL_instrument_bus
.type   OPENSSL_instrument_bus,@function
.align  16
OPENSSL_instrument_bus:
.L_OPENSSL_instrument_bus_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushl   %ebp
        pushl   %ebx
        pushl   %esi
        pushl   %edi
        movl    $0,%eax
        leal    OPENSSL_ia32cap_P,%edx
        btl     $4,(%edx)
        jnc     .L022nogo
        btl     $19,(%edx)
        jnc     .L022nogo
        movl    20(%esp),%edi
        movl    24(%esp),%ecx
        .byte   0x0f,0x31
        movl    %eax,%esi
        movl    $0,%ebx
        clflush (%edi)
.byte   240
        addl    %ebx,(%edi)
        jmp     .L023loop
.align  16
.L023loop:
        .byte   0x0f,0x31
        movl    %eax,%edx
        subl    %esi,%eax
        movl    %edx,%esi
        movl    %eax,%ebx
        clflush (%edi)
.byte   240
        addl    %eax,(%edi)
        leal    4(%edi),%edi
        subl    $1,%ecx
        jnz     .L023loop
        movl    24(%esp),%eax
.L022nogo:
        popl    %edi
        popl    %esi
        popl    %ebx
        popl    %ebp
        ret
.size   OPENSSL_instrument_bus,.-.L_OPENSSL_instrument_bus_begin
.globl  OPENSSL_instrument_bus2
.type   OPENSSL_instrument_bus2,@function
.align  16
OPENSSL_instrument_bus2:
.L_OPENSSL_instrument_bus2_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushl   %ebp
        pushl   %ebx
        pushl   %esi
        pushl   %edi
        movl    $0,%eax
        leal    OPENSSL_ia32cap_P,%edx
        btl     $4,(%edx)
        jnc     .L024nogo
        btl     $19,(%edx)
        jnc     .L024nogo
        movl    20(%esp),%edi
        movl    24(%esp),%ecx
        movl    28(%esp),%ebp
        .byte   0x0f,0x31
        movl    %eax,%esi
        movl    $0,%ebx
        clflush (%edi)
.byte   240
        addl    %ebx,(%edi)
        .byte   0x0f,0x31
        movl    %eax,%edx
        subl    %esi,%eax
        movl    %edx,%esi
        movl    %eax,%ebx
        jmp     .L025loop2
.align  16
.L025loop2:
        clflush (%edi)
.byte   240
        addl    %eax,(%edi)
        subl    $1,%ebp
        jz      .L026done2
        .byte   0x0f,0x31
        movl    %eax,%edx
        subl    %esi,%eax
        movl    %edx,%esi
        cmpl    %ebx,%eax
        movl    %eax,%ebx
        movl    $0,%edx
        setne   %dl
        subl    %edx,%ecx
        leal    (%edi,%edx,4),%edi
        jnz     .L025loop2
.L026done2:
        movl    24(%esp),%eax
        subl    %ecx,%eax
.L024nogo:
        popl    %edi
        popl    %esi
        popl    %ebx
        popl    %ebp
        ret
.size   OPENSSL_instrument_bus2,.-.L_OPENSSL_instrument_bus2_begin
.globl  OPENSSL_ia32_rdrand_bytes
.type   OPENSSL_ia32_rdrand_bytes,@function
.align  16
OPENSSL_ia32_rdrand_bytes:
.L_OPENSSL_ia32_rdrand_bytes_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushl   %edi
        pushl   %ebx
        xorl    %eax,%eax
        movl    12(%esp),%edi
        movl    16(%esp),%ebx
        cmpl    $0,%ebx
        je      .L027done
        movl    $8,%ecx
.L028loop:
.byte   15,199,242
        jc      .L029break
        loop    .L028loop
        jmp     .L027done
.align  16
.L029break:
        cmpl    $4,%ebx
        jb      .L030tail
        movl    %edx,(%edi)
        leal    4(%edi),%edi
        addl    $4,%eax
        subl    $4,%ebx
        jz      .L027done
        movl    $8,%ecx
        jmp     .L028loop
.align  16
.L030tail:
        movb    %dl,(%edi)
        leal    1(%edi),%edi
        incl    %eax
        shrl    $8,%edx
        decl    %ebx
        jnz     .L030tail
.L027done:
        xorl    %edx,%edx
        popl    %ebx
        popl    %edi
        ret
.size   OPENSSL_ia32_rdrand_bytes,.-.L_OPENSSL_ia32_rdrand_bytes_begin
.globl  OPENSSL_ia32_rdseed_bytes
.type   OPENSSL_ia32_rdseed_bytes,@function
.align  16
OPENSSL_ia32_rdseed_bytes:
.L_OPENSSL_ia32_rdseed_bytes_begin:
        #ifdef __CET__

.byte   243,15,30,251
        #endif

        pushl   %edi
        pushl   %ebx
        xorl    %eax,%eax
        movl    12(%esp),%edi
        movl    16(%esp),%ebx
        cmpl    $0,%ebx
        je      .L031done
        movl    $8,%ecx
.L032loop:
.byte   15,199,250
        jc      .L033break
        loop    .L032loop
        jmp     .L031done
.align  16
.L033break:
        cmpl    $4,%ebx
        jb      .L034tail
        movl    %edx,(%edi)
        leal    4(%edi),%edi
        addl    $4,%eax
        subl    $4,%ebx
        jz      .L031done
        movl    $8,%ecx
        jmp     .L032loop
.align  16
.L034tail:
        movb    %dl,(%edi)
        leal    1(%edi),%edi
        incl    %eax
        shrl    $8,%edx
        decl    %ebx
        jnz     .L034tail
.L031done:
        xorl    %edx,%edx
        popl    %ebx
        popl    %edi
        ret
.size   OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin
.hidden OPENSSL_cpuid_setup
.hidden OPENSSL_ia32cap_P
.comm   OPENSSL_ia32cap_P,16,4
.section        .init
        call    OPENSSL_cpuid_setup

        .section ".note.gnu.property", "a"
        .p2align 2
        .long 1f - 0f
        .long 4f - 1f
        .long 5
0:
        .asciz "GNU"
1:
        .p2align 2
        .long 0xc0000002
        .long 3f - 2f
2:
        .long 3
3:
        .p2align 2
4:
