supposedly smart compilers from optimizing memory cleanups away. Understood.
Ok, in case of an hypothetically super smart compiler, OPENSSL_cleanse() had
to be convoluted enough for the compiler not to recognize that this was
actually bzero() in disguise. Understood.
But then why there had been optimized assembler versions of OPENSSL_cleanse()
is beyond me. Did someone not trust the C obfuscation?
rpcc $0
ret ($26)
.end OPENSSL_rdtsc
-
-.globl OPENSSL_cleanse
-.ent OPENSSL_cleanse
-OPENSSL_cleanse:
- .frame $30,0,$26
- .prologue 0
- beq $17,.Ldone
- and $16,7,$0
- bic $17,7,$at
- beq $at,.Little
- beq $0,.Laligned
-
-.Little:
- subq $0,8,$0
- ldq_u $1,0($16)
- mov $16,$2
-.Lalign:
- mskbl $1,$16,$1
- lda $16,1($16)
- subq $17,1,$17
- addq $0,1,$0
- beq $17,.Lout
- bne $0,.Lalign
-.Lout: stq_u $1,0($2)
- beq $17,.Ldone
- bic $17,7,$at
- beq $at,.Little
-
-.Laligned:
- stq $31,0($16)
- subq $17,8,$17
- lda $16,8($16)
- bic $17,7,$at
- bne $at,.Laligned
- bne $17,.Little
-.Ldone: ret ($26)
-.end OPENSSL_cleanse
___
#endif
.size OPENSSL_atomic_add,.-OPENSSL_atomic_add
-.global OPENSSL_cleanse
-.type OPENSSL_cleanse,%function
-OPENSSL_cleanse:
- eor ip,ip,ip
- cmp r1,#7
- subhs r1,r1,#4
- bhs .Lot
- cmp r1,#0
- beq .Lcleanse_done
-.Little:
- strb ip,[r0],#1
- subs r1,r1,#1
- bhi .Little
- b .Lcleanse_done
-
-.Lot: tst r0,#3
- beq .Laligned
- strb ip,[r0],#1
- sub r1,r1,#1
- b .Lot
-.Laligned:
- str ip,[r0],#4
- subs r1,r1,#4
- bhs .Laligned
- adds r1,r1,#4
- bne .Little
-.Lcleanse_done:
- tst lr,#1
- moveq pc,lr
- .word 0xe12fff1e @ bx lr
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
-
.global OPENSSL_wipe_cpu
.type OPENSSL_wipe_cpu,%function
OPENSSL_wipe_cpu:
-# $OpenBSD: Makefile,v 1.19 2014/04/17 18:11:46 miod Exp $
+# $OpenBSD: Makefile,v 1.20 2014/04/17 18:16:45 miod Exp $
LIB= crypto
# crypto/
SRCS+= cryptlib.c malloc-wrapper.c mem_dbg.c cversion.c ex_data.c cpt_err.c
SRCS+= uid.c o_time.c o_str.c o_init.c
+SRCS+= mem_clr.c
# aes/
SRCS+= aes_misc.c aes_ecb.c aes_cfb.c aes_ofb.c
.if empty (SSLASM)
CFLAGS+=-DOPENSSL_NO_ASM
-SRCS+= mem_clr.c
SRCS+= aes_core.c aes_cbc.c
SRCS+= bf_enc.c
SRCS+= bn_asm.c
mov ar.lc=r3
br.ret.sptk b0 };;
.endp OPENSSL_wipe_cpu#
-
-.global OPENSSL_cleanse#
-.proc OPENSSL_cleanse#
-OPENSSL_cleanse:
-{ .mib; cmp.eq p6,p0=0,r33 // len==0
-#if defined(_HPUX_SOURCE) && !defined(_LP64)
- addp4 r32=0,r32
-#endif
-(p6) br.ret.spnt b0 };;
-{ .mib; and r2=7,r32
- cmp.leu p6,p0=15,r33 // len>=15
-(p6) br.cond.dptk .Lot };;
-
-.Little:
-{ .mib; st1 [r32]=r0,1
- cmp.ltu p6,p7=1,r33 } // len>1
-{ .mbb; add r33=-1,r33 // len--
-(p6) br.cond.dptk .Little
-(p7) br.ret.sptk.many b0 };;
-
-.Lot:
-{ .mib; cmp.eq p6,p0=0,r2
-(p6) br.cond.dptk .Laligned };;
-{ .mmi; st1 [r32]=r0,1;;
- and r2=7,r32 }
-{ .mib; add r33=-1,r33
- br .Lot };;
-
-.Laligned:
-{ .mmi; st8 [r32]=r0,8
- and r2=-8,r33 // len&~7
- add r33=-8,r33 };; // len-=8
-{ .mib; cmp.ltu p6,p0=8,r2 // ((len+8)&~7)>8
-(p6) br.cond.dptk .Laligned };;
-
-{ .mbb; cmp.eq p6,p7=r0,r33
-(p7) br.cond.dpnt .Little
-(p6) br.ret.sptk.many b0 };;
-.endp OPENSSL_cleanse#
.PROCEND
___
{
-my $inp="%r26";
-my $len="%r25";
-
-$code.=<<___;
- .EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
- .ALIGN 8
-OPENSSL_cleanse
- .PROC
- .CALLINFO NO_CALLS
- .ENTRY
- cmpib,*= 0,$len,L\$done
- nop
- cmpib,*>>= 15,$len,L\$ittle
- ldi $SIZE_T-1,%r1
-
-L\$align
- and,*<> $inp,%r1,%r28
- b,n L\$aligned
- stb %r0,0($inp)
- ldo -1($len),$len
- b L\$align
- ldo 1($inp),$inp
-
-L\$aligned
- andcm $len,%r1,%r28
-L\$ot
- $ST %r0,0($inp)
- addib,*<> -$SIZE_T,%r28,L\$ot
- ldo $SIZE_T($inp),$inp
-
- and,*<> $len,%r1,$len
- b,n L\$done
-L\$ittle
- stb %r0,0($inp)
- addib,*<> -1,$len,L\$ittle
- ldo 1($inp),$inp
-L\$done
- bv ($rp)
- .EXIT
- nop
- .PROCEND
-___
-}
-{
my ($out,$cnt,$max)=("%r26","%r25","%r24");
my ($tick,$lasttick)=("%r23","%r22");
my ($diff,$lastdiff)=("%r21","%r20");
blr
.long 0
.byte 0,12,0x14,0,0,0,0,0
-
-.globl .OPENSSL_cleanse
-.align 4
-.OPENSSL_cleanse:
- $CMPLI r4,7
- li r0,0
- bge Lot
- $CMPLI r4,0
- beqlr-
-Little: mtctr r4
- stb r0,0(r3)
- addi r3,r3,1
- bdnz \$-8
- blr
-Lot: andi. r5,r3,3
- beq Laligned
- stb r0,0(r3)
- subi r4,r4,1
- addi r3,r3,1
- b Lot
-Laligned:
- $SHRLI r5,r4,2
- mtctr r5
- stw r0,0(r3)
- addi r3,r3,4
- bdnz \$-8
- andi. r4,r4,3
- bne Little
- blr
- .long 0
- .byte 0,12,0x14,0,0,0,2,0
- .long 0
___
$code =~ s/\`([^\`]*)\`/eval $1/gem;
br %r14
.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
-.globl OPENSSL_cleanse
-.type OPENSSL_cleanse,@function
-.align 16
-OPENSSL_cleanse:
-#if !defined(__s390x__) && !defined(__s390x)
- llgfr %r3,%r3
-#endif
- lghi %r4,15
- lghi %r0,0
- clgr %r3,%r4
- jh .Lot
- clgr %r3,%r0
- bcr 8,%r14
-.Little:
- stc %r0,0(%r2)
- la %r2,1(%r2)
- brctg %r3,.Little
- br %r14
-.align 4
-.Lot: tmll %r2,7
- jz .Laligned
- stc %r0,0(%r2)
- la %r2,1(%r2)
- brctg %r3,.Lot
-.Laligned:
- srlg %r4,%r3,3
-.Loop: stg %r0,0(%r2)
- la %r2,8(%r2)
- brctg %r4,.Loop
- lghi %r4,7
- ngr %r3,%r4
- jnz .Little
- br %r14
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
-
.section .init
brasl %r14,OPENSSL_cpuid_setup
.type _sparcv9_fmadd_probe,#function
.size _sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
-.global OPENSSL_cleanse
-.align 32
-OPENSSL_cleanse:
- cmp %o1,14
- nop
-#ifdef ABI64
- bgu %xcc,.Lot
-#else
- bgu .Lot
-#endif
- cmp %o1,0
- bne .Little
- nop
- retl
- nop
-
-.Little:
- stb %g0,[%o0]
- subcc %o1,1,%o1
- bnz .Little
- add %o0,1,%o0
- retl
- nop
-.align 32
-.Lot:
-#ifndef ABI64
- subcc %g0,1,%g1
- ! see above for explanation
- .word 0x83408000 !rd %ccr,%g1
- cmp %g1,0x99
- bne .v8lot
- nop
-#endif
-
-.v9lot: andcc %o0,7,%g0
- bz .v9aligned
- nop
- stb %g0,[%o0]
- sub %o1,1,%o1
- ba .v9lot
- add %o0,1,%o0
-.align 16,0x01000000
-.v9aligned:
- .word 0xc0720000 !stx %g0,[%o0]
- sub %o1,8,%o1
- andcc %o1,-8,%g0
-#ifdef ABI64
- .word 0x126ffffd !bnz %xcc,.v9aligned
-#else
- .word 0x124ffffd !bnz %icc,.v9aligned
-#endif
- add %o0,8,%o0
-
- cmp %o1,0
- bne .Little
- nop
- retl
- nop
-#ifndef ABI64
-.v8lot: andcc %o0,3,%g0
- bz .v8aligned
- nop
- stb %g0,[%o0]
- sub %o1,1,%o1
- ba .v8lot
- add %o0,1,%o0
- nop
-.v8aligned:
- st %g0,[%o0]
- sub %o1,4,%o1
- andcc %o1,-4,%g0
- bnz .v8aligned
- add %o0,4,%o0
-
- cmp %o1,0
- bne .Little
- nop
- retl
- nop
-#endif
-.type OPENSSL_cleanse,#function
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
-
.section ".init",#alloc,#execinstr
call OPENSSL_cpuid_setup
nop
or %r9,%rax
ret
.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
-
-.globl OPENSSL_cleanse
-.type OPENSSL_cleanse,\@abi-omnipotent
-.align 16
-OPENSSL_cleanse:
- xor %rax,%rax
- cmp \$15,$arg2
- jae .Lot
- cmp \$0,$arg2
- je .Lret
-.Little:
- mov %al,($arg1)
- sub \$1,$arg2
- lea 1($arg1),$arg1
- jnz .Little
-.Lret:
- ret
-.align 16
-.Lot:
- test \$7,$arg1
- jz .Laligned
- mov %al,($arg1)
- lea -1($arg2),$arg2
- lea 1($arg1),$arg1
- jmp .Lot
-.Laligned:
- mov %rax,($arg1)
- lea -8($arg2),$arg2
- test \$-8,$arg2
- lea 8($arg1),$arg1
- jnz .Laligned
- cmp \$0,$arg2
- jne .Little
- ret
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
___
print<<___ if (!$win64);
}
&function_end_B("OPENSSL_indirect_call");
-&function_begin_B("OPENSSL_cleanse");
- &mov ("edx",&wparam(0));
- &mov ("ecx",&wparam(1));
- &xor ("eax","eax");
- &cmp ("ecx",7);
- &jae (&label("lot"));
- &cmp ("ecx",0);
- &je (&label("ret"));
-&set_label("little");
- &mov (&BP(0,"edx"),"al");
- &sub ("ecx",1);
- &lea ("edx",&DWP(1,"edx"));
- &jnz (&label("little"));
-&set_label("ret");
- &ret ();
-
-&set_label("lot",16);
- &test ("edx",3);
- &jz (&label("aligned"));
- &mov (&BP(0,"edx"),"al");
- &lea ("ecx",&DWP(-1,"ecx"));
- &lea ("edx",&DWP(1,"edx"));
- &jmp (&label("lot"));
-&set_label("aligned");
- &mov (&DWP(0,"edx"),"eax");
- &lea ("ecx",&DWP(-4,"ecx"));
- &test ("ecx",-4);
- &lea ("edx",&DWP(4,"edx"));
- &jnz (&label("aligned"));
- &cmp ("ecx",0);
- &jne (&label("little"));
- &ret ();
-&function_end_B("OPENSSL_cleanse");
-
&function_begin_B("OPENSSL_ia32_rdrand");
&mov ("ecx",8);
&set_label("loop");
rpcc $0
ret ($26)
.end OPENSSL_rdtsc
-
-.globl OPENSSL_cleanse
-.ent OPENSSL_cleanse
-OPENSSL_cleanse:
- .frame $30,0,$26
- .prologue 0
- beq $17,.Ldone
- and $16,7,$0
- bic $17,7,$at
- beq $at,.Little
- beq $0,.Laligned
-
-.Little:
- subq $0,8,$0
- ldq_u $1,0($16)
- mov $16,$2
-.Lalign:
- mskbl $1,$16,$1
- lda $16,1($16)
- subq $17,1,$17
- addq $0,1,$0
- beq $17,.Lout
- bne $0,.Lalign
-.Lout: stq_u $1,0($2)
- beq $17,.Ldone
- bic $17,7,$at
- beq $at,.Little
-
-.Laligned:
- stq $31,0($16)
- subq $17,8,$17
- lda $16,8($16)
- bic $17,7,$at
- bne $at,.Laligned
- bne $17,.Little
-.Ldone: ret ($26)
-.end OPENSSL_cleanse
___
#endif
.size OPENSSL_atomic_add,.-OPENSSL_atomic_add
-.global OPENSSL_cleanse
-.type OPENSSL_cleanse,%function
-OPENSSL_cleanse:
- eor ip,ip,ip
- cmp r1,#7
- subhs r1,r1,#4
- bhs .Lot
- cmp r1,#0
- beq .Lcleanse_done
-.Little:
- strb ip,[r0],#1
- subs r1,r1,#1
- bhi .Little
- b .Lcleanse_done
-
-.Lot: tst r0,#3
- beq .Laligned
- strb ip,[r0],#1
- sub r1,r1,#1
- b .Lot
-.Laligned:
- str ip,[r0],#4
- subs r1,r1,#4
- bhs .Laligned
- adds r1,r1,#4
- bne .Little
-.Lcleanse_done:
- tst lr,#1
- moveq pc,lr
- .word 0xe12fff1e @ bx lr
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
-
.global OPENSSL_wipe_cpu
.type OPENSSL_wipe_cpu,%function
OPENSSL_wipe_cpu:
mov ar.lc=r3
br.ret.sptk b0 };;
.endp OPENSSL_wipe_cpu#
-
-.global OPENSSL_cleanse#
-.proc OPENSSL_cleanse#
-OPENSSL_cleanse:
-{ .mib; cmp.eq p6,p0=0,r33 // len==0
-#if defined(_HPUX_SOURCE) && !defined(_LP64)
- addp4 r32=0,r32
-#endif
-(p6) br.ret.spnt b0 };;
-{ .mib; and r2=7,r32
- cmp.leu p6,p0=15,r33 // len>=15
-(p6) br.cond.dptk .Lot };;
-
-.Little:
-{ .mib; st1 [r32]=r0,1
- cmp.ltu p6,p7=1,r33 } // len>1
-{ .mbb; add r33=-1,r33 // len--
-(p6) br.cond.dptk .Little
-(p7) br.ret.sptk.many b0 };;
-
-.Lot:
-{ .mib; cmp.eq p6,p0=0,r2
-(p6) br.cond.dptk .Laligned };;
-{ .mmi; st1 [r32]=r0,1;;
- and r2=7,r32 }
-{ .mib; add r33=-1,r33
- br .Lot };;
-
-.Laligned:
-{ .mmi; st8 [r32]=r0,8
- and r2=-8,r33 // len&~7
- add r33=-8,r33 };; // len-=8
-{ .mib; cmp.ltu p6,p0=8,r2 // ((len+8)&~7)>8
-(p6) br.cond.dptk .Laligned };;
-
-{ .mbb; cmp.eq p6,p7=r0,r33
-(p7) br.cond.dpnt .Little
-(p6) br.ret.sptk.many b0 };;
-.endp OPENSSL_cleanse#
.PROCEND
___
{
-my $inp="%r26";
-my $len="%r25";
-
-$code.=<<___;
- .EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
- .ALIGN 8
-OPENSSL_cleanse
- .PROC
- .CALLINFO NO_CALLS
- .ENTRY
- cmpib,*= 0,$len,L\$done
- nop
- cmpib,*>>= 15,$len,L\$ittle
- ldi $SIZE_T-1,%r1
-
-L\$align
- and,*<> $inp,%r1,%r28
- b,n L\$aligned
- stb %r0,0($inp)
- ldo -1($len),$len
- b L\$align
- ldo 1($inp),$inp
-
-L\$aligned
- andcm $len,%r1,%r28
-L\$ot
- $ST %r0,0($inp)
- addib,*<> -$SIZE_T,%r28,L\$ot
- ldo $SIZE_T($inp),$inp
-
- and,*<> $len,%r1,$len
- b,n L\$done
-L\$ittle
- stb %r0,0($inp)
- addib,*<> -1,$len,L\$ittle
- ldo 1($inp),$inp
-L\$done
- bv ($rp)
- .EXIT
- nop
- .PROCEND
-___
-}
-{
my ($out,$cnt,$max)=("%r26","%r25","%r24");
my ($tick,$lasttick)=("%r23","%r22");
my ($diff,$lastdiff)=("%r21","%r20");
blr
.long 0
.byte 0,12,0x14,0,0,0,0,0
-
-.globl .OPENSSL_cleanse
-.align 4
-.OPENSSL_cleanse:
- $CMPLI r4,7
- li r0,0
- bge Lot
- $CMPLI r4,0
- beqlr-
-Little: mtctr r4
- stb r0,0(r3)
- addi r3,r3,1
- bdnz \$-8
- blr
-Lot: andi. r5,r3,3
- beq Laligned
- stb r0,0(r3)
- subi r4,r4,1
- addi r3,r3,1
- b Lot
-Laligned:
- $SHRLI r5,r4,2
- mtctr r5
- stw r0,0(r3)
- addi r3,r3,4
- bdnz \$-8
- andi. r4,r4,3
- bne Little
- blr
- .long 0
- .byte 0,12,0x14,0,0,0,2,0
- .long 0
___
$code =~ s/\`([^\`]*)\`/eval $1/gem;
br %r14
.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
-.globl OPENSSL_cleanse
-.type OPENSSL_cleanse,@function
-.align 16
-OPENSSL_cleanse:
-#if !defined(__s390x__) && !defined(__s390x)
- llgfr %r3,%r3
-#endif
- lghi %r4,15
- lghi %r0,0
- clgr %r3,%r4
- jh .Lot
- clgr %r3,%r0
- bcr 8,%r14
-.Little:
- stc %r0,0(%r2)
- la %r2,1(%r2)
- brctg %r3,.Little
- br %r14
-.align 4
-.Lot: tmll %r2,7
- jz .Laligned
- stc %r0,0(%r2)
- la %r2,1(%r2)
- brctg %r3,.Lot
-.Laligned:
- srlg %r4,%r3,3
-.Loop: stg %r0,0(%r2)
- la %r2,8(%r2)
- brctg %r4,.Loop
- lghi %r4,7
- ngr %r3,%r4
- jnz .Little
- br %r14
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
-
.section .init
brasl %r14,OPENSSL_cpuid_setup
.type _sparcv9_fmadd_probe,#function
.size _sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
-.global OPENSSL_cleanse
-.align 32
-OPENSSL_cleanse:
- cmp %o1,14
- nop
-#ifdef ABI64
- bgu %xcc,.Lot
-#else
- bgu .Lot
-#endif
- cmp %o1,0
- bne .Little
- nop
- retl
- nop
-
-.Little:
- stb %g0,[%o0]
- subcc %o1,1,%o1
- bnz .Little
- add %o0,1,%o0
- retl
- nop
-.align 32
-.Lot:
-#ifndef ABI64
- subcc %g0,1,%g1
- ! see above for explanation
- .word 0x83408000 !rd %ccr,%g1
- cmp %g1,0x99
- bne .v8lot
- nop
-#endif
-
-.v9lot: andcc %o0,7,%g0
- bz .v9aligned
- nop
- stb %g0,[%o0]
- sub %o1,1,%o1
- ba .v9lot
- add %o0,1,%o0
-.align 16,0x01000000
-.v9aligned:
- .word 0xc0720000 !stx %g0,[%o0]
- sub %o1,8,%o1
- andcc %o1,-8,%g0
-#ifdef ABI64
- .word 0x126ffffd !bnz %xcc,.v9aligned
-#else
- .word 0x124ffffd !bnz %icc,.v9aligned
-#endif
- add %o0,8,%o0
-
- cmp %o1,0
- bne .Little
- nop
- retl
- nop
-#ifndef ABI64
-.v8lot: andcc %o0,3,%g0
- bz .v8aligned
- nop
- stb %g0,[%o0]
- sub %o1,1,%o1
- ba .v8lot
- add %o0,1,%o0
- nop
-.v8aligned:
- st %g0,[%o0]
- sub %o1,4,%o1
- andcc %o1,-4,%g0
- bnz .v8aligned
- add %o0,4,%o0
-
- cmp %o1,0
- bne .Little
- nop
- retl
- nop
-#endif
-.type OPENSSL_cleanse,#function
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
-
.section ".init",#alloc,#execinstr
call OPENSSL_cpuid_setup
nop
or %r9,%rax
ret
.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
-
-.globl OPENSSL_cleanse
-.type OPENSSL_cleanse,\@abi-omnipotent
-.align 16
-OPENSSL_cleanse:
- xor %rax,%rax
- cmp \$15,$arg2
- jae .Lot
- cmp \$0,$arg2
- je .Lret
-.Little:
- mov %al,($arg1)
- sub \$1,$arg2
- lea 1($arg1),$arg1
- jnz .Little
-.Lret:
- ret
-.align 16
-.Lot:
- test \$7,$arg1
- jz .Laligned
- mov %al,($arg1)
- lea -1($arg2),$arg2
- lea 1($arg1),$arg1
- jmp .Lot
-.Laligned:
- mov %rax,($arg1)
- lea -8($arg2),$arg2
- test \$-8,$arg2
- lea 8($arg1),$arg1
- jnz .Laligned
- cmp \$0,$arg2
- jne .Little
- ret
-.size OPENSSL_cleanse,.-OPENSSL_cleanse
___
print<<___ if (!$win64);
}
&function_end_B("OPENSSL_indirect_call");
-&function_begin_B("OPENSSL_cleanse");
- &mov ("edx",&wparam(0));
- &mov ("ecx",&wparam(1));
- &xor ("eax","eax");
- &cmp ("ecx",7);
- &jae (&label("lot"));
- &cmp ("ecx",0);
- &je (&label("ret"));
-&set_label("little");
- &mov (&BP(0,"edx"),"al");
- &sub ("ecx",1);
- &lea ("edx",&DWP(1,"edx"));
- &jnz (&label("little"));
-&set_label("ret");
- &ret ();
-
-&set_label("lot",16);
- &test ("edx",3);
- &jz (&label("aligned"));
- &mov (&BP(0,"edx"),"al");
- &lea ("ecx",&DWP(-1,"ecx"));
- &lea ("edx",&DWP(1,"edx"));
- &jmp (&label("lot"));
-&set_label("aligned");
- &mov (&DWP(0,"edx"),"eax");
- &lea ("ecx",&DWP(-4,"ecx"));
- &test ("ecx",-4);
- &lea ("edx",&DWP(4,"edx"));
- &jnz (&label("aligned"));
- &cmp ("ecx",0);
- &jne (&label("little"));
- &ret ();
-&function_end_B("OPENSSL_cleanse");
-
&function_begin_B("OPENSSL_ia32_rdrand");
&mov ("ecx",8);
&set_label("loop");