Update dependencies.
[openssl.git] / crypto / ia64cpuid.S
1 // Works on all IA-64 platforms: Linux, HP-UX, Win64i...
2 // On Win64i compile with ias.exe.
3 .text
4 .global OPENSSL_cpuid_setup#
5 .proc   OPENSSL_cpuid_setup#
6 OPENSSL_cpuid_setup:
7 { .mib; br.ret.sptk.many        b0              };;
8 .endp   OPENSSL_cpuid_setup#
9 .global OPENSSL_rdtsc#
10 .proc   OPENSSL_rdtsc#
11 OPENSSL_rdtsc:
12 { .mib; mov                     r8=ar.itc
13         br.ret.sptk.many        b0              };;
14 .endp   OPENSSL_rdtsc#
15
16 .global OPENSSL_atomic_add#
17 .proc   OPENSSL_atomic_add#
18 .align  32
19 OPENSSL_atomic_add:
20 { .mii; ld4             r2=[r32]
21         nop.i           0
22         nop.i           0               };;
23 .Lspin:
24 { .mii; mov             ar.ccv=r2
25         add             r8=r2,r33
26         mov             r3=r2           };;
27 { .mmi; mf
28         cmpxchg4.acq    r2=[r32],r8,ar.ccv
29         nop.i           0               };;
30 { .mib; cmp.ne          p6,p0=r2,r3
31         nop.i           0
32 (p6)    br.dpnt         .Lspin          };;
33 { .mib; nop.m           0
34         sxt4            r8=r8
35         br.ret.sptk.many        b0      };;
36 .endp   OPENSSL_atomic_add#
37
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
44 // context...
45 .global OPENSSL_wipe_cpu#
46 .proc   OPENSSL_wipe_cpu#
47 .align  32
48 OPENSSL_wipe_cpu:
49         .prologue
50         .fframe 0
51         .save   ar.pfs,r2
52         .save   ar.lc,r3
53 { .mib; alloc           r2=ar.pfs,0,96,0,96
54         mov             r3=ar.lc
55         brp.loop.imp    .L_wipe_top,.L_wipe_end-16
56                                         };;
57 { .mii; mov             r9=ar.bsp
58         mov             r8=pr
59         mov             ar.lc=96        };;
60         .body
61 { .mii; add             r9=96*8-8,r9
62         mov             ar.ec=1         };;
63
64 // One can sweep double as fast, but then we can't quarantee
65 // that backing storage is wiped...
66 .L_wipe_top:
67 { .mfi; st8             [r9]=r0,-8
68         mov             f127=f0
69         mov             r127=r0         }
70 { .mfb; nop.m           0
71         nop.f           0
72         br.ctop.sptk    .L_wipe_top     };;
73 .L_wipe_end:
74
75 { .mfi; mov             r11=r0
76         mov             f6=f0
77         mov             r14=r0          }
78 { .mfi; mov             r15=r0
79         mov             f7=f0
80         mov             r16=r0          }
81 { .mfi; mov             r17=r0
82         mov             f8=f0
83         mov             r18=r0          }
84 { .mfi; mov             r19=r0
85         mov             f9=f0
86         mov             r20=r0          }
87 { .mfi; mov             r21=r0
88         mov             f10=f0
89         mov             r22=r0          }
90 { .mfi; mov             r23=r0
91         mov             f11=f0
92         mov             r24=r0          }
93 { .mfi; mov             r25=r0
94         mov             f12=f0
95         mov             r26=r0          }
96 { .mfi; mov             r27=r0
97         mov             f13=f0
98         mov             r28=r0          }
99 { .mfi; mov             r29=r0
100         mov             f14=f0
101         mov             r30=r0          }
102 { .mfi; mov             r31=r0
103         mov             f15=f0
104         nop.i           0               }
105 { .mfi; mov             f16=f0          }
106 { .mfi; mov             f17=f0          }
107 { .mfi; mov             f18=f0          }
108 { .mfi; mov             f19=f0          }
109 { .mfi; mov             f20=f0          }
110 { .mfi; mov             f21=f0          }
111 { .mfi; mov             f22=f0          }
112 { .mfi; mov             f23=f0          }
113 { .mfi; mov             f24=f0          }
114 { .mfi; mov             f25=f0          }
115 { .mfi; mov             f26=f0          }
116 { .mfi; mov             f27=f0          }
117 { .mfi; mov             f28=f0          }
118 { .mfi; mov             f29=f0          }
119 { .mfi; mov             f30=f0          }
120 { .mfi; add             r9=96*8+8,r9
121         mov             f31=f0
122         mov             pr=r8,0x1ffff   }
123 { .mib; mov             r8=sp
124         mov             ar.lc=r3
125         br.ret.sptk     b0              };;
126 .endp   OPENSSL_wipe_cpu#