Index: openssl/crypto/ia64cpuid.S |
=================================================================== |
--- openssl/crypto/ia64cpuid.S (revision 105093) |
+++ openssl/crypto/ia64cpuid.S (working copy) |
@@ -1,6 +1,13 @@ |
// Works on all IA-64 platforms: Linux, HP-UX, Win64i... |
// On Win64i compile with ias.exe. |
.text |
+ |
+.global OPENSSL_cpuid_setup# |
+.proc OPENSSL_cpuid_setup# |
+OPENSSL_cpuid_setup: |
+{ .mib; br.ret.sptk.many b0 };; |
+.endp OPENSSL_cpuid_setup# |
+ |
.global OPENSSL_rdtsc# |
.proc OPENSSL_rdtsc# |
OPENSSL_rdtsc: |
@@ -119,3 +126,42 @@ |
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# |