summaryrefslogtreecommitdiff
path: root/crypto/sparccpuid.S
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2007-05-14 21:35:25 +0000
committerAndy Polyakov <appro@openssl.org>2007-05-14 21:35:25 +0000
commitb2dba9bf1f8f73376b9c1f0904a86996c728b236 (patch)
tree8848a4f5efdf02d841b1ebea4969d879d6e61eb5 /crypto/sparccpuid.S
parent932cc129ee61f5b72636eee6a7c3268e23967f7b (diff)
downloadopenssl-new-b2dba9bf1f8f73376b9c1f0904a86996c728b236.tar.gz
Profiling revealed that OPENSSL_cleanse consumes *more* CPU time than
sha1_block_data_order when hashing short messages. Move OPENSSL_cleanse to "cpuid" assembler module and gain 2x.
Diffstat (limited to 'crypto/sparccpuid.S')
-rw-r--r--crypto/sparccpuid.S48
1 files changed, 48 insertions, 0 deletions
diff --git a/crypto/sparccpuid.S b/crypto/sparccpuid.S
index 52308abca6..f691abc57f 100644
--- a/crypto/sparccpuid.S
+++ b/crypto/sparccpuid.S
@@ -232,6 +232,54 @@ _sparcv9_rdtick:
.type _sparcv9_rdtick,#function
.size _sparcv9_rdtick,.-_sparcv9_rdtick
+.global OPENSSL_cleanse
+.align 32
+OPENSSL_cleanse:
+ cmp %o1,6
+ nop
+#ifdef ABI64
+ bgu %xcc,.Lot
+#else
+ bgu .Lot
+#endif
+ nop
+
+.Little:
+ stb %g0,[%o0]
+ subcc %o1,1,%o1
+ bnz .Little
+ add %o0,1,%o0
+ retl
+ nop
+.align 32
+.Lot:
+ andcc %o0,3,%g0
+ bz .Laligned
+ nop
+ stb %g0,[%o0]
+ sub %o1,1,%o1
+ ba .Lot
+ add %o0,1,%o0
+ nop
+.Laligned:
+ st %g0,[%o0]
+ sub %o1,4,%o1
+ andcc %o1,-4,%g0
+#ifdef ABI64
+ bnz %xcc,.Laligned
+#else
+ bnz .Laligned
+#endif
+ add %o0,4,%o0
+
+ cmp %o1,0
+ bne .Little
+ nop
+ retl
+ nop
+.type OPENSSL_cleanse,#function
+.size OPENSSL_cleanse,.-OPENSSL_cleanse
+
.section ".init",#alloc,#execinstr
call OPENSSL_cpuid_setup
nop