X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fia64cpuid.S;h=ffd6d6ca6f1388df1c9f239bcbefd4b030c14d38;hp=818e2d1e1d537fb3484ed14f535d8087a05ea9a5;hb=e92947d8d93e3623ae9185920f991c3e4d65f77a;hpb=b2dba9bf1f8f73376b9c1f0904a86996c728b236 diff --git a/crypto/ia64cpuid.S b/crypto/ia64cpuid.S index 818e2d1e1d..ffd6d6ca6f 100644 --- a/crypto/ia64cpuid.S +++ b/crypto/ia64cpuid.S @@ -1,7 +1,19 @@ +// Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved. +// +// Licensed under the OpenSSL license (the "License"). You may not use +// this file except in compliance with the License. You can obtain a copy +// in the file LICENSE in the source distribution or at +// https://www.openssl.org/source/license.html // Works on all IA-64 platforms: Linux, HP-UX, Win64i... // On Win64i compile with ias.exe. .text +#if defined(_HPUX_SOURCE) && !defined(_LP64) +#define ADDP addp4 +#else +#define ADDP add +#endif + .global OPENSSL_cpuid_setup# .proc OPENSSL_cpuid_setup# OPENSSL_cpuid_setup: @@ -26,7 +38,7 @@ OPENSSL_atomic_add: { .mii; mov ar.ccv=r2 add r8=r2,r33 mov r3=r2 };; -{ .mmi; mf +{ .mmi; mf;; cmpxchg4.acq r2=[r32],r8,ar.ccv nop.i 0 };; { .mib; cmp.ne p6,p0=r2,r3 @@ -130,6 +142,9 @@ OPENSSL_wipe_cpu: .global OPENSSL_cleanse# .proc OPENSSL_cleanse# OPENSSL_cleanse: +{ .mib; cmp.eq p6,p0=0,r33 // len==0 + ADDP r32=0,r32 +(p6) br.ret.spnt b0 };; { .mib; and r2=7,r32 cmp.leu p6,p0=15,r33 // len>=15 (p6) br.cond.dptk .Lot };; @@ -160,3 +175,123 @@ OPENSSL_cleanse: (p7) br.cond.dpnt .Little (p6) br.ret.sptk.many b0 };; .endp OPENSSL_cleanse# + +.global CRYPTO_memcmp# +.proc CRYPTO_memcmp# +.align 32 +.skip 16 +CRYPTO_memcmp: + .prologue +{ .mib; mov r8=0 + cmp.eq p6,p0=0,r34 // len==0? +(p6) br.ret.spnt b0 };; + .save ar.pfs,r2 +{ .mib; alloc r2=ar.pfs,3,5,0,8 + .save ar.lc,r3 + mov r3=ar.lc + brp.loop.imp .Loop_cmp_ctop,.Loop_cmp_cend-16 + } +{ .mib; sub r10=r34,r0,1 + .save pr,r9 + mov r9=pr };; +{ .mii; ADDP r16=0,r32 + mov ar.lc=r10 + mov ar.ec=4 } +{ .mib; ADDP r17=0,r33 + mov pr.rot=1<<16 };; + +.Loop_cmp_ctop: +{ .mib; (p16) ld1 r32=[r16],1 + (p18) xor r34=r34,r38 } +{ .mib; (p16) ld1 r36=[r17],1 + (p19) or r8=r8,r35 + br.ctop.sptk .Loop_cmp_ctop };; +.Loop_cmp_cend: + +{ .mib; cmp.ne p6,p0=0,r8 + mov ar.lc=r3 };; +{ .mib; +(p6) mov r8=1 + mov pr=r9,0x1ffff + br.ret.sptk.many b0 };; +.endp CRYPTO_memcmp# + +.global OPENSSL_instrument_bus# +.proc OPENSSL_instrument_bus# +OPENSSL_instrument_bus: +{ .mmi; mov r2=r33 + ADDP r32=0,r32 } +{ .mmi; mov r8=ar.itc;; + mov r10=r0 + mov r9=r8 };; + +{ .mmi; fc r32;; + ld4 r8=[r32] };; +{ .mmi; mf + mov ar.ccv=r8 + add r8=r8,r10 };; +{ .mmi; cmpxchg4.acq r3=[r32],r8,ar.ccv + };; +.Loop: +{ .mmi; mov r8=ar.itc;; + sub r10=r8,r9 // diff=tick-lasttick + mov r9=r8 };; // lasttick=tick +{ .mmi; fc r32;; + ld4 r8=[r32] };; +{ .mmi; mf + mov ar.ccv=r8 + add r8=r8,r10 };; +{ .mmi; cmpxchg4.acq r3=[r32],r8,ar.ccv + add r33=-1,r33 + add r32=4,r32 };; +{ .mib; cmp4.ne p6,p0=0,r33 +(p6) br.cond.dptk .Loop };; + +{ .mib; sub r8=r2,r33 + br.ret.sptk.many b0 };; +.endp OPENSSL_instrument_bus# + +.global OPENSSL_instrument_bus2# +.proc OPENSSL_instrument_bus2# +OPENSSL_instrument_bus2: +{ .mmi; mov r2=r33 // put aside cnt + ADDP r32=0,r32 } +{ .mmi; mov r8=ar.itc;; + mov r10=r0 + mov r9=r8 };; + +{ .mmi; fc r32;; + ld4 r8=[r32] };; +{ .mmi; mf + mov ar.ccv=r8 + add r8=r8,r10 };; +{ .mmi; cmpxchg4.acq r3=[r32],r8,ar.ccv + };; + +{ .mmi; mov r8=ar.itc;; + sub r10=r8,r9 + mov r9=r8 };; +.Loop2: +{ .mmi; mov r11=r10 // lastdiff=diff + add r34=-1,r34 };; // --max +{ .mmi; fc r32;; + ld4 r8=[r32] + cmp4.eq p6,p0=0,r34 };; +{ .mmi; mf + mov ar.ccv=r8 + add r8=r8,r10 };; +{ .mmb; cmpxchg4.acq r3=[r32],r8,ar.ccv +(p6) br.cond.spnt .Ldone2 };; + +{ .mmi; mov r8=ar.itc;; + sub r10=r8,r9 // diff=tick-lasttick + mov r9=r8 };; // lasttick=tick +{ .mmi; cmp.ne p6,p0=r10,r11;; // diff!=lastdiff +(p6) add r33=-1,r33 };; // conditional --cnt +{ .mib; cmp4.ne p7,p0=0,r33 +(p6) add r32=4,r32 // conditional ++out +(p7) br.cond.dptk .Loop2 };; +.Ldone2: +{ .mib; sub r8=r2,r33 + br.ret.sptk.many b0 };; +.endp OPENSSL_instrument_bus2#