1 // Works on all IA-64 platforms: Linux, HP-UX, Win64i...
2 // On Win64i compile with ias.exe.
8 br.ret.sptk.many b0 };;
11 .global OPENSSL_atomic_add#
12 .proc OPENSSL_atomic_add#
23 cmpxchg4.acq r2=[r32],r8,ar.ccv
25 { .mib; cmp.ne p6,p0=r2,r3
27 (p6) br.dpnt .Lspin };;
30 br.ret.sptk.many b0 };;
31 .endp OPENSSL_atomic_add#
33 // Returns a structure comprising pointer to the top of stack of
34 // the caller and pointer beyond backing storage for the current
35 // register frame. The latter is required, because it might be
36 // insufficient to wipe backing storage for the current frame
37 // (as this procedure does), one might have to go further, toward
38 // higher addresses to reach for whole "retroactively" saved
40 .global OPENSSL_wipe_cpu#
41 .proc OPENSSL_wipe_cpu#
48 { .mib; alloc r2=ar.pfs,0,96,0,96
50 brp.loop.imp .L_wipe_top,.L_wipe_end-16
56 { .mii; add r9=96*8-8,r9
59 // One can sweep double as fast, but then we can't quarantee
60 // that backing storage is wiped...
62 { .mfi; st8 [r9]=r0,-8
67 br.ctop.sptk .L_wipe_top };;
115 { .mfi; add r9=96*8+8,r9
121 .endp OPENSSL_wipe_cpu#