1e1051a39Sopenharmony_ci! Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved.
2e1051a39Sopenharmony_ci!
3e1051a39Sopenharmony_ci! Licensed under the Apache License 2.0 (the "License").  You may not use
4e1051a39Sopenharmony_ci! this file except in compliance with the License.  You can obtain a copy
5e1051a39Sopenharmony_ci! in the file LICENSE in the source distribution or at
6e1051a39Sopenharmony_ci! https://www.openssl.org/source/license.html
7e1051a39Sopenharmony_ci
8e1051a39Sopenharmony_ci#if defined(__SUNPRO_C) && defined(__sparcv9)
9e1051a39Sopenharmony_ci# define ABI64  /* They've said -xarch=v9 at command line */
10e1051a39Sopenharmony_ci#elif defined(__GNUC__) && defined(__arch64__)
11e1051a39Sopenharmony_ci# define ABI64  /* They've said -m64 at command line */
12e1051a39Sopenharmony_ci#endif
13e1051a39Sopenharmony_ci
14e1051a39Sopenharmony_ci#ifdef ABI64
15e1051a39Sopenharmony_ci  .register	%g2,#scratch
16e1051a39Sopenharmony_ci  .register	%g3,#scratch
17e1051a39Sopenharmony_ci# define	FRAME	-192
18e1051a39Sopenharmony_ci# define	BIAS	2047
19e1051a39Sopenharmony_ci#else
20e1051a39Sopenharmony_ci# define	FRAME	-96
21e1051a39Sopenharmony_ci# define	BIAS	0
22e1051a39Sopenharmony_ci#endif
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ci.text
25e1051a39Sopenharmony_ci.align	32
26e1051a39Sopenharmony_ci.global	OPENSSL_wipe_cpu
27e1051a39Sopenharmony_ci.type	OPENSSL_wipe_cpu,#function
28e1051a39Sopenharmony_ci! Keep in mind that this does not excuse us from wiping the stack!
29e1051a39Sopenharmony_ci! This routine wipes registers, but not the backing store [which
30e1051a39Sopenharmony_ci! resides on the stack, toward lower addresses]. To facilitate for
31e1051a39Sopenharmony_ci! stack wiping I return pointer to the top of stack of the *caller*.
32e1051a39Sopenharmony_ciOPENSSL_wipe_cpu:
33e1051a39Sopenharmony_ci	save	%sp,FRAME,%sp
34e1051a39Sopenharmony_ci	nop
35e1051a39Sopenharmony_ci#ifdef __sun
36e1051a39Sopenharmony_ci#include <sys/trap.h>
37e1051a39Sopenharmony_ci	ta	ST_CLEAN_WINDOWS
38e1051a39Sopenharmony_ci#else
39e1051a39Sopenharmony_ci	call	.walk.reg.wins
40e1051a39Sopenharmony_ci#endif
41e1051a39Sopenharmony_ci	nop
42e1051a39Sopenharmony_ci	call	.PIC.zero.up
43e1051a39Sopenharmony_ci	mov	.zero-(.-4),%o0
44e1051a39Sopenharmony_ci	ld	[%o0],%f0
45e1051a39Sopenharmony_ci	ld	[%o0],%f1
46e1051a39Sopenharmony_ci
47e1051a39Sopenharmony_ci	subcc	%g0,1,%o0
48e1051a39Sopenharmony_ci	! Following is V9 "rd %ccr,%o0" instruction. However! V8
49e1051a39Sopenharmony_ci	! specification says that it ("rd %asr2,%o0" in V8 terms) does
50e1051a39Sopenharmony_ci	! not cause illegal_instruction trap. It therefore can be used
51e1051a39Sopenharmony_ci	! to determine if the CPU the code is executing on is V8- or
52e1051a39Sopenharmony_ci	! V9-compliant, as V9 returns a distinct value of 0x99,
53e1051a39Sopenharmony_ci	! "negative" and "borrow" bits set in both %icc and %xcc.
54e1051a39Sopenharmony_ci	.word	0x91408000	!rd	%ccr,%o0
55e1051a39Sopenharmony_ci	cmp	%o0,0x99
56e1051a39Sopenharmony_ci	bne	.v8
57e1051a39Sopenharmony_ci	nop
58e1051a39Sopenharmony_ci			! Even though we do not use %fp register bank,
59e1051a39Sopenharmony_ci			! we wipe it as memcpy might have used it...
60e1051a39Sopenharmony_ci			.word	0xbfa00040	!fmovd	%f0,%f62
61e1051a39Sopenharmony_ci			.word	0xbba00040	!...
62e1051a39Sopenharmony_ci			.word	0xb7a00040
63e1051a39Sopenharmony_ci			.word	0xb3a00040
64e1051a39Sopenharmony_ci			.word	0xafa00040
65e1051a39Sopenharmony_ci			.word	0xaba00040
66e1051a39Sopenharmony_ci			.word	0xa7a00040
67e1051a39Sopenharmony_ci			.word	0xa3a00040
68e1051a39Sopenharmony_ci			.word	0x9fa00040
69e1051a39Sopenharmony_ci			.word	0x9ba00040
70e1051a39Sopenharmony_ci			.word	0x97a00040
71e1051a39Sopenharmony_ci			.word	0x93a00040
72e1051a39Sopenharmony_ci			.word	0x8fa00040
73e1051a39Sopenharmony_ci			.word	0x8ba00040
74e1051a39Sopenharmony_ci			.word	0x87a00040
75e1051a39Sopenharmony_ci			.word	0x83a00040	!fmovd	%f0,%f32
76e1051a39Sopenharmony_ci.v8:			fmovs	%f1,%f31
77e1051a39Sopenharmony_ci	clr	%o0
78e1051a39Sopenharmony_ci			fmovs	%f0,%f30
79e1051a39Sopenharmony_ci	clr	%o1
80e1051a39Sopenharmony_ci			fmovs	%f1,%f29
81e1051a39Sopenharmony_ci	clr	%o2
82e1051a39Sopenharmony_ci			fmovs	%f0,%f28
83e1051a39Sopenharmony_ci	clr	%o3
84e1051a39Sopenharmony_ci			fmovs	%f1,%f27
85e1051a39Sopenharmony_ci	clr	%o4
86e1051a39Sopenharmony_ci			fmovs	%f0,%f26
87e1051a39Sopenharmony_ci	clr	%o5
88e1051a39Sopenharmony_ci			fmovs	%f1,%f25
89e1051a39Sopenharmony_ci	clr	%o7
90e1051a39Sopenharmony_ci			fmovs	%f0,%f24
91e1051a39Sopenharmony_ci	clr	%l0
92e1051a39Sopenharmony_ci			fmovs	%f1,%f23
93e1051a39Sopenharmony_ci	clr	%l1
94e1051a39Sopenharmony_ci			fmovs	%f0,%f22
95e1051a39Sopenharmony_ci	clr	%l2
96e1051a39Sopenharmony_ci			fmovs	%f1,%f21
97e1051a39Sopenharmony_ci	clr	%l3
98e1051a39Sopenharmony_ci			fmovs	%f0,%f20
99e1051a39Sopenharmony_ci	clr	%l4
100e1051a39Sopenharmony_ci			fmovs	%f1,%f19
101e1051a39Sopenharmony_ci	clr	%l5
102e1051a39Sopenharmony_ci			fmovs	%f0,%f18
103e1051a39Sopenharmony_ci	clr	%l6
104e1051a39Sopenharmony_ci			fmovs	%f1,%f17
105e1051a39Sopenharmony_ci	clr	%l7
106e1051a39Sopenharmony_ci			fmovs	%f0,%f16
107e1051a39Sopenharmony_ci	clr	%i0
108e1051a39Sopenharmony_ci			fmovs	%f1,%f15
109e1051a39Sopenharmony_ci	clr	%i1
110e1051a39Sopenharmony_ci			fmovs	%f0,%f14
111e1051a39Sopenharmony_ci	clr	%i2
112e1051a39Sopenharmony_ci			fmovs	%f1,%f13
113e1051a39Sopenharmony_ci	clr	%i3
114e1051a39Sopenharmony_ci			fmovs	%f0,%f12
115e1051a39Sopenharmony_ci	clr	%i4
116e1051a39Sopenharmony_ci			fmovs	%f1,%f11
117e1051a39Sopenharmony_ci	clr	%i5
118e1051a39Sopenharmony_ci			fmovs	%f0,%f10
119e1051a39Sopenharmony_ci	clr	%g1
120e1051a39Sopenharmony_ci			fmovs	%f1,%f9
121e1051a39Sopenharmony_ci	clr	%g2
122e1051a39Sopenharmony_ci			fmovs	%f0,%f8
123e1051a39Sopenharmony_ci	clr	%g3
124e1051a39Sopenharmony_ci			fmovs	%f1,%f7
125e1051a39Sopenharmony_ci	clr	%g4
126e1051a39Sopenharmony_ci			fmovs	%f0,%f6
127e1051a39Sopenharmony_ci	clr	%g5
128e1051a39Sopenharmony_ci			fmovs	%f1,%f5
129e1051a39Sopenharmony_ci			fmovs	%f0,%f4
130e1051a39Sopenharmony_ci			fmovs	%f1,%f3
131e1051a39Sopenharmony_ci			fmovs	%f0,%f2
132e1051a39Sopenharmony_ci
133e1051a39Sopenharmony_ci	add	%fp,BIAS,%i0	! return pointer to caller´s top of stack
134e1051a39Sopenharmony_ci
135e1051a39Sopenharmony_ci	ret
136e1051a39Sopenharmony_ci	restore
137e1051a39Sopenharmony_ci
138e1051a39Sopenharmony_ci.zero:	.long	0x0,0x0
139e1051a39Sopenharmony_ci.PIC.zero.up:
140e1051a39Sopenharmony_ci	retl
141e1051a39Sopenharmony_ci	add	%o0,%o7,%o0
142e1051a39Sopenharmony_ci#ifdef DEBUG
143e1051a39Sopenharmony_ci.global	walk_reg_wins
144e1051a39Sopenharmony_ci.type	walk_reg_wins,#function
145e1051a39Sopenharmony_ciwalk_reg_wins:
146e1051a39Sopenharmony_ci#endif
147e1051a39Sopenharmony_ci.walk.reg.wins:
148e1051a39Sopenharmony_ci	save	%sp,FRAME,%sp
149e1051a39Sopenharmony_ci	cmp	%i7,%o7
150e1051a39Sopenharmony_ci	be	2f
151e1051a39Sopenharmony_ci	clr	%o0
152e1051a39Sopenharmony_ci	cmp	%o7,0	! compiler never cleans %o7...
153e1051a39Sopenharmony_ci	be	1f	! could have been a leaf function...
154e1051a39Sopenharmony_ci	clr	%o1
155e1051a39Sopenharmony_ci	call	.walk.reg.wins
156e1051a39Sopenharmony_ci	nop
157e1051a39Sopenharmony_ci1:	clr	%o2
158e1051a39Sopenharmony_ci	clr	%o3
159e1051a39Sopenharmony_ci	clr	%o4
160e1051a39Sopenharmony_ci	clr	%o5
161e1051a39Sopenharmony_ci	clr	%o7
162e1051a39Sopenharmony_ci	clr	%l0
163e1051a39Sopenharmony_ci	clr	%l1
164e1051a39Sopenharmony_ci	clr	%l2
165e1051a39Sopenharmony_ci	clr	%l3
166e1051a39Sopenharmony_ci	clr	%l4
167e1051a39Sopenharmony_ci	clr	%l5
168e1051a39Sopenharmony_ci	clr	%l6
169e1051a39Sopenharmony_ci	clr	%l7
170e1051a39Sopenharmony_ci	add	%o0,1,%i0	! used for debugging
171e1051a39Sopenharmony_ci2:	ret
172e1051a39Sopenharmony_ci	restore
173e1051a39Sopenharmony_ci.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
174e1051a39Sopenharmony_ci
175e1051a39Sopenharmony_ci.global	OPENSSL_atomic_add
176e1051a39Sopenharmony_ci.type	OPENSSL_atomic_add,#function
177e1051a39Sopenharmony_ci.align	32
178e1051a39Sopenharmony_ciOPENSSL_atomic_add:
179e1051a39Sopenharmony_ci#ifndef ABI64
180e1051a39Sopenharmony_ci	subcc	%g0,1,%o2
181e1051a39Sopenharmony_ci	.word	0x95408000	!rd	%ccr,%o2, see comment above
182e1051a39Sopenharmony_ci	cmp	%o2,0x99
183e1051a39Sopenharmony_ci	be	.v9
184e1051a39Sopenharmony_ci	nop
185e1051a39Sopenharmony_ci	save	%sp,FRAME,%sp
186e1051a39Sopenharmony_ci	ba	.enter
187e1051a39Sopenharmony_ci	nop
188e1051a39Sopenharmony_ci#ifdef __sun
189e1051a39Sopenharmony_ci! Note that you do not have to link with libthread to call thr_yield,
190e1051a39Sopenharmony_ci! as libc provides a stub, which is overloaded the moment you link
191e1051a39Sopenharmony_ci! with *either* libpthread or libthread...
192e1051a39Sopenharmony_ci#define	YIELD_CPU	thr_yield
193e1051a39Sopenharmony_ci#else
194e1051a39Sopenharmony_ci! applies at least to Linux and FreeBSD... Feedback expected...
195e1051a39Sopenharmony_ci#define	YIELD_CPU	sched_yield
196e1051a39Sopenharmony_ci#endif
197e1051a39Sopenharmony_ci.spin:	call	YIELD_CPU
198e1051a39Sopenharmony_ci	nop
199e1051a39Sopenharmony_ci.enter:	ld	[%i0],%i2
200e1051a39Sopenharmony_ci	cmp	%i2,-4096
201e1051a39Sopenharmony_ci	be	.spin
202e1051a39Sopenharmony_ci	mov	-1,%i2
203e1051a39Sopenharmony_ci	swap	[%i0],%i2
204e1051a39Sopenharmony_ci	cmp	%i2,-1
205e1051a39Sopenharmony_ci	be	.spin
206e1051a39Sopenharmony_ci	add	%i2,%i1,%i2
207e1051a39Sopenharmony_ci	stbar
208e1051a39Sopenharmony_ci	st	%i2,[%i0]
209e1051a39Sopenharmony_ci	sra	%i2,%g0,%i0
210e1051a39Sopenharmony_ci	ret
211e1051a39Sopenharmony_ci	restore
212e1051a39Sopenharmony_ci.v9:
213e1051a39Sopenharmony_ci#endif
214e1051a39Sopenharmony_ci	ld	[%o0],%o2
215e1051a39Sopenharmony_ci1:	add	%o1,%o2,%o3
216e1051a39Sopenharmony_ci	.word	0xd7e2100a	!cas [%o0],%o2,%o3, compare [%o0] with %o2 and swap %o3
217e1051a39Sopenharmony_ci	cmp	%o2,%o3
218e1051a39Sopenharmony_ci	bne	1b
219e1051a39Sopenharmony_ci	mov	%o3,%o2		! cas is always fetching to dest. register
220e1051a39Sopenharmony_ci	add	%o1,%o2,%o0	! OpenSSL expects the new value
221e1051a39Sopenharmony_ci	retl
222e1051a39Sopenharmony_ci	sra	%o0,%g0,%o0	! we return signed int, remember?
223e1051a39Sopenharmony_ci.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
224e1051a39Sopenharmony_ci
225e1051a39Sopenharmony_ci.global	_sparcv9_rdtick
226e1051a39Sopenharmony_ci.align	32
227e1051a39Sopenharmony_ci_sparcv9_rdtick:
228e1051a39Sopenharmony_ci	subcc	%g0,1,%o0
229e1051a39Sopenharmony_ci	.word	0x91408000	!rd	%ccr,%o0
230e1051a39Sopenharmony_ci	cmp	%o0,0x99
231e1051a39Sopenharmony_ci	bne	.notick
232e1051a39Sopenharmony_ci	xor	%o0,%o0,%o0
233e1051a39Sopenharmony_ci	.word	0x91410000	!rd	%tick,%o0
234e1051a39Sopenharmony_ci	retl
235e1051a39Sopenharmony_ci	.word	0x93323020	!srlx	%o0,32,%o1
236e1051a39Sopenharmony_ci.notick:
237e1051a39Sopenharmony_ci	retl
238e1051a39Sopenharmony_ci	xor	%o1,%o1,%o1
239e1051a39Sopenharmony_ci.type	_sparcv9_rdtick,#function
240e1051a39Sopenharmony_ci.size	_sparcv9_rdtick,.-_sparcv9_rdtick
241e1051a39Sopenharmony_ci
242e1051a39Sopenharmony_ci.global	_sparcv9_vis1_probe
243e1051a39Sopenharmony_ci.align	8
244e1051a39Sopenharmony_ci_sparcv9_vis1_probe:
245e1051a39Sopenharmony_ci	add	%sp,BIAS+2,%o1
246e1051a39Sopenharmony_ci	.word	0xc19a5a40	!ldda	[%o1]ASI_FP16_P,%f0
247e1051a39Sopenharmony_ci	retl
248e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
249e1051a39Sopenharmony_ci.type	_sparcv9_vis1_probe,#function
250e1051a39Sopenharmony_ci.size	_sparcv9_vis1_probe,.-_sparcv9_vis1_probe
251e1051a39Sopenharmony_ci
252e1051a39Sopenharmony_ci! Probe and instrument VIS1 instruction. Output is number of cycles it
253e1051a39Sopenharmony_ci! takes to execute rdtick and pair of VIS1 instructions. US-Tx VIS unit
254e1051a39Sopenharmony_ci! is slow (documented to be 6 cycles on T2) and the core is in-order
255e1051a39Sopenharmony_ci! single-issue, it should be possible to distinguish Tx reliably...
256e1051a39Sopenharmony_ci! Observed return values are:
257e1051a39Sopenharmony_ci!
258e1051a39Sopenharmony_ci!	UltraSPARC IIe		7
259e1051a39Sopenharmony_ci!	UltraSPARC III		7
260e1051a39Sopenharmony_ci!	UltraSPARC T1		24
261e1051a39Sopenharmony_ci!	SPARC T4		65(*)
262e1051a39Sopenharmony_ci!
263e1051a39Sopenharmony_ci! (*)	result has lesser to do with VIS instruction latencies, rdtick
264e1051a39Sopenharmony_ci!	appears that slow, but it does the trick in sense that FP and
265e1051a39Sopenharmony_ci!	VIS code paths are still slower than integer-only ones.
266e1051a39Sopenharmony_ci!
267e1051a39Sopenharmony_ci! Numbers for T2 and SPARC64 V-VII are more than welcomed.
268e1051a39Sopenharmony_ci!
269e1051a39Sopenharmony_ci! It would be possible to detect specifically US-T1 by instrumenting
270e1051a39Sopenharmony_ci! fmul8ulx16, which is emulated on T1 and as such accounts for quite
271e1051a39Sopenharmony_ci! a lot of %tick-s, couple of thousand on Linux...
272e1051a39Sopenharmony_ci.global	_sparcv9_vis1_instrument
273e1051a39Sopenharmony_ci.align	8
274e1051a39Sopenharmony_ci_sparcv9_vis1_instrument:
275e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
276e1051a39Sopenharmony_ci	.word	0x85b08d82	!fxor	%f2,%f2,%f2
277e1051a39Sopenharmony_ci	.word	0x91410000	!rd	%tick,%o0
278e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
279e1051a39Sopenharmony_ci	.word	0x85b08d82	!fxor	%f2,%f2,%f2
280e1051a39Sopenharmony_ci	.word	0x93410000	!rd	%tick,%o1
281e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
282e1051a39Sopenharmony_ci	.word	0x85b08d82	!fxor	%f2,%f2,%f2
283e1051a39Sopenharmony_ci	.word	0x95410000	!rd	%tick,%o2
284e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
285e1051a39Sopenharmony_ci	.word	0x85b08d82	!fxor	%f2,%f2,%f2
286e1051a39Sopenharmony_ci	.word	0x97410000	!rd	%tick,%o3
287e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
288e1051a39Sopenharmony_ci	.word	0x85b08d82	!fxor	%f2,%f2,%f2
289e1051a39Sopenharmony_ci	.word	0x99410000	!rd	%tick,%o4
290e1051a39Sopenharmony_ci
291e1051a39Sopenharmony_ci	! calculate intervals
292e1051a39Sopenharmony_ci	sub	%o1,%o0,%o0
293e1051a39Sopenharmony_ci	sub	%o2,%o1,%o1
294e1051a39Sopenharmony_ci	sub	%o3,%o2,%o2
295e1051a39Sopenharmony_ci	sub	%o4,%o3,%o3
296e1051a39Sopenharmony_ci
297e1051a39Sopenharmony_ci	! find minimum value
298e1051a39Sopenharmony_ci	cmp	%o0,%o1
299e1051a39Sopenharmony_ci	.word	0x38680002	!bgu,a	%xcc,.+8
300e1051a39Sopenharmony_ci	mov	%o1,%o0
301e1051a39Sopenharmony_ci	cmp	%o0,%o2
302e1051a39Sopenharmony_ci	.word	0x38680002	!bgu,a	%xcc,.+8
303e1051a39Sopenharmony_ci	mov	%o2,%o0
304e1051a39Sopenharmony_ci	cmp	%o0,%o3
305e1051a39Sopenharmony_ci	.word	0x38680002	!bgu,a	%xcc,.+8
306e1051a39Sopenharmony_ci	mov	%o3,%o0
307e1051a39Sopenharmony_ci
308e1051a39Sopenharmony_ci	retl
309e1051a39Sopenharmony_ci	nop
310e1051a39Sopenharmony_ci.type	_sparcv9_vis1_instrument,#function
311e1051a39Sopenharmony_ci.size	_sparcv9_vis1_instrument,.-_sparcv9_vis1_instrument
312e1051a39Sopenharmony_ci
313e1051a39Sopenharmony_ci.global	_sparcv9_vis2_probe
314e1051a39Sopenharmony_ci.align	8
315e1051a39Sopenharmony_ci_sparcv9_vis2_probe:
316e1051a39Sopenharmony_ci	retl
317e1051a39Sopenharmony_ci	.word	0x81b00980	!bshuffle	%f0,%f0,%f0
318e1051a39Sopenharmony_ci.type	_sparcv9_vis2_probe,#function
319e1051a39Sopenharmony_ci.size	_sparcv9_vis2_probe,.-_sparcv9_vis2_probe
320e1051a39Sopenharmony_ci
321e1051a39Sopenharmony_ci.global	_sparcv9_fmadd_probe
322e1051a39Sopenharmony_ci.align	8
323e1051a39Sopenharmony_ci_sparcv9_fmadd_probe:
324e1051a39Sopenharmony_ci	.word	0x81b00d80	!fxor	%f0,%f0,%f0
325e1051a39Sopenharmony_ci	.word	0x85b08d82	!fxor	%f2,%f2,%f2
326e1051a39Sopenharmony_ci	retl
327e1051a39Sopenharmony_ci	.word	0x81b80440	!fmaddd	%f0,%f0,%f2,%f0
328e1051a39Sopenharmony_ci.type	_sparcv9_fmadd_probe,#function
329e1051a39Sopenharmony_ci.size	_sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
330e1051a39Sopenharmony_ci
331e1051a39Sopenharmony_ci.global	_sparcv9_rdcfr
332e1051a39Sopenharmony_ci.align	8
333e1051a39Sopenharmony_ci_sparcv9_rdcfr:
334e1051a39Sopenharmony_ci	retl
335e1051a39Sopenharmony_ci	.word	0x91468000	!rd	%asr26,%o0
336e1051a39Sopenharmony_ci.type	_sparcv9_rdcfr,#function
337e1051a39Sopenharmony_ci.size	_sparcv9_rdcfr,.-_sparcv9_rdcfr
338e1051a39Sopenharmony_ci
339e1051a39Sopenharmony_ci.global	_sparcv9_vis3_probe
340e1051a39Sopenharmony_ci.align	8
341e1051a39Sopenharmony_ci_sparcv9_vis3_probe:
342e1051a39Sopenharmony_ci	retl
343e1051a39Sopenharmony_ci	.word	0x81b022a0	!xmulx	%g0,%g0,%g0
344e1051a39Sopenharmony_ci.type	_sparcv9_vis3_probe,#function
345e1051a39Sopenharmony_ci.size	_sparcv9_vis3_probe,.-_sparcv9_vis3_probe
346e1051a39Sopenharmony_ci
347e1051a39Sopenharmony_ci.global	_sparcv9_random
348e1051a39Sopenharmony_ci.align	8
349e1051a39Sopenharmony_ci_sparcv9_random:
350e1051a39Sopenharmony_ci	retl
351e1051a39Sopenharmony_ci	.word	0x91b002a0	!random	%o0
352e1051a39Sopenharmony_ci.type	_sparcv9_random,#function
353e1051a39Sopenharmony_ci.size	_sparcv9_random,.-_sparcv9_vis3_probe
354e1051a39Sopenharmony_ci
355e1051a39Sopenharmony_ci.global	_sparcv9_fjaesx_probe
356e1051a39Sopenharmony_ci.align	8
357e1051a39Sopenharmony_ci_sparcv9_fjaesx_probe:
358e1051a39Sopenharmony_ci	.word	0x81b09206	!faesencx %f2,%f6,%f0
359e1051a39Sopenharmony_ci	retl
360e1051a39Sopenharmony_ci	nop
361e1051a39Sopenharmony_ci.size	_sparcv9_fjaesx_probe,.-_sparcv9_fjaesx_probe
362e1051a39Sopenharmony_ci
363e1051a39Sopenharmony_ci.global	OPENSSL_cleanse
364e1051a39Sopenharmony_ci.align	32
365e1051a39Sopenharmony_ciOPENSSL_cleanse:
366e1051a39Sopenharmony_ci	cmp	%o1,14
367e1051a39Sopenharmony_ci	nop
368e1051a39Sopenharmony_ci#ifdef ABI64
369e1051a39Sopenharmony_ci	bgu	%xcc,.Lot
370e1051a39Sopenharmony_ci#else
371e1051a39Sopenharmony_ci	bgu	.Lot
372e1051a39Sopenharmony_ci#endif
373e1051a39Sopenharmony_ci	cmp	%o1,0
374e1051a39Sopenharmony_ci	bne	.Little
375e1051a39Sopenharmony_ci	nop
376e1051a39Sopenharmony_ci	retl
377e1051a39Sopenharmony_ci	nop
378e1051a39Sopenharmony_ci
379e1051a39Sopenharmony_ci.Little:
380e1051a39Sopenharmony_ci	stb	%g0,[%o0]
381e1051a39Sopenharmony_ci	subcc	%o1,1,%o1
382e1051a39Sopenharmony_ci	bnz	.Little
383e1051a39Sopenharmony_ci	add	%o0,1,%o0
384e1051a39Sopenharmony_ci	retl
385e1051a39Sopenharmony_ci	nop
386e1051a39Sopenharmony_ci.align	32
387e1051a39Sopenharmony_ci.Lot:
388e1051a39Sopenharmony_ci#ifndef ABI64
389e1051a39Sopenharmony_ci	subcc	%g0,1,%g1
390e1051a39Sopenharmony_ci	! see above for explanation
391e1051a39Sopenharmony_ci	.word	0x83408000	!rd	%ccr,%g1
392e1051a39Sopenharmony_ci	cmp	%g1,0x99
393e1051a39Sopenharmony_ci	bne	.v8lot
394e1051a39Sopenharmony_ci	nop
395e1051a39Sopenharmony_ci#endif
396e1051a39Sopenharmony_ci
397e1051a39Sopenharmony_ci.v9lot:	andcc	%o0,7,%g0
398e1051a39Sopenharmony_ci	bz	.v9aligned
399e1051a39Sopenharmony_ci	nop
400e1051a39Sopenharmony_ci	stb	%g0,[%o0]
401e1051a39Sopenharmony_ci	sub	%o1,1,%o1
402e1051a39Sopenharmony_ci	ba	.v9lot
403e1051a39Sopenharmony_ci	add	%o0,1,%o0
404e1051a39Sopenharmony_ci.align	16,0x01000000
405e1051a39Sopenharmony_ci.v9aligned:
406e1051a39Sopenharmony_ci	.word	0xc0720000	!stx	%g0,[%o0]
407e1051a39Sopenharmony_ci	sub	%o1,8,%o1
408e1051a39Sopenharmony_ci	andcc	%o1,-8,%g0
409e1051a39Sopenharmony_ci#ifdef ABI64
410e1051a39Sopenharmony_ci	.word	0x126ffffd	!bnz	%xcc,.v9aligned
411e1051a39Sopenharmony_ci#else
412e1051a39Sopenharmony_ci	.word	0x124ffffd	!bnz	%icc,.v9aligned
413e1051a39Sopenharmony_ci#endif
414e1051a39Sopenharmony_ci	add	%o0,8,%o0
415e1051a39Sopenharmony_ci
416e1051a39Sopenharmony_ci	cmp	%o1,0
417e1051a39Sopenharmony_ci	bne	.Little
418e1051a39Sopenharmony_ci	nop
419e1051a39Sopenharmony_ci	retl
420e1051a39Sopenharmony_ci	nop
421e1051a39Sopenharmony_ci#ifndef ABI64
422e1051a39Sopenharmony_ci.v8lot:	andcc	%o0,3,%g0
423e1051a39Sopenharmony_ci	bz	.v8aligned
424e1051a39Sopenharmony_ci	nop
425e1051a39Sopenharmony_ci	stb	%g0,[%o0]
426e1051a39Sopenharmony_ci	sub	%o1,1,%o1
427e1051a39Sopenharmony_ci	ba	.v8lot
428e1051a39Sopenharmony_ci	add	%o0,1,%o0
429e1051a39Sopenharmony_ci	nop
430e1051a39Sopenharmony_ci.v8aligned:
431e1051a39Sopenharmony_ci	st	%g0,[%o0]
432e1051a39Sopenharmony_ci	sub	%o1,4,%o1
433e1051a39Sopenharmony_ci	andcc	%o1,-4,%g0
434e1051a39Sopenharmony_ci	bnz	.v8aligned
435e1051a39Sopenharmony_ci	add	%o0,4,%o0
436e1051a39Sopenharmony_ci
437e1051a39Sopenharmony_ci	cmp	%o1,0
438e1051a39Sopenharmony_ci	bne	.Little
439e1051a39Sopenharmony_ci	nop
440e1051a39Sopenharmony_ci	retl
441e1051a39Sopenharmony_ci	nop
442e1051a39Sopenharmony_ci#endif
443e1051a39Sopenharmony_ci.type	OPENSSL_cleanse,#function
444e1051a39Sopenharmony_ci.size	OPENSSL_cleanse,.-OPENSSL_cleanse
445e1051a39Sopenharmony_ci
446e1051a39Sopenharmony_ci.global	CRYPTO_memcmp
447e1051a39Sopenharmony_ci.align	16
448e1051a39Sopenharmony_ciCRYPTO_memcmp:
449e1051a39Sopenharmony_ci	cmp	%o2,0
450e1051a39Sopenharmony_ci#ifdef ABI64
451e1051a39Sopenharmony_ci	beq,pn	%xcc,.Lno_data
452e1051a39Sopenharmony_ci#else
453e1051a39Sopenharmony_ci	beq	.Lno_data
454e1051a39Sopenharmony_ci#endif
455e1051a39Sopenharmony_ci	xor	%g1,%g1,%g1
456e1051a39Sopenharmony_ci	nop
457e1051a39Sopenharmony_ci
458e1051a39Sopenharmony_ci.Loop_cmp:
459e1051a39Sopenharmony_ci	ldub	[%o0],%o3
460e1051a39Sopenharmony_ci	add	%o0,1,%o0
461e1051a39Sopenharmony_ci	ldub	[%o1],%o4
462e1051a39Sopenharmony_ci	add	%o1,1,%o1
463e1051a39Sopenharmony_ci	subcc	%o2,1,%o2
464e1051a39Sopenharmony_ci	xor	%o3,%o4,%o4
465e1051a39Sopenharmony_ci#ifdef ABI64
466e1051a39Sopenharmony_ci	bnz	%xcc,.Loop_cmp
467e1051a39Sopenharmony_ci#else
468e1051a39Sopenharmony_ci	bnz	.Loop_cmp
469e1051a39Sopenharmony_ci#endif
470e1051a39Sopenharmony_ci	or	%o4,%g1,%g1
471e1051a39Sopenharmony_ci
472e1051a39Sopenharmony_ci	sub	%g0,%g1,%g1
473e1051a39Sopenharmony_ci	srl	%g1,31,%g1
474e1051a39Sopenharmony_ci.Lno_data:
475e1051a39Sopenharmony_ci	retl
476e1051a39Sopenharmony_ci	mov	%g1,%o0
477e1051a39Sopenharmony_ci.type	CRYPTO_memcmp,#function
478e1051a39Sopenharmony_ci.size	CRYPTO_memcmp,.-CRYPTO_memcmp
479e1051a39Sopenharmony_ci
480e1051a39Sopenharmony_ci.global	_sparcv9_vis1_instrument_bus
481e1051a39Sopenharmony_ci.align	8
482e1051a39Sopenharmony_ci_sparcv9_vis1_instrument_bus:
483e1051a39Sopenharmony_ci	mov	%o1,%o3					! save cnt
484e1051a39Sopenharmony_ci	.word	0x99410000	!rd	%tick,%o4	! tick
485e1051a39Sopenharmony_ci	mov	%o4,%o5					! lasttick = tick
486e1051a39Sopenharmony_ci	set	0,%g4					! diff
487e1051a39Sopenharmony_ci
488e1051a39Sopenharmony_ci	andn	%o0,63,%g1
489e1051a39Sopenharmony_ci	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
490e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
491e1051a39Sopenharmony_ci	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
492e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
493e1051a39Sopenharmony_ci	ld	[%o0],%o4
494e1051a39Sopenharmony_ci	add	%o4,%g4,%g4
495e1051a39Sopenharmony_ci	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
496e1051a39Sopenharmony_ci
497e1051a39Sopenharmony_ci.Loop:	.word	0x99410000	!rd	%tick,%o4
498e1051a39Sopenharmony_ci	sub	%o4,%o5,%g4				! diff=tick-lasttick
499e1051a39Sopenharmony_ci	mov	%o4,%o5					! lasttick=tick
500e1051a39Sopenharmony_ci
501e1051a39Sopenharmony_ci	andn	%o0,63,%g1
502e1051a39Sopenharmony_ci	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
503e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
504e1051a39Sopenharmony_ci	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
505e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
506e1051a39Sopenharmony_ci	ld	[%o0],%o4
507e1051a39Sopenharmony_ci	add	%o4,%g4,%g4
508e1051a39Sopenharmony_ci	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
509e1051a39Sopenharmony_ci	subcc	%o1,1,%o1				! --$cnt
510e1051a39Sopenharmony_ci	bnz	.Loop
511e1051a39Sopenharmony_ci	add	%o0,4,%o0				! ++$out
512e1051a39Sopenharmony_ci
513e1051a39Sopenharmony_ci	retl
514e1051a39Sopenharmony_ci	mov	%o3,%o0
515e1051a39Sopenharmony_ci.type	_sparcv9_vis1_instrument_bus,#function
516e1051a39Sopenharmony_ci.size	_sparcv9_vis1_instrument_bus,.-_sparcv9_vis1_instrument_bus
517e1051a39Sopenharmony_ci
518e1051a39Sopenharmony_ci.global	_sparcv9_vis1_instrument_bus2
519e1051a39Sopenharmony_ci.align	8
520e1051a39Sopenharmony_ci_sparcv9_vis1_instrument_bus2:
521e1051a39Sopenharmony_ci	mov	%o1,%o3					! save cnt
522e1051a39Sopenharmony_ci	sll	%o1,2,%o1				! cnt*=4
523e1051a39Sopenharmony_ci
524e1051a39Sopenharmony_ci	.word	0x99410000	!rd	%tick,%o4	! tick
525e1051a39Sopenharmony_ci	mov	%o4,%o5					! lasttick = tick
526e1051a39Sopenharmony_ci	set	0,%g4					! diff
527e1051a39Sopenharmony_ci
528e1051a39Sopenharmony_ci	andn	%o0,63,%g1
529e1051a39Sopenharmony_ci	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
530e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
531e1051a39Sopenharmony_ci	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
532e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
533e1051a39Sopenharmony_ci	ld	[%o0],%o4
534e1051a39Sopenharmony_ci	add	%o4,%g4,%g4
535e1051a39Sopenharmony_ci	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
536e1051a39Sopenharmony_ci
537e1051a39Sopenharmony_ci	.word	0x99410000	!rd	%tick,%o4	! tick
538e1051a39Sopenharmony_ci	sub	%o4,%o5,%g4				! diff=tick-lasttick
539e1051a39Sopenharmony_ci	mov	%o4,%o5					! lasttick=tick
540e1051a39Sopenharmony_ci	mov	%g4,%g5					! lastdiff=diff
541e1051a39Sopenharmony_ci.Loop2:
542e1051a39Sopenharmony_ci	andn	%o0,63,%g1
543e1051a39Sopenharmony_ci	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
544e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
545e1051a39Sopenharmony_ci	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
546e1051a39Sopenharmony_ci	.word	0x8143e040	!membar	#Sync
547e1051a39Sopenharmony_ci	ld	[%o0],%o4
548e1051a39Sopenharmony_ci	add	%o4,%g4,%g4
549e1051a39Sopenharmony_ci	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
550e1051a39Sopenharmony_ci
551e1051a39Sopenharmony_ci	subcc	%o2,1,%o2				! --max
552e1051a39Sopenharmony_ci	bz	.Ldone2
553e1051a39Sopenharmony_ci	nop
554e1051a39Sopenharmony_ci
555e1051a39Sopenharmony_ci	.word	0x99410000	!rd	%tick,%o4	! tick
556e1051a39Sopenharmony_ci	sub	%o4,%o5,%g4				! diff=tick-lasttick
557e1051a39Sopenharmony_ci	mov	%o4,%o5					! lasttick=tick
558e1051a39Sopenharmony_ci	cmp	%g4,%g5
559e1051a39Sopenharmony_ci	mov	%g4,%g5					! lastdiff=diff
560e1051a39Sopenharmony_ci
561e1051a39Sopenharmony_ci	.word	0x83408000	!rd	%ccr,%g1
562e1051a39Sopenharmony_ci	and	%g1,4,%g1				! isolate zero flag
563e1051a39Sopenharmony_ci	xor	%g1,4,%g1				! flip zero flag
564e1051a39Sopenharmony_ci
565e1051a39Sopenharmony_ci	subcc	%o1,%g1,%o1				! conditional --$cnt
566e1051a39Sopenharmony_ci	bnz	.Loop2
567e1051a39Sopenharmony_ci	add	%o0,%g1,%o0				! conditional ++$out
568e1051a39Sopenharmony_ci
569e1051a39Sopenharmony_ci.Ldone2:
570e1051a39Sopenharmony_ci	srl	%o1,2,%o1
571e1051a39Sopenharmony_ci	retl
572e1051a39Sopenharmony_ci	sub	%o3,%o1,%o0
573e1051a39Sopenharmony_ci.type	_sparcv9_vis1_instrument_bus2,#function
574e1051a39Sopenharmony_ci.size	_sparcv9_vis1_instrument_bus2,.-_sparcv9_vis1_instrument_bus2
575e1051a39Sopenharmony_ci
576e1051a39Sopenharmony_ci.section	".init",#alloc,#execinstr
577e1051a39Sopenharmony_ci	call	OPENSSL_cpuid_setup
578e1051a39Sopenharmony_ci	nop
579