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