xref: /third_party/openssl/crypto/pariscid.pl (revision e1051a39)
1e1051a39Sopenharmony_ci#! /usr/bin/env perl
2e1051a39Sopenharmony_ci# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci#
4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci# this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci# $output is the last argument if it looks like a file (it has an extension)
11e1051a39Sopenharmony_ci# $flavour is the first argument if it doesn't look like a file
12e1051a39Sopenharmony_ci$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13e1051a39Sopenharmony_ci$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14e1051a39Sopenharmony_ci
15e1051a39Sopenharmony_ci$output and open STDOUT,">$output";
16e1051a39Sopenharmony_ci
17e1051a39Sopenharmony_ciif ($flavour =~ /64/) {
18e1051a39Sopenharmony_ci	$LEVEL		="2.0W";
19e1051a39Sopenharmony_ci	$SIZE_T		=8;
20e1051a39Sopenharmony_ci	$ST		="std";
21e1051a39Sopenharmony_ci} else {
22e1051a39Sopenharmony_ci	$LEVEL		="1.1";
23e1051a39Sopenharmony_ci	$SIZE_T		=4;
24e1051a39Sopenharmony_ci	$ST		="stw";
25e1051a39Sopenharmony_ci}
26e1051a39Sopenharmony_ci
27e1051a39Sopenharmony_ci$rp="%r2";
28e1051a39Sopenharmony_ci$sp="%r30";
29e1051a39Sopenharmony_ci$rv="%r28";
30e1051a39Sopenharmony_ci
31e1051a39Sopenharmony_ci$code=<<___;
32e1051a39Sopenharmony_ci	.LEVEL	$LEVEL
33e1051a39Sopenharmony_ci	.SPACE	\$TEXT\$
34e1051a39Sopenharmony_ci	.SUBSPA	\$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
35e1051a39Sopenharmony_ci
36e1051a39Sopenharmony_ci	.EXPORT	OPENSSL_cpuid_setup,ENTRY
37e1051a39Sopenharmony_ci	.ALIGN	8
38e1051a39Sopenharmony_ciOPENSSL_cpuid_setup
39e1051a39Sopenharmony_ci	.PROC
40e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
41e1051a39Sopenharmony_ci	.ENTRY
42e1051a39Sopenharmony_ci	bv	($rp)
43e1051a39Sopenharmony_ci	.EXIT
44e1051a39Sopenharmony_ci	nop
45e1051a39Sopenharmony_ci	.PROCEND
46e1051a39Sopenharmony_ci
47e1051a39Sopenharmony_ci	.EXPORT	OPENSSL_rdtsc,ENTRY
48e1051a39Sopenharmony_ci	.ALIGN	8
49e1051a39Sopenharmony_ciOPENSSL_rdtsc
50e1051a39Sopenharmony_ci	.PROC
51e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
52e1051a39Sopenharmony_ci	.ENTRY
53e1051a39Sopenharmony_ci	mfctl	%cr16,$rv
54e1051a39Sopenharmony_ci	bv	($rp)
55e1051a39Sopenharmony_ci	.EXIT
56e1051a39Sopenharmony_ci	nop
57e1051a39Sopenharmony_ci	.PROCEND
58e1051a39Sopenharmony_ci
59e1051a39Sopenharmony_ci	.EXPORT	OPENSSL_wipe_cpu,ENTRY
60e1051a39Sopenharmony_ci	.ALIGN	8
61e1051a39Sopenharmony_ciOPENSSL_wipe_cpu
62e1051a39Sopenharmony_ci	.PROC
63e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
64e1051a39Sopenharmony_ci	.ENTRY
65e1051a39Sopenharmony_ci	xor		%r0,%r0,%r1
66e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr4
67e1051a39Sopenharmony_ci	xor		%r0,%r0,%r19
68e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr5
69e1051a39Sopenharmony_ci	xor		%r0,%r0,%r20
70e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr6
71e1051a39Sopenharmony_ci	xor		%r0,%r0,%r21
72e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr7
73e1051a39Sopenharmony_ci	xor		%r0,%r0,%r22
74e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr8
75e1051a39Sopenharmony_ci	xor		%r0,%r0,%r23
76e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr9
77e1051a39Sopenharmony_ci	xor		%r0,%r0,%r24
78e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr10
79e1051a39Sopenharmony_ci	xor		%r0,%r0,%r25
80e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr11
81e1051a39Sopenharmony_ci	xor		%r0,%r0,%r26
82e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr22
83e1051a39Sopenharmony_ci	xor		%r0,%r0,%r29
84e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr23
85e1051a39Sopenharmony_ci	xor		%r0,%r0,%r31
86e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr24
87e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr25
88e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr26
89e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr27
90e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr28
91e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr29
92e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr30
93e1051a39Sopenharmony_ci	fcpy,dbl	%fr0,%fr31
94e1051a39Sopenharmony_ci	bv		($rp)
95e1051a39Sopenharmony_ci	.EXIT
96e1051a39Sopenharmony_ci	ldo		0($sp),$rv
97e1051a39Sopenharmony_ci	.PROCEND
98e1051a39Sopenharmony_ci___
99e1051a39Sopenharmony_ci{
100e1051a39Sopenharmony_cimy $inp="%r26";
101e1051a39Sopenharmony_cimy $len="%r25";
102e1051a39Sopenharmony_ci
103e1051a39Sopenharmony_ci$code.=<<___;
104e1051a39Sopenharmony_ci	.EXPORT	OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
105e1051a39Sopenharmony_ci	.ALIGN	8
106e1051a39Sopenharmony_ciOPENSSL_cleanse
107e1051a39Sopenharmony_ci	.PROC
108e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
109e1051a39Sopenharmony_ci	.ENTRY
110e1051a39Sopenharmony_ci	cmpib,*=	0,$len,L\$done
111e1051a39Sopenharmony_ci	nop
112e1051a39Sopenharmony_ci	cmpib,*>>=	15,$len,L\$ittle
113e1051a39Sopenharmony_ci	ldi		$SIZE_T-1,%r1
114e1051a39Sopenharmony_ci
115e1051a39Sopenharmony_ciL\$align
116e1051a39Sopenharmony_ci	and,*<>		$inp,%r1,%r28
117e1051a39Sopenharmony_ci	b,n		L\$aligned
118e1051a39Sopenharmony_ci	stb		%r0,0($inp)
119e1051a39Sopenharmony_ci	ldo		-1($len),$len
120e1051a39Sopenharmony_ci	b		L\$align
121e1051a39Sopenharmony_ci	ldo		1($inp),$inp
122e1051a39Sopenharmony_ci
123e1051a39Sopenharmony_ciL\$aligned
124e1051a39Sopenharmony_ci	andcm		$len,%r1,%r28
125e1051a39Sopenharmony_ciL\$ot
126e1051a39Sopenharmony_ci	$ST		%r0,0($inp)
127e1051a39Sopenharmony_ci	addib,*<>	-$SIZE_T,%r28,L\$ot
128e1051a39Sopenharmony_ci	ldo		$SIZE_T($inp),$inp
129e1051a39Sopenharmony_ci
130e1051a39Sopenharmony_ci	and,*<>		$len,%r1,$len
131e1051a39Sopenharmony_ci	b,n		L\$done
132e1051a39Sopenharmony_ciL\$ittle
133e1051a39Sopenharmony_ci	stb		%r0,0($inp)
134e1051a39Sopenharmony_ci	addib,*<>	-1,$len,L\$ittle
135e1051a39Sopenharmony_ci	ldo		1($inp),$inp
136e1051a39Sopenharmony_ciL\$done
137e1051a39Sopenharmony_ci	bv		($rp)
138e1051a39Sopenharmony_ci	.EXIT
139e1051a39Sopenharmony_ci	nop
140e1051a39Sopenharmony_ci	.PROCEND
141e1051a39Sopenharmony_ci___
142e1051a39Sopenharmony_ci}
143e1051a39Sopenharmony_ci{
144e1051a39Sopenharmony_cimy ($in1,$in2,$len)=("%r26","%r25","%r24");
145e1051a39Sopenharmony_ci
146e1051a39Sopenharmony_ci$code.=<<___;
147e1051a39Sopenharmony_ci	.EXPORT	CRYPTO_memcmp,ENTRY,ARGW0=GR,ARGW1=GR,ARGW1=GR
148e1051a39Sopenharmony_ci	.ALIGN	8
149e1051a39Sopenharmony_ciCRYPTO_memcmp
150e1051a39Sopenharmony_ci	.PROC
151e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
152e1051a39Sopenharmony_ci	.ENTRY
153e1051a39Sopenharmony_ci	cmpib,*=	0,$len,L\$no_data
154e1051a39Sopenharmony_ci	xor		$rv,$rv,$rv
155e1051a39Sopenharmony_ci
156e1051a39Sopenharmony_ciL\$oop_cmp
157e1051a39Sopenharmony_ci	ldb		0($in1),%r19
158e1051a39Sopenharmony_ci	ldb		0($in2),%r20
159e1051a39Sopenharmony_ci	ldo		1($in1),$in1
160e1051a39Sopenharmony_ci	ldo		1($in2),$in2
161e1051a39Sopenharmony_ci	xor		%r19,%r20,%r29
162e1051a39Sopenharmony_ci	addib,*<>	-1,$len,L\$oop_cmp
163e1051a39Sopenharmony_ci	or		%r29,$rv,$rv
164e1051a39Sopenharmony_ci
165e1051a39Sopenharmony_ci	sub		%r0,$rv,%r29
166e1051a39Sopenharmony_ci	extru		%r29,0,1,$rv
167e1051a39Sopenharmony_ciL\$no_data
168e1051a39Sopenharmony_ci	bv		($rp)
169e1051a39Sopenharmony_ci	.EXIT
170e1051a39Sopenharmony_ci	nop
171e1051a39Sopenharmony_ci	.PROCEND
172e1051a39Sopenharmony_ci___
173e1051a39Sopenharmony_ci}
174e1051a39Sopenharmony_ci{
175e1051a39Sopenharmony_cimy ($out,$cnt,$max)=("%r26","%r25","%r24");
176e1051a39Sopenharmony_cimy ($tick,$lasttick)=("%r23","%r22");
177e1051a39Sopenharmony_cimy ($diff,$lastdiff)=("%r21","%r20");
178e1051a39Sopenharmony_ci
179e1051a39Sopenharmony_ci$code.=<<___;
180e1051a39Sopenharmony_ci	.EXPORT	OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR
181e1051a39Sopenharmony_ci	.ALIGN	8
182e1051a39Sopenharmony_ciOPENSSL_instrument_bus
183e1051a39Sopenharmony_ci	.PROC
184e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
185e1051a39Sopenharmony_ci	.ENTRY
186e1051a39Sopenharmony_ci	copy		$cnt,$rv
187e1051a39Sopenharmony_ci	mfctl		%cr16,$tick
188e1051a39Sopenharmony_ci	copy		$tick,$lasttick
189e1051a39Sopenharmony_ci	ldi		0,$diff
190e1051a39Sopenharmony_ci
191e1051a39Sopenharmony_ci	fdc		0($out)
192e1051a39Sopenharmony_ci	ldw		0($out),$tick
193e1051a39Sopenharmony_ci	add		$diff,$tick,$tick
194e1051a39Sopenharmony_ci	stw		$tick,0($out)
195e1051a39Sopenharmony_ciL\$oop
196e1051a39Sopenharmony_ci	mfctl		%cr16,$tick
197e1051a39Sopenharmony_ci	sub		$tick,$lasttick,$diff
198e1051a39Sopenharmony_ci	copy		$tick,$lasttick
199e1051a39Sopenharmony_ci
200e1051a39Sopenharmony_ci	fdc		0($out)
201e1051a39Sopenharmony_ci	ldw		0($out),$tick
202e1051a39Sopenharmony_ci	add		$diff,$tick,$tick
203e1051a39Sopenharmony_ci	stw		$tick,0($out)
204e1051a39Sopenharmony_ci
205e1051a39Sopenharmony_ci	addib,<>	-1,$cnt,L\$oop
206e1051a39Sopenharmony_ci	addi		4,$out,$out
207e1051a39Sopenharmony_ci
208e1051a39Sopenharmony_ci	bv		($rp)
209e1051a39Sopenharmony_ci	.EXIT
210e1051a39Sopenharmony_ci	sub		$rv,$cnt,$rv
211e1051a39Sopenharmony_ci	.PROCEND
212e1051a39Sopenharmony_ci
213e1051a39Sopenharmony_ci	.EXPORT	OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR
214e1051a39Sopenharmony_ci	.ALIGN	8
215e1051a39Sopenharmony_ciOPENSSL_instrument_bus2
216e1051a39Sopenharmony_ci	.PROC
217e1051a39Sopenharmony_ci	.CALLINFO	NO_CALLS
218e1051a39Sopenharmony_ci	.ENTRY
219e1051a39Sopenharmony_ci	copy		$cnt,$rv
220e1051a39Sopenharmony_ci	sub		%r0,$cnt,$cnt
221e1051a39Sopenharmony_ci
222e1051a39Sopenharmony_ci	mfctl		%cr16,$tick
223e1051a39Sopenharmony_ci	copy		$tick,$lasttick
224e1051a39Sopenharmony_ci	ldi		0,$diff
225e1051a39Sopenharmony_ci
226e1051a39Sopenharmony_ci	fdc		0($out)
227e1051a39Sopenharmony_ci	ldw		0($out),$tick
228e1051a39Sopenharmony_ci	add		$diff,$tick,$tick
229e1051a39Sopenharmony_ci	stw		$tick,0($out)
230e1051a39Sopenharmony_ci
231e1051a39Sopenharmony_ci	mfctl		%cr16,$tick
232e1051a39Sopenharmony_ci	sub		$tick,$lasttick,$diff
233e1051a39Sopenharmony_ci	copy		$tick,$lasttick
234e1051a39Sopenharmony_ciL\$oop2
235e1051a39Sopenharmony_ci	copy		$diff,$lastdiff
236e1051a39Sopenharmony_ci	fdc		0($out)
237e1051a39Sopenharmony_ci	ldw		0($out),$tick
238e1051a39Sopenharmony_ci	add		$diff,$tick,$tick
239e1051a39Sopenharmony_ci	stw		$tick,0($out)
240e1051a39Sopenharmony_ci
241e1051a39Sopenharmony_ci	addib,=		-1,$max,L\$done2
242e1051a39Sopenharmony_ci	nop
243e1051a39Sopenharmony_ci
244e1051a39Sopenharmony_ci	mfctl		%cr16,$tick
245e1051a39Sopenharmony_ci	sub		$tick,$lasttick,$diff
246e1051a39Sopenharmony_ci	copy		$tick,$lasttick
247e1051a39Sopenharmony_ci	cmpclr,<>	$lastdiff,$diff,$tick
248e1051a39Sopenharmony_ci	ldi		1,$tick
249e1051a39Sopenharmony_ci
250e1051a39Sopenharmony_ci	ldi		1,%r1
251e1051a39Sopenharmony_ci	xor		%r1,$tick,$tick
252e1051a39Sopenharmony_ci	addb,<>		$tick,$cnt,L\$oop2
253e1051a39Sopenharmony_ci	shladd,l	$tick,2,$out,$out
254e1051a39Sopenharmony_ciL\$done2
255e1051a39Sopenharmony_ci	bv		($rp)
256e1051a39Sopenharmony_ci	.EXIT
257e1051a39Sopenharmony_ci	add		$rv,$cnt,$rv
258e1051a39Sopenharmony_ci	.PROCEND
259e1051a39Sopenharmony_ci___
260e1051a39Sopenharmony_ci}
261e1051a39Sopenharmony_ci
262e1051a39Sopenharmony_ciif (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
263e1051a39Sopenharmony_ci	=~ /GNU assembler/) {
264e1051a39Sopenharmony_ci    $gnuas = 1;
265e1051a39Sopenharmony_ci}
266e1051a39Sopenharmony_ci
267e1051a39Sopenharmony_ciforeach(split("\n",$code)) {
268e1051a39Sopenharmony_ci
269e1051a39Sopenharmony_ci	s/(\.LEVEL\s+2\.0)W/$1w/	if ($gnuas && $SIZE_T==8);
270e1051a39Sopenharmony_ci	s/\.SPACE\s+\$TEXT\$/.text/	if ($gnuas && $SIZE_T==8);
271e1051a39Sopenharmony_ci	s/\.SUBSPA.*//			if ($gnuas && $SIZE_T==8);
272e1051a39Sopenharmony_ci	s/cmpib,\*/comib,/		if ($SIZE_T==4);
273e1051a39Sopenharmony_ci	s/,\*/,/			if ($SIZE_T==4);
274e1051a39Sopenharmony_ci	s/\bbv\b/bve/			if ($SIZE_T==8);
275e1051a39Sopenharmony_ci
276e1051a39Sopenharmony_ci	print $_,"\n";
277e1051a39Sopenharmony_ci}
278e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!";
279e1051a39Sopenharmony_ci
280