1 // Works on all IA-64 platforms: Linux, HP-UX, Win64i...
2 // On Win64i compile with ias.exe.
4 .global OPENSSL_cpuid_setup#
5 .proc OPENSSL_cpuid_setup#
7 { .mib; br.ret.sptk.many b0 };;
8 .endp OPENSSL_cpuid_setup#
13 br.ret.sptk.many b0 };;
16 .global OPENSSL_atomic_add#
17 .proc OPENSSL_atomic_add#
28 cmpxchg4.acq r2=[r32],r8,ar.ccv
30 { .mib; cmp.ne p6,p0=r2,r3
32 (p6) br.dpnt .Lspin };;
35 br.ret.sptk.many b0 };;
36 .endp OPENSSL_atomic_add#
38 // Returns a structure comprising pointer to the top of stack of
39 // the caller and pointer beyond backing storage for the current
40 // register frame. The latter is required, because it might be
41 // insufficient to wipe backing storage for the current frame
42 // (as this procedure does), one might have to go further, toward
43 // higher addresses to reach for whole "retroactively" saved
45 .global OPENSSL_wipe_cpu#
46 .proc OPENSSL_wipe_cpu#
53 { .mib; alloc r2=ar.pfs,0,96,0,96
55 brp.loop.imp .L_wipe_top,.L_wipe_end-16
61 { .mii; add r9=96*8-8,r9
64 // One can sweep double as fast, but then we can't quarantee
65 // that backing storage is wiped...
67 { .mfi; st8 [r9]=r0,-8
72 br.ctop.sptk .L_wipe_top };;
120 { .mfi; add r9=96*8+8,r9
126 .endp OPENSSL_wipe_cpu#