1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(__SUNPRO_C) && defined(__sparcv9)
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define ABI64  /* They've said -xarch=v9 at command line */
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(__GNUC__) && defined(__arch64__)
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define ABI64  /* They've said -m64 at command line */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef ABI64
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  .register	%g2,#scratch
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  .register	%g3,#scratch
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define	FRAME	-192
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define	BIAS	2047
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define	FRAME	-96
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define	BIAS	0
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.text
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	32
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	OPENSSL_wipe_cpu
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	OPENSSL_wipe_cpu,#function
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! Keep in mind that this does not excuse us from wiping the stack!
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! This routine wipes registers, but not the backing store [which
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! resides on the stack, toward lower addresses]. To facilitate for
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! stack wiping I return pointer to the top of stack of the *caller*.
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_wipe_cpu:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	save	%sp,FRAME,%sp
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef __sun
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/trap.h>
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ta	ST_CLEAN_WINDOWS
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	call	.walk.reg.wins
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	call	.PIC.zero.up
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	.zero-(.-4),%o0
37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ld	[%o0],%f0
38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ld	[%o0],%f1
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	subcc	%g0,1,%o0
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	! Following is V9 "rd %ccr,%o0" instruction. However! V8
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	! specification says that it ("rd %asr2,%o0" in V8 terms) does
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	! not cause illegal_instruction trap. It therefore can be used
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	! to determine if the CPU the code is executing on is V8- or
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	! V9-compliant, as V9 returns a distinct value of 0x99,
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	! "negative" and "borrow" bits set in both %icc and %xcc.
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.word	0x91408000	!rd	%ccr,%o0
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%o0,0x99
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bne	.v8
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			! Even though we do not use %fp register bank,
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			! we wipe it as memcpy might have used it...
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xbfa00040	!fmovd	%f0,%f62
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xbba00040	!...
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xb7a00040
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xb3a00040
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xafa00040
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xaba00040
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xa7a00040
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0xa3a00040
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x9fa00040
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x9ba00040
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x97a00040
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x93a00040
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x8fa00040
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x8ba00040
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x87a00040
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			.word	0x83a00040	!fmovd	%f0,%f32
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.v8:			fmovs	%f1,%f31
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o0
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f30
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o1
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f29
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o2
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f28
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o3
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f27
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o4
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f26
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o5
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f25
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o7
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f24
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l0
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f23
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l1
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f22
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l2
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f21
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l3
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f20
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l4
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f19
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l5
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f18
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l6
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f17
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l7
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f16
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%i0
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f15
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%i1
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f14
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%i2
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f13
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%i3
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f12
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%i4
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f11
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%i5
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f10
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%g1
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f9
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%g2
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f8
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%g3
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f7
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%g4
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f6
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%g5
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f5
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f4
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f1,%f3
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			fmovs	%f0,%f2
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1261762a559ef393f9c15300398433598989033385fDavid 'Digit' Turner	add	%fp,BIAS,%i0	! return pointer to caller´s top of stack
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	restore
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.zero:	.long	0x0,0x0
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.PIC.zero.up:
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	retl
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	%o0,%o7,%o0
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef DEBUG
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	walk_reg_wins
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	walk_reg_wins,#function
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectwalk_reg_wins:
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.walk.reg.wins:
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	save	%sp,FRAME,%sp
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%i7,%o7
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	be	2f
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o0
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%o7,0	! compiler never cleans %o7...
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	be	1f	! could have been a leaf function...
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o1
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	call	.walk.reg.wins
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project1:	clr	%o2
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o3
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o4
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o5
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%o7
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l0
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l1
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l2
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l3
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l4
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l5
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l6
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	clr	%l7
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	%o0,1,%i0	! used for debugging
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project2:	ret
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	restore
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.global	OPENSSL_atomic_add
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	OPENSSL_atomic_add,#function
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	32
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOPENSSL_atomic_add:
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef ABI64
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	subcc	%g0,1,%o2
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.word	0x95408000	!rd	%ccr,%o2, see comment above
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%o2,0x99
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	be	.v9
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	save	%sp,FRAME,%sp
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ba	.enter
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef __sun
1823d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom! Note that you do not have to link with libthread to call thr_yield,
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! as libc provides a stub, which is overloaded the moment you link
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! with *either* libpthread or libthread...
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define	YIELD_CPU	thr_yield
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project! applies at least to Linux and FreeBSD... Feedback expected...
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define	YIELD_CPU	sched_yield
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.spin:	call	YIELD_CPU
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.enter:	ld	[%i0],%i2
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%i2,-4096
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	be	.spin
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	-1,%i2
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	swap	[%i0],%i2
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%i2,-1
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	be	.spin
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	%i2,%i1,%i2
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	stbar
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	st	%i2,[%i0]
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sra	%i2,%g0,%i0
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	restore
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.v9:
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ld	[%o0],%o2
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project1:	add	%o1,%o2,%o3
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.word	0xd7e2100a	!cas [%o0],%o2,%o3, compare [%o0] with %o2 and swap %o3
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%o2,%o3
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bne	1b
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%o3,%o2		! cas is always fetching to dest. register
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	%o1,%o2,%o0	! OpenSSL expects the new value
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	retl
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sra	%o0,%g0,%o0	! we return signed int, remember?
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.global	_sparcv9_rdtick
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	32
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_sparcv9_rdtick:
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	subcc	%g0,1,%o0
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.word	0x91408000	!rd	%ccr,%o0
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%o0,0x99
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bne	.notick
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%o0,%o0,%o0
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.word	0x91410000	!rd	%tick,%o0
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	retl
22843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x93323020	!srlx	%o0,32,%o1
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.notick:
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	retl
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	%o1,%o1,%o1
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	_sparcv9_rdtick,#function
233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	_sparcv9_rdtick,.-_sparcv9_rdtick
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
23543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.global	_sparcv9_vis1_probe
23643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.align	8
23743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom_sparcv9_vis1_probe:
23843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	add	%sp,BIAS+2,%o1
23943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0xc19a5a40	!ldda	[%o1]ASI_FP16_P,%f0
240eeffacea337ec6a275e4c496acd12ca67a244533Brian Carlstrom	retl
241eeffacea337ec6a275e4c496acd12ca67a244533Brian Carlstrom	.word	0x81b00d80	!fxor	%f0,%f0,%f0
24243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.type	_sparcv9_vis1_probe,#function
24343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.size	_sparcv9_vis1_probe,.-_sparcv9_vis1_probe
24443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
24543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! Probe and instrument VIS1 instruction. Output is number of cycles it
24643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! takes to execute rdtick and pair of VIS1 instructions. US-Tx VIS unit
24743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! is slow (documented to be 6 cycles on T2) and the core is in-order
24843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! single-issue, it should be possible to distinguish Tx reliably...
24943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! Observed return values are:
25043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom!
25143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom!	UltraSPARC IIe		7
25243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom!	UltraSPARC III		7
25343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom!	UltraSPARC T1		24
25443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom!
25543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! Numbers for T2 and SPARC64 V-VII are more than welcomed.
25643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom!
25743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! It would be possible to detect specifically US-T1 by instrumenting
25843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! fmul8ulx16, which is emulated on T1 and as such accounts for quite
25943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom! a lot of %tick-s, couple of thousand on Linux...
26043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.global	_sparcv9_vis1_instrument
26143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.align	8
26243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom_sparcv9_vis1_instrument:
26343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x91410000	!rd	%tick,%o0
26443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b00d80	!fxor	%f0,%f0,%f0
26543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x85b08d82	!fxor	%f2,%f2,%f2
26643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x93410000	!rd	%tick,%o1
26743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b00d80	!fxor	%f0,%f0,%f0
26843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x85b08d82	!fxor	%f2,%f2,%f2
26943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x95410000	!rd	%tick,%o2
27043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b00d80	!fxor	%f0,%f0,%f0
27143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x85b08d82	!fxor	%f2,%f2,%f2
27243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x97410000	!rd	%tick,%o3
27343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b00d80	!fxor	%f0,%f0,%f0
27443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x85b08d82	!fxor	%f2,%f2,%f2
27543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x99410000	!rd	%tick,%o4
27643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
27743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	! calculate intervals
27843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	sub	%o1,%o0,%o0
27943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	sub	%o2,%o1,%o1
28043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	sub	%o3,%o2,%o2
28143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	sub	%o4,%o3,%o3
28243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
28343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	! find minumum value
28443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	cmp	%o0,%o1
28543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x38680002	!bgu,a	%xcc,.+8
28643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	mov	%o1,%o0
28743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	cmp	%o0,%o2
28843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x38680002	!bgu,a	%xcc,.+8
28943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	mov	%o2,%o0
29043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	cmp	%o0,%o3
29143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x38680002	!bgu,a	%xcc,.+8
29243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	mov	%o3,%o0
29343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
29443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	retl
29543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	nop
29643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.type	_sparcv9_vis1_instrument,#function
29743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.size	_sparcv9_vis1_instrument,.-_sparcv9_vis1_instrument
29843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
29943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.global	_sparcv9_vis2_probe
30043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.align	8
30143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom_sparcv9_vis2_probe:
30243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	retl
30343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b00980	!bshuffle	%f0,%f0,%f0
30443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.type	_sparcv9_vis2_probe,#function
30543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.size	_sparcv9_vis2_probe,.-_sparcv9_vis2_probe
30643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
30743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.global	_sparcv9_fmadd_probe
30843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.align	8
30943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom_sparcv9_fmadd_probe:
31043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b00d80	!fxor	%f0,%f0,%f0
31143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x85b08d82	!fxor	%f2,%f2,%f2
31243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	retl
31343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	.word	0x81b80440	!fmaddd	%f0,%f0,%f2,%f0
31443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.type	_sparcv9_fmadd_probe,#function
31543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.size	_sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
31643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.global	OPENSSL_cleanse
318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	32
319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromOPENSSL_cleanse:
320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%o1,14
321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ABI64
323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bgu	%xcc,.Lot
324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bgu	.Lot
326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%o1,0
328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bne	.Little
329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	retl
331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Little:
334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stb	%g0,[%o0]
335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	subcc	%o1,1,%o1
336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bnz	.Little
337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%o0,1,%o0
338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	retl
339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	32
341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lot:
342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef ABI64
343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	subcc	%g0,1,%g1
344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	! see above for explanation
345221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.word	0x83408000	!rd	%ccr,%g1
346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%g1,0x99
347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bne	.v8lot
348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.v9lot:	andcc	%o0,7,%g0
352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bz	.v9aligned
353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
354221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stb	%g0,[%o0]
355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%o1,1,%o1
356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ba	.v9lot
357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%o0,1,%o0
358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16,0x01000000
359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.v9aligned:
360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.word	0xc0720000	!stx	%g0,[%o0]
361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%o1,8,%o1
362221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	andcc	%o1,-8,%g0
363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ABI64
364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.word	0x126ffffd	!bnz	%xcc,.v9aligned
365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.word	0x124ffffd	!bnz	%icc,.v9aligned
367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%o0,8,%o0
369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%o1,0
371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bne	.Little
372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	retl
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	nop
375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef ABI64
376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.v8lot:	andcc	%o0,3,%g0
377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bz	.v8aligned
378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stb	%g0,[%o0]
380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%o1,1,%o1
381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ba	.v8lot
382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%o0,1,%o0
383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.v8aligned:
385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	st	%g0,[%o0]
386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%o1,4,%o1
387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	andcc	%o1,-4,%g0
388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bnz	.v8aligned
389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%o0,4,%o0
390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%o1,0
392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bne	.Little
393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	retl
395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	OPENSSL_cleanse,#function
398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	OPENSSL_cleanse,.-OPENSSL_cleanse
399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.section	".init",#alloc,#execinstr
401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	call	OPENSSL_cpuid_setup
402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nop
403