mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			276 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #! /usr/bin/env perl
 | |
| # Copyright 2009-2018 The OpenSSL Project Authors. All Rights Reserved.
 | |
| #
 | |
| # Licensed under the OpenSSL license (the "License").  You may not use
 | |
| # this file except in compliance with the License.  You can obtain a copy
 | |
| # in the file LICENSE in the source distribution or at
 | |
| # https://www.openssl.org/source/license.html
 | |
| 
 | |
| 
 | |
| $flavour = shift;
 | |
| $output = shift;
 | |
| open STDOUT,">$output";
 | |
| 
 | |
| if ($flavour =~ /64/) {
 | |
| 	$LEVEL		="2.0W";
 | |
| 	$SIZE_T		=8;
 | |
| 	$ST		="std";
 | |
| } else {
 | |
| 	$LEVEL		="1.1";
 | |
| 	$SIZE_T		=4;
 | |
| 	$ST		="stw";
 | |
| }
 | |
| 
 | |
| $rp="%r2";
 | |
| $sp="%r30";
 | |
| $rv="%r28";
 | |
| 
 | |
| $code=<<___;
 | |
| 	.LEVEL	$LEVEL
 | |
| 	.SPACE	\$TEXT\$
 | |
| 	.SUBSPA	\$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
 | |
| 
 | |
| 	.EXPORT	OPENSSL_cpuid_setup,ENTRY
 | |
| 	.ALIGN	8
 | |
| OPENSSL_cpuid_setup
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	bv	($rp)
 | |
| 	.EXIT
 | |
| 	nop
 | |
| 	.PROCEND
 | |
| 
 | |
| 	.EXPORT	OPENSSL_rdtsc,ENTRY
 | |
| 	.ALIGN	8
 | |
| OPENSSL_rdtsc
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	mfctl	%cr16,$rv
 | |
| 	bv	($rp)
 | |
| 	.EXIT
 | |
| 	nop
 | |
| 	.PROCEND
 | |
| 
 | |
| 	.EXPORT	OPENSSL_wipe_cpu,ENTRY
 | |
| 	.ALIGN	8
 | |
| OPENSSL_wipe_cpu
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	xor		%r0,%r0,%r1
 | |
| 	fcpy,dbl	%fr0,%fr4
 | |
| 	xor		%r0,%r0,%r19
 | |
| 	fcpy,dbl	%fr0,%fr5
 | |
| 	xor		%r0,%r0,%r20
 | |
| 	fcpy,dbl	%fr0,%fr6
 | |
| 	xor		%r0,%r0,%r21
 | |
| 	fcpy,dbl	%fr0,%fr7
 | |
| 	xor		%r0,%r0,%r22
 | |
| 	fcpy,dbl	%fr0,%fr8
 | |
| 	xor		%r0,%r0,%r23
 | |
| 	fcpy,dbl	%fr0,%fr9
 | |
| 	xor		%r0,%r0,%r24
 | |
| 	fcpy,dbl	%fr0,%fr10
 | |
| 	xor		%r0,%r0,%r25
 | |
| 	fcpy,dbl	%fr0,%fr11
 | |
| 	xor		%r0,%r0,%r26
 | |
| 	fcpy,dbl	%fr0,%fr22
 | |
| 	xor		%r0,%r0,%r29
 | |
| 	fcpy,dbl	%fr0,%fr23
 | |
| 	xor		%r0,%r0,%r31
 | |
| 	fcpy,dbl	%fr0,%fr24
 | |
| 	fcpy,dbl	%fr0,%fr25
 | |
| 	fcpy,dbl	%fr0,%fr26
 | |
| 	fcpy,dbl	%fr0,%fr27
 | |
| 	fcpy,dbl	%fr0,%fr28
 | |
| 	fcpy,dbl	%fr0,%fr29
 | |
| 	fcpy,dbl	%fr0,%fr30
 | |
| 	fcpy,dbl	%fr0,%fr31
 | |
| 	bv		($rp)
 | |
| 	.EXIT
 | |
| 	ldo		0($sp),$rv
 | |
| 	.PROCEND
 | |
| ___
 | |
| {
 | |
| my $inp="%r26";
 | |
| my $len="%r25";
 | |
| 
 | |
| $code.=<<___;
 | |
| 	.EXPORT	OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
 | |
| 	.ALIGN	8
 | |
| OPENSSL_cleanse
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	cmpib,*=	0,$len,L\$done
 | |
| 	nop
 | |
| 	cmpib,*>>=	15,$len,L\$ittle
 | |
| 	ldi		$SIZE_T-1,%r1
 | |
| 
 | |
| L\$align
 | |
| 	and,*<>		$inp,%r1,%r28
 | |
| 	b,n		L\$aligned
 | |
| 	stb		%r0,0($inp)
 | |
| 	ldo		-1($len),$len
 | |
| 	b		L\$align
 | |
| 	ldo		1($inp),$inp
 | |
| 
 | |
| L\$aligned
 | |
| 	andcm		$len,%r1,%r28
 | |
| L\$ot
 | |
| 	$ST		%r0,0($inp)
 | |
| 	addib,*<>	-$SIZE_T,%r28,L\$ot
 | |
| 	ldo		$SIZE_T($inp),$inp
 | |
| 
 | |
| 	and,*<>		$len,%r1,$len
 | |
| 	b,n		L\$done
 | |
| L\$ittle
 | |
| 	stb		%r0,0($inp)
 | |
| 	addib,*<>	-1,$len,L\$ittle
 | |
| 	ldo		1($inp),$inp
 | |
| L\$done
 | |
| 	bv		($rp)
 | |
| 	.EXIT
 | |
| 	nop
 | |
| 	.PROCEND
 | |
| ___
 | |
| }
 | |
| {
 | |
| my ($in1,$in2,$len)=("%r26","%r25","%r24");
 | |
| 
 | |
| $code.=<<___;
 | |
| 	.EXPORT	CRYPTO_memcmp,ENTRY,ARGW0=GR,ARGW1=GR,ARGW1=GR
 | |
| 	.ALIGN	8
 | |
| CRYPTO_memcmp
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	cmpib,*=	0,$len,L\$no_data
 | |
| 	xor		$rv,$rv,$rv
 | |
| 
 | |
| L\$oop_cmp
 | |
| 	ldb		0($in1),%r19
 | |
| 	ldb		0($in2),%r20
 | |
| 	ldo		1($in1),$in1
 | |
| 	ldo		1($in2),$in2
 | |
| 	xor		%r19,%r20,%r29
 | |
| 	addib,*<>	-1,$len,L\$oop_cmp
 | |
| 	or		%r29,$rv,$rv
 | |
| 
 | |
| 	sub		%r0,$rv,%r29
 | |
| 	extru		%r29,0,1,$rv
 | |
| L\$no_data
 | |
| 	bv		($rp)
 | |
| 	.EXIT
 | |
| 	nop
 | |
| 	.PROCEND
 | |
| ___
 | |
| }
 | |
| {
 | |
| my ($out,$cnt,$max)=("%r26","%r25","%r24");
 | |
| my ($tick,$lasttick)=("%r23","%r22");
 | |
| my ($diff,$lastdiff)=("%r21","%r20");
 | |
| 
 | |
| $code.=<<___;
 | |
| 	.EXPORT	OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR
 | |
| 	.ALIGN	8
 | |
| OPENSSL_instrument_bus
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	copy		$cnt,$rv
 | |
| 	mfctl		%cr16,$tick
 | |
| 	copy		$tick,$lasttick
 | |
| 	ldi		0,$diff
 | |
| 
 | |
| 	fdc		0($out)
 | |
| 	ldw		0($out),$tick
 | |
| 	add		$diff,$tick,$tick
 | |
| 	stw		$tick,0($out)
 | |
| L\$oop
 | |
| 	mfctl		%cr16,$tick
 | |
| 	sub		$tick,$lasttick,$diff
 | |
| 	copy		$tick,$lasttick
 | |
| 
 | |
| 	fdc		0($out)
 | |
| 	ldw		0($out),$tick
 | |
| 	add		$diff,$tick,$tick
 | |
| 	stw		$tick,0($out)
 | |
| 
 | |
| 	addib,<>	-1,$cnt,L\$oop
 | |
| 	addi		4,$out,$out
 | |
| 
 | |
| 	bv		($rp)
 | |
| 	.EXIT
 | |
| 	sub		$rv,$cnt,$rv
 | |
| 	.PROCEND
 | |
| 
 | |
| 	.EXPORT	OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR
 | |
| 	.ALIGN	8
 | |
| OPENSSL_instrument_bus2
 | |
| 	.PROC
 | |
| 	.CALLINFO	NO_CALLS
 | |
| 	.ENTRY
 | |
| 	copy		$cnt,$rv
 | |
| 	sub		%r0,$cnt,$cnt
 | |
| 
 | |
| 	mfctl		%cr16,$tick
 | |
| 	copy		$tick,$lasttick
 | |
| 	ldi		0,$diff
 | |
| 
 | |
| 	fdc		0($out)
 | |
| 	ldw		0($out),$tick
 | |
| 	add		$diff,$tick,$tick
 | |
| 	stw		$tick,0($out)
 | |
| 
 | |
| 	mfctl		%cr16,$tick
 | |
| 	sub		$tick,$lasttick,$diff
 | |
| 	copy		$tick,$lasttick
 | |
| L\$oop2
 | |
| 	copy		$diff,$lastdiff
 | |
| 	fdc		0($out)
 | |
| 	ldw		0($out),$tick
 | |
| 	add		$diff,$tick,$tick
 | |
| 	stw		$tick,0($out)
 | |
| 
 | |
| 	addib,=		-1,$max,L\$done2
 | |
| 	nop
 | |
| 
 | |
| 	mfctl		%cr16,$tick
 | |
| 	sub		$tick,$lasttick,$diff
 | |
| 	copy		$tick,$lasttick
 | |
| 	cmpclr,<>	$lastdiff,$diff,$tick
 | |
| 	ldi		1,$tick
 | |
| 
 | |
| 	ldi		1,%r1
 | |
| 	xor		%r1,$tick,$tick
 | |
| 	addb,<>		$tick,$cnt,L\$oop2
 | |
| 	shladd,l	$tick,2,$out,$out
 | |
| L\$done2
 | |
| 	bv		($rp)
 | |
| 	.EXIT
 | |
| 	add		$rv,$cnt,$rv
 | |
| 	.PROCEND
 | |
| ___
 | |
| }
 | |
| 
 | |
| if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
 | |
| 	=~ /GNU assembler/) {
 | |
|     $gnuas = 1;
 | |
| }
 | |
| 
 | |
| foreach(split("\n",$code)) {
 | |
| 
 | |
| 	s/(\.LEVEL\s+2\.0)W/$1w/	if ($gnuas && $SIZE_T==8);
 | |
| 	s/\.SPACE\s+\$TEXT\$/.text/	if ($gnuas && $SIZE_T==8);
 | |
| 	s/\.SUBSPA.*//			if ($gnuas && $SIZE_T==8);
 | |
| 	s/cmpib,\*/comib,/		if ($SIZE_T==4);
 | |
| 	s/,\*/,/			if ($SIZE_T==4);
 | |
| 	s/\bbv\b/bve/			if ($SIZE_T==8);
 | |
| 
 | |
| 	print $_,"\n";
 | |
| }
 | |
| close STDOUT;
 | |
| 
 |