Blame crypto/sparccpuid.S

Packit Service 084de1
! Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
!
Packit Service 084de1
! Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
! this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
! in the file LICENSE in the source distribution or at
Packit Service 084de1
! https://www.openssl.org/source/license.html
Packit Service 084de1
Packit Service 084de1
#if defined(__SUNPRO_C) && defined(__sparcv9)
Packit Service 084de1
# define ABI64  /* They've said -xarch=v9 at command line */
Packit Service 084de1
#elif defined(__GNUC__) && defined(__arch64__)
Packit Service 084de1
# define ABI64  /* They've said -m64 at command line */
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
#ifdef ABI64
Packit Service 084de1
  .register	%g2,#scratch
Packit Service 084de1
  .register	%g3,#scratch
Packit Service 084de1
# define	FRAME	-192
Packit Service 084de1
# define	BIAS	2047
Packit Service 084de1
#else
Packit Service 084de1
# define	FRAME	-96
Packit Service 084de1
# define	BIAS	0
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
.text
Packit Service 084de1
.align	32
Packit Service 084de1
.global	OPENSSL_wipe_cpu
Packit Service 084de1
.type	OPENSSL_wipe_cpu,#function
Packit Service 084de1
! Keep in mind that this does not excuse us from wiping the stack!
Packit Service 084de1
! This routine wipes registers, but not the backing store [which
Packit Service 084de1
! resides on the stack, toward lower addresses]. To facilitate for
Packit Service 084de1
! stack wiping I return pointer to the top of stack of the *caller*.
Packit Service 084de1
OPENSSL_wipe_cpu:
Packit Service 084de1
	save	%sp,FRAME,%sp
Packit Service 084de1
	nop
Packit Service 084de1
#ifdef __sun
Packit Service 084de1
#include <sys/trap.h>
Packit Service 084de1
	ta	ST_CLEAN_WINDOWS
Packit Service 084de1
#else
Packit Service 084de1
	call	.walk.reg.wins
Packit Service 084de1
#endif
Packit Service 084de1
	nop
Packit Service 084de1
	call	.PIC.zero.up
Packit Service 084de1
	mov	.zero-(.-4),%o0
Packit Service 084de1
	ld	[%o0],%f0
Packit Service 084de1
	ld	[%o0],%f1
Packit Service 084de1
Packit Service 084de1
	subcc	%g0,1,%o0
Packit Service 084de1
	! Following is V9 "rd %ccr,%o0" instruction. However! V8
Packit Service 084de1
	! specification says that it ("rd %asr2,%o0" in V8 terms) does
Packit Service 084de1
	! not cause illegal_instruction trap. It therefore can be used
Packit Service 084de1
	! to determine if the CPU the code is executing on is V8- or
Packit Service 084de1
	! V9-compliant, as V9 returns a distinct value of 0x99,
Packit Service 084de1
	! "negative" and "borrow" bits set in both %icc and %xcc.
Packit Service 084de1
	.word	0x91408000	!rd	%ccr,%o0
Packit Service 084de1
	cmp	%o0,0x99
Packit Service 084de1
	bne	.v8
Packit Service 084de1
	nop
Packit Service 084de1
			! Even though we do not use %fp register bank,
Packit Service 084de1
			! we wipe it as memcpy might have used it...
Packit Service 084de1
			.word	0xbfa00040	!fmovd	%f0,%f62
Packit Service 084de1
			.word	0xbba00040	!...
Packit Service 084de1
			.word	0xb7a00040
Packit Service 084de1
			.word	0xb3a00040
Packit Service 084de1
			.word	0xafa00040
Packit Service 084de1
			.word	0xaba00040
Packit Service 084de1
			.word	0xa7a00040
Packit Service 084de1
			.word	0xa3a00040
Packit Service 084de1
			.word	0x9fa00040
Packit Service 084de1
			.word	0x9ba00040
Packit Service 084de1
			.word	0x97a00040
Packit Service 084de1
			.word	0x93a00040
Packit Service 084de1
			.word	0x8fa00040
Packit Service 084de1
			.word	0x8ba00040
Packit Service 084de1
			.word	0x87a00040
Packit Service 084de1
			.word	0x83a00040	!fmovd	%f0,%f32
Packit Service 084de1
.v8:			fmovs	%f1,%f31
Packit Service 084de1
	clr	%o0
Packit Service 084de1
			fmovs	%f0,%f30
Packit Service 084de1
	clr	%o1
Packit Service 084de1
			fmovs	%f1,%f29
Packit Service 084de1
	clr	%o2
Packit Service 084de1
			fmovs	%f0,%f28
Packit Service 084de1
	clr	%o3
Packit Service 084de1
			fmovs	%f1,%f27
Packit Service 084de1
	clr	%o4
Packit Service 084de1
			fmovs	%f0,%f26
Packit Service 084de1
	clr	%o5
Packit Service 084de1
			fmovs	%f1,%f25
Packit Service 084de1
	clr	%o7
Packit Service 084de1
			fmovs	%f0,%f24
Packit Service 084de1
	clr	%l0
Packit Service 084de1
			fmovs	%f1,%f23
Packit Service 084de1
	clr	%l1
Packit Service 084de1
			fmovs	%f0,%f22
Packit Service 084de1
	clr	%l2
Packit Service 084de1
			fmovs	%f1,%f21
Packit Service 084de1
	clr	%l3
Packit Service 084de1
			fmovs	%f0,%f20
Packit Service 084de1
	clr	%l4
Packit Service 084de1
			fmovs	%f1,%f19
Packit Service 084de1
	clr	%l5
Packit Service 084de1
			fmovs	%f0,%f18
Packit Service 084de1
	clr	%l6
Packit Service 084de1
			fmovs	%f1,%f17
Packit Service 084de1
	clr	%l7
Packit Service 084de1
			fmovs	%f0,%f16
Packit Service 084de1
	clr	%i0
Packit Service 084de1
			fmovs	%f1,%f15
Packit Service 084de1
	clr	%i1
Packit Service 084de1
			fmovs	%f0,%f14
Packit Service 084de1
	clr	%i2
Packit Service 084de1
			fmovs	%f1,%f13
Packit Service 084de1
	clr	%i3
Packit Service 084de1
			fmovs	%f0,%f12
Packit Service 084de1
	clr	%i4
Packit Service 084de1
			fmovs	%f1,%f11
Packit Service 084de1
	clr	%i5
Packit Service 084de1
			fmovs	%f0,%f10
Packit Service 084de1
	clr	%g1
Packit Service 084de1
			fmovs	%f1,%f9
Packit Service 084de1
	clr	%g2
Packit Service 084de1
			fmovs	%f0,%f8
Packit Service 084de1
	clr	%g3
Packit Service 084de1
			fmovs	%f1,%f7
Packit Service 084de1
	clr	%g4
Packit Service 084de1
			fmovs	%f0,%f6
Packit Service 084de1
	clr	%g5
Packit Service 084de1
			fmovs	%f1,%f5
Packit Service 084de1
			fmovs	%f0,%f4
Packit Service 084de1
			fmovs	%f1,%f3
Packit Service 084de1
			fmovs	%f0,%f2
Packit Service 084de1
Packit Service 084de1
	add	%fp,BIAS,%i0	! return pointer to callerĀ“s top of stack
Packit Service 084de1
Packit Service 084de1
	ret
Packit Service 084de1
	restore
Packit Service 084de1
Packit Service 084de1
.zero:	.long	0x0,0x0
Packit Service 084de1
.PIC.zero.up:
Packit Service 084de1
	retl
Packit Service 084de1
	add	%o0,%o7,%o0
Packit Service 084de1
#ifdef DEBUG
Packit Service 084de1
.global	walk_reg_wins
Packit Service 084de1
.type	walk_reg_wins,#function
Packit Service 084de1
walk_reg_wins:
Packit Service 084de1
#endif
Packit Service 084de1
.walk.reg.wins:
Packit Service 084de1
	save	%sp,FRAME,%sp
Packit Service 084de1
	cmp	%i7,%o7
Packit Service 084de1
	be	2f
Packit Service 084de1
	clr	%o0
Packit Service 084de1
	cmp	%o7,0	! compiler never cleans %o7...
Packit Service 084de1
	be	1f	! could have been a leaf function...
Packit Service 084de1
	clr	%o1
Packit Service 084de1
	call	.walk.reg.wins
Packit Service 084de1
	nop
Packit Service 084de1
1:	clr	%o2
Packit Service 084de1
	clr	%o3
Packit Service 084de1
	clr	%o4
Packit Service 084de1
	clr	%o5
Packit Service 084de1
	clr	%o7
Packit Service 084de1
	clr	%l0
Packit Service 084de1
	clr	%l1
Packit Service 084de1
	clr	%l2
Packit Service 084de1
	clr	%l3
Packit Service 084de1
	clr	%l4
Packit Service 084de1
	clr	%l5
Packit Service 084de1
	clr	%l6
Packit Service 084de1
	clr	%l7
Packit Service 084de1
	add	%o0,1,%i0	! used for debugging
Packit Service 084de1
2:	ret
Packit Service 084de1
	restore
Packit Service 084de1
.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
Packit Service 084de1
Packit Service 084de1
.global	OPENSSL_atomic_add
Packit Service 084de1
.type	OPENSSL_atomic_add,#function
Packit Service 084de1
.align	32
Packit Service 084de1
OPENSSL_atomic_add:
Packit Service 084de1
#ifndef ABI64
Packit Service 084de1
	subcc	%g0,1,%o2
Packit Service 084de1
	.word	0x95408000	!rd	%ccr,%o2, see comment above
Packit Service 084de1
	cmp	%o2,0x99
Packit Service 084de1
	be	.v9
Packit Service 084de1
	nop
Packit Service 084de1
	save	%sp,FRAME,%sp
Packit Service 084de1
	ba	.enter
Packit Service 084de1
	nop
Packit Service 084de1
#ifdef __sun
Packit Service 084de1
! Note that you do not have to link with libthread to call thr_yield,
Packit Service 084de1
! as libc provides a stub, which is overloaded the moment you link
Packit Service 084de1
! with *either* libpthread or libthread...
Packit Service 084de1
#define	YIELD_CPU	thr_yield
Packit Service 084de1
#else
Packit Service 084de1
! applies at least to Linux and FreeBSD... Feedback expected...
Packit Service 084de1
#define	YIELD_CPU	sched_yield
Packit Service 084de1
#endif
Packit Service 084de1
.spin:	call	YIELD_CPU
Packit Service 084de1
	nop
Packit Service 084de1
.enter:	ld	[%i0],%i2
Packit Service 084de1
	cmp	%i2,-4096
Packit Service 084de1
	be	.spin
Packit Service 084de1
	mov	-1,%i2
Packit Service 084de1
	swap	[%i0],%i2
Packit Service 084de1
	cmp	%i2,-1
Packit Service 084de1
	be	.spin
Packit Service 084de1
	add	%i2,%i1,%i2
Packit Service 084de1
	stbar
Packit Service 084de1
	st	%i2,[%i0]
Packit Service 084de1
	sra	%i2,%g0,%i0
Packit Service 084de1
	ret
Packit Service 084de1
	restore
Packit Service 084de1
.v9:
Packit Service 084de1
#endif
Packit Service 084de1
	ld	[%o0],%o2
Packit Service 084de1
1:	add	%o1,%o2,%o3
Packit Service 084de1
	.word	0xd7e2100a	!cas [%o0],%o2,%o3, compare [%o0] with %o2 and swap %o3
Packit Service 084de1
	cmp	%o2,%o3
Packit Service 084de1
	bne	1b
Packit Service 084de1
	mov	%o3,%o2		! cas is always fetching to dest. register
Packit Service 084de1
	add	%o1,%o2,%o0	! OpenSSL expects the new value
Packit Service 084de1
	retl
Packit Service 084de1
	sra	%o0,%g0,%o0	! we return signed int, remember?
Packit Service 084de1
.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_rdtick
Packit Service 084de1
.align	32
Packit Service 084de1
_sparcv9_rdtick:
Packit Service 084de1
	subcc	%g0,1,%o0
Packit Service 084de1
	.word	0x91408000	!rd	%ccr,%o0
Packit Service 084de1
	cmp	%o0,0x99
Packit Service 084de1
	bne	.notick
Packit Service 084de1
	xor	%o0,%o0,%o0
Packit Service 084de1
	.word	0x91410000	!rd	%tick,%o0
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x93323020	!srlx	%o0,32,%o1
Packit Service 084de1
.notick:
Packit Service 084de1
	retl
Packit Service 084de1
	xor	%o1,%o1,%o1
Packit Service 084de1
.type	_sparcv9_rdtick,#function
Packit Service 084de1
.size	_sparcv9_rdtick,.-_sparcv9_rdtick
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_vis1_probe
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_vis1_probe:
Packit Service 084de1
	add	%sp,BIAS+2,%o1
Packit Service 084de1
	.word	0xc19a5a40	!ldda	[%o1]ASI_FP16_P,%f0
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
.type	_sparcv9_vis1_probe,#function
Packit Service 084de1
.size	_sparcv9_vis1_probe,.-_sparcv9_vis1_probe
Packit Service 084de1
Packit Service 084de1
! Probe and instrument VIS1 instruction. Output is number of cycles it
Packit Service 084de1
! takes to execute rdtick and pair of VIS1 instructions. US-Tx VIS unit
Packit Service 084de1
! is slow (documented to be 6 cycles on T2) and the core is in-order
Packit Service 084de1
! single-issue, it should be possible to distinguish Tx reliably...
Packit Service 084de1
! Observed return values are:
Packit Service 084de1
!
Packit Service 084de1
!	UltraSPARC IIe		7
Packit Service 084de1
!	UltraSPARC III		7
Packit Service 084de1
!	UltraSPARC T1		24
Packit Service 084de1
!	SPARC T4		65(*)
Packit Service 084de1
!
Packit Service 084de1
! (*)	result has lesser to do with VIS instruction latencies, rdtick
Packit Service 084de1
!	appears that slow, but it does the trick in sense that FP and
Packit Service 084de1
!	VIS code paths are still slower than integer-only ones.
Packit Service 084de1
!
Packit Service 084de1
! Numbers for T2 and SPARC64 V-VII are more than welcomed.
Packit Service 084de1
!
Packit Service 084de1
! It would be possible to detect specifically US-T1 by instrumenting
Packit Service 084de1
! fmul8ulx16, which is emulated on T1 and as such accounts for quite
Packit Service 084de1
! a lot of %tick-s, couple of thousand on Linux...
Packit Service 084de1
.global	_sparcv9_vis1_instrument
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_vis1_instrument:
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
	.word	0x85b08d82	!fxor	%f2,%f2,%f2
Packit Service 084de1
	.word	0x91410000	!rd	%tick,%o0
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
	.word	0x85b08d82	!fxor	%f2,%f2,%f2
Packit Service 084de1
	.word	0x93410000	!rd	%tick,%o1
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
	.word	0x85b08d82	!fxor	%f2,%f2,%f2
Packit Service 084de1
	.word	0x95410000	!rd	%tick,%o2
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
	.word	0x85b08d82	!fxor	%f2,%f2,%f2
Packit Service 084de1
	.word	0x97410000	!rd	%tick,%o3
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
	.word	0x85b08d82	!fxor	%f2,%f2,%f2
Packit Service 084de1
	.word	0x99410000	!rd	%tick,%o4
Packit Service 084de1
Packit Service 084de1
	! calculate intervals
Packit Service 084de1
	sub	%o1,%o0,%o0
Packit Service 084de1
	sub	%o2,%o1,%o1
Packit Service 084de1
	sub	%o3,%o2,%o2
Packit Service 084de1
	sub	%o4,%o3,%o3
Packit Service 084de1
Packit Service 084de1
	! find minimum value
Packit Service 084de1
	cmp	%o0,%o1
Packit Service 084de1
	.word	0x38680002	!bgu,a	%xcc,.+8
Packit Service 084de1
	mov	%o1,%o0
Packit Service 084de1
	cmp	%o0,%o2
Packit Service 084de1
	.word	0x38680002	!bgu,a	%xcc,.+8
Packit Service 084de1
	mov	%o2,%o0
Packit Service 084de1
	cmp	%o0,%o3
Packit Service 084de1
	.word	0x38680002	!bgu,a	%xcc,.+8
Packit Service 084de1
	mov	%o3,%o0
Packit Service 084de1
Packit Service 084de1
	retl
Packit Service 084de1
	nop
Packit Service 084de1
.type	_sparcv9_vis1_instrument,#function
Packit Service 084de1
.size	_sparcv9_vis1_instrument,.-_sparcv9_vis1_instrument
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_vis2_probe
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_vis2_probe:
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x81b00980	!bshuffle	%f0,%f0,%f0
Packit Service 084de1
.type	_sparcv9_vis2_probe,#function
Packit Service 084de1
.size	_sparcv9_vis2_probe,.-_sparcv9_vis2_probe
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_fmadd_probe
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_fmadd_probe:
Packit Service 084de1
	.word	0x81b00d80	!fxor	%f0,%f0,%f0
Packit Service 084de1
	.word	0x85b08d82	!fxor	%f2,%f2,%f2
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x81b80440	!fmaddd	%f0,%f0,%f2,%f0
Packit Service 084de1
.type	_sparcv9_fmadd_probe,#function
Packit Service 084de1
.size	_sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_rdcfr
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_rdcfr:
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x91468000	!rd	%asr26,%o0
Packit Service 084de1
.type	_sparcv9_rdcfr,#function
Packit Service 084de1
.size	_sparcv9_rdcfr,.-_sparcv9_rdcfr
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_vis3_probe
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_vis3_probe:
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x81b022a0	!xmulx	%g0,%g0,%g0
Packit Service 084de1
.type	_sparcv9_vis3_probe,#function
Packit Service 084de1
.size	_sparcv9_vis3_probe,.-_sparcv9_vis3_probe
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_random
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_random:
Packit Service 084de1
	retl
Packit Service 084de1
	.word	0x91b002a0	!random	%o0
Packit Service 084de1
.type	_sparcv9_random,#function
Packit Service 084de1
.size	_sparcv9_random,.-_sparcv9_vis3_probe
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_fjaesx_probe
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_fjaesx_probe:
Packit Service 084de1
	.word	0x81b09206	!faesencx %f2,%f6,%f0
Packit Service 084de1
	retl
Packit Service 084de1
	nop
Packit Service 084de1
.size	_sparcv9_fjaesx_probe,.-_sparcv9_fjaesx_probe
Packit Service 084de1
Packit Service 084de1
.global	OPENSSL_cleanse
Packit Service 084de1
.align	32
Packit Service 084de1
OPENSSL_cleanse:
Packit Service 084de1
	cmp	%o1,14
Packit Service 084de1
	nop
Packit Service 084de1
#ifdef ABI64
Packit Service 084de1
	bgu	%xcc,.Lot
Packit Service 084de1
#else
Packit Service 084de1
	bgu	.Lot
Packit Service 084de1
#endif
Packit Service 084de1
	cmp	%o1,0
Packit Service 084de1
	bne	.Little
Packit Service 084de1
	nop
Packit Service 084de1
	retl
Packit Service 084de1
	nop
Packit Service 084de1
Packit Service 084de1
.Little:
Packit Service 084de1
	stb	%g0,[%o0]
Packit Service 084de1
	subcc	%o1,1,%o1
Packit Service 084de1
	bnz	.Little
Packit Service 084de1
	add	%o0,1,%o0
Packit Service 084de1
	retl
Packit Service 084de1
	nop
Packit Service 084de1
.align	32
Packit Service 084de1
.Lot:
Packit Service 084de1
#ifndef ABI64
Packit Service 084de1
	subcc	%g0,1,%g1
Packit Service 084de1
	! see above for explanation
Packit Service 084de1
	.word	0x83408000	!rd	%ccr,%g1
Packit Service 084de1
	cmp	%g1,0x99
Packit Service 084de1
	bne	.v8lot
Packit Service 084de1
	nop
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
.v9lot:	andcc	%o0,7,%g0
Packit Service 084de1
	bz	.v9aligned
Packit Service 084de1
	nop
Packit Service 084de1
	stb	%g0,[%o0]
Packit Service 084de1
	sub	%o1,1,%o1
Packit Service 084de1
	ba	.v9lot
Packit Service 084de1
	add	%o0,1,%o0
Packit Service 084de1
.align	16,0x01000000
Packit Service 084de1
.v9aligned:
Packit Service 084de1
	.word	0xc0720000	!stx	%g0,[%o0]
Packit Service 084de1
	sub	%o1,8,%o1
Packit Service 084de1
	andcc	%o1,-8,%g0
Packit Service 084de1
#ifdef ABI64
Packit Service 084de1
	.word	0x126ffffd	!bnz	%xcc,.v9aligned
Packit Service 084de1
#else
Packit Service 084de1
	.word	0x124ffffd	!bnz	%icc,.v9aligned
Packit Service 084de1
#endif
Packit Service 084de1
	add	%o0,8,%o0
Packit Service 084de1
Packit Service 084de1
	cmp	%o1,0
Packit Service 084de1
	bne	.Little
Packit Service 084de1
	nop
Packit Service 084de1
	retl
Packit Service 084de1
	nop
Packit Service 084de1
#ifndef ABI64
Packit Service 084de1
.v8lot:	andcc	%o0,3,%g0
Packit Service 084de1
	bz	.v8aligned
Packit Service 084de1
	nop
Packit Service 084de1
	stb	%g0,[%o0]
Packit Service 084de1
	sub	%o1,1,%o1
Packit Service 084de1
	ba	.v8lot
Packit Service 084de1
	add	%o0,1,%o0
Packit Service 084de1
	nop
Packit Service 084de1
.v8aligned:
Packit Service 084de1
	st	%g0,[%o0]
Packit Service 084de1
	sub	%o1,4,%o1
Packit Service 084de1
	andcc	%o1,-4,%g0
Packit Service 084de1
	bnz	.v8aligned
Packit Service 084de1
	add	%o0,4,%o0
Packit Service 084de1
Packit Service 084de1
	cmp	%o1,0
Packit Service 084de1
	bne	.Little
Packit Service 084de1
	nop
Packit Service 084de1
	retl
Packit Service 084de1
	nop
Packit Service 084de1
#endif
Packit Service 084de1
.type	OPENSSL_cleanse,#function
Packit Service 084de1
.size	OPENSSL_cleanse,.-OPENSSL_cleanse
Packit Service 084de1
Packit Service 084de1
.global	CRYPTO_memcmp
Packit Service 084de1
.align	16
Packit Service 084de1
CRYPTO_memcmp:
Packit Service 084de1
	cmp	%o2,0
Packit Service 084de1
#ifdef ABI64
Packit Service 084de1
	beq,pn	%xcc,.Lno_data
Packit Service 084de1
#else
Packit Service 084de1
	beq	.Lno_data
Packit Service 084de1
#endif
Packit Service 084de1
	xor	%g1,%g1,%g1
Packit Service 084de1
	nop
Packit Service 084de1
Packit Service 084de1
.Loop_cmp:
Packit Service 084de1
	ldub	[%o0],%o3
Packit Service 084de1
	add	%o0,1,%o0
Packit Service 084de1
	ldub	[%o1],%o4
Packit Service 084de1
	add	%o1,1,%o1
Packit Service 084de1
	subcc	%o2,1,%o2
Packit Service 084de1
	xor	%o3,%o4,%o4
Packit Service 084de1
#ifdef ABI64
Packit Service 084de1
	bnz	%xcc,.Loop_cmp
Packit Service 084de1
#else
Packit Service 084de1
	bnz	.Loop_cmp
Packit Service 084de1
#endif
Packit Service 084de1
	or	%o4,%g1,%g1
Packit Service 084de1
Packit Service 084de1
	sub	%g0,%g1,%g1
Packit Service 084de1
	srl	%g1,31,%g1
Packit Service 084de1
.Lno_data:
Packit Service 084de1
	retl
Packit Service 084de1
	mov	%g1,%o0
Packit Service 084de1
.type	CRYPTO_memcmp,#function
Packit Service 084de1
.size	CRYPTO_memcmp,.-CRYPTO_memcmp
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_vis1_instrument_bus
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_vis1_instrument_bus:
Packit Service 084de1
	mov	%o1,%o3					! save cnt
Packit Service 084de1
	.word	0x99410000	!rd	%tick,%o4	! tick
Packit Service 084de1
	mov	%o4,%o5					! lasttick = tick
Packit Service 084de1
	set	0,%g4					! diff
Packit Service 084de1
Packit Service 084de1
	andn	%o0,63,%g1
Packit Service 084de1
	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	ld	[%o0],%o4
Packit Service 084de1
	add	%o4,%g4,%g4
Packit Service 084de1
	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
Packit Service 084de1
Packit Service 084de1
.Loop:	.word	0x99410000	!rd	%tick,%o4
Packit Service 084de1
	sub	%o4,%o5,%g4				! diff=tick-lasttick
Packit Service 084de1
	mov	%o4,%o5					! lasttick=tick
Packit Service 084de1
Packit Service 084de1
	andn	%o0,63,%g1
Packit Service 084de1
	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	ld	[%o0],%o4
Packit Service 084de1
	add	%o4,%g4,%g4
Packit Service 084de1
	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
Packit Service 084de1
	subcc	%o1,1,%o1				! --$cnt
Packit Service 084de1
	bnz	.Loop
Packit Service 084de1
	add	%o0,4,%o0				! ++$out
Packit Service 084de1
Packit Service 084de1
	retl
Packit Service 084de1
	mov	%o3,%o0
Packit Service 084de1
.type	_sparcv9_vis1_instrument_bus,#function
Packit Service 084de1
.size	_sparcv9_vis1_instrument_bus,.-_sparcv9_vis1_instrument_bus
Packit Service 084de1
Packit Service 084de1
.global	_sparcv9_vis1_instrument_bus2
Packit Service 084de1
.align	8
Packit Service 084de1
_sparcv9_vis1_instrument_bus2:
Packit Service 084de1
	mov	%o1,%o3					! save cnt
Packit Service 084de1
	sll	%o1,2,%o1				! cnt*=4
Packit Service 084de1
Packit Service 084de1
	.word	0x99410000	!rd	%tick,%o4	! tick
Packit Service 084de1
	mov	%o4,%o5					! lasttick = tick
Packit Service 084de1
	set	0,%g4					! diff
Packit Service 084de1
Packit Service 084de1
	andn	%o0,63,%g1
Packit Service 084de1
	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	ld	[%o0],%o4
Packit Service 084de1
	add	%o4,%g4,%g4
Packit Service 084de1
	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
Packit Service 084de1
Packit Service 084de1
	.word	0x99410000	!rd	%tick,%o4	! tick
Packit Service 084de1
	sub	%o4,%o5,%g4				! diff=tick-lasttick
Packit Service 084de1
	mov	%o4,%o5					! lasttick=tick
Packit Service 084de1
	mov	%g4,%g5					! lastdiff=diff
Packit Service 084de1
.Loop2:
Packit Service 084de1
	andn	%o0,63,%g1
Packit Service 084de1
	.word	0xc1985e00	!ldda	[%g1]0xf0,%f0	! block load
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	.word	0xc1b85c00	!stda	%f0,[%g1]0xe0	! block store and commit
Packit Service 084de1
	.word	0x8143e040	!membar	#Sync
Packit Service 084de1
	ld	[%o0],%o4
Packit Service 084de1
	add	%o4,%g4,%g4
Packit Service 084de1
	.word	0xc9e2100c	!cas	[%o0],%o4,%g4
Packit Service 084de1
Packit Service 084de1
	subcc	%o2,1,%o2				! --max
Packit Service 084de1
	bz	.Ldone2
Packit Service 084de1
	nop
Packit Service 084de1
Packit Service 084de1
	.word	0x99410000	!rd	%tick,%o4	! tick
Packit Service 084de1
	sub	%o4,%o5,%g4				! diff=tick-lasttick
Packit Service 084de1
	mov	%o4,%o5					! lasttick=tick
Packit Service 084de1
	cmp	%g4,%g5
Packit Service 084de1
	mov	%g4,%g5					! lastdiff=diff
Packit Service 084de1
Packit Service 084de1
	.word	0x83408000	!rd	%ccr,%g1
Packit Service 084de1
	and	%g1,4,%g1				! isolate zero flag
Packit Service 084de1
	xor	%g1,4,%g1				! flip zero flag
Packit Service 084de1
Packit Service 084de1
	subcc	%o1,%g1,%o1				! conditional --$cnt
Packit Service 084de1
	bnz	.Loop2
Packit Service 084de1
	add	%o0,%g1,%o0				! conditional ++$out
Packit Service 084de1
Packit Service 084de1
.Ldone2:
Packit Service 084de1
	srl	%o1,2,%o1
Packit Service 084de1
	retl
Packit Service 084de1
	sub	%o3,%o1,%o0
Packit Service 084de1
.type	_sparcv9_vis1_instrument_bus2,#function
Packit Service 084de1
.size	_sparcv9_vis1_instrument_bus2,.-_sparcv9_vis1_instrument_bus2
Packit Service 084de1
Packit Service 084de1
.section	".init",#alloc,#execinstr
Packit Service 084de1
	call	OPENSSL_cpuid_setup
Packit Service 084de1
	nop