1#! /usr/bin/env perl
2# Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
3#
4# Licensed under the Apache License 2.0 (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# $output is the last argument if it looks like a file (it has an extension)
11# $flavour is the first argument if it doesn't look like a file
12$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14
15$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
16( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
17( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
18die "can't locate ppc-xlate.pl";
19
20open STDOUT,"| $^X $xlate $flavour \"$output\""
21    or die "can't call $xlate: $!";
22
23if ($flavour=~/64/) {
24    $CMPLI="cmpldi";
25    $SHRLI="srdi";
26    $SIGNX="extsw";
27} else {
28    $CMPLI="cmplwi";
29    $SHRLI="srwi";
30    $SIGNX="mr";
31}
32
33$code=<<___;
34.machine	"any"
35.text
36
37.globl	.OPENSSL_fpu_probe
38.align	4
39.OPENSSL_fpu_probe:
40	fmr	f0,f0
41	blr
42	.long	0
43	.byte	0,12,0x14,0,0,0,0,0
44.size	.OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
45.globl	.OPENSSL_ppc64_probe
46.align	4
47.OPENSSL_ppc64_probe:
48	fcfid	f1,f1
49	extrdi	r0,r0,32,0
50	blr
51	.long	0
52	.byte	0,12,0x14,0,0,0,0,0
53.size	.OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
54
55.globl	.OPENSSL_altivec_probe
56.align	4
57.OPENSSL_altivec_probe:
58	.long	0x10000484	# vor	v0,v0,v0
59	blr
60	.long	0
61	.byte	0,12,0x14,0,0,0,0,0
62.size	.OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
63
64.globl	.OPENSSL_crypto207_probe
65.align	4
66.OPENSSL_crypto207_probe:
67	lvx_u	v0,0,r1
68	vcipher	v0,v0,v0
69	blr
70	.long	0
71	.byte	0,12,0x14,0,0,0,0,0
72.size	.OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
73
74.globl	.OPENSSL_madd300_probe
75.align	4
76.OPENSSL_madd300_probe:
77	xor	r0,r0,r0
78	maddld	r3,r0,r0,r0
79	maddhdu	r3,r0,r0,r0
80	blr
81	.long	0
82	.byte	0,12,0x14,0,0,0,0,0
83
84.globl	.OPENSSL_wipe_cpu
85.align	4
86.OPENSSL_wipe_cpu:
87	xor	r0,r0,r0
88	fmr	f0,f31
89	fmr	f1,f31
90	fmr	f2,f31
91	mr	r3,r1
92	fmr	f3,f31
93	xor	r4,r4,r4
94	fmr	f4,f31
95	xor	r5,r5,r5
96	fmr	f5,f31
97	xor	r6,r6,r6
98	fmr	f6,f31
99	xor	r7,r7,r7
100	fmr	f7,f31
101	xor	r8,r8,r8
102	fmr	f8,f31
103	xor	r9,r9,r9
104	fmr	f9,f31
105	xor	r10,r10,r10
106	fmr	f10,f31
107	xor	r11,r11,r11
108	fmr	f11,f31
109	xor	r12,r12,r12
110	fmr	f12,f31
111	fmr	f13,f31
112	blr
113	.long	0
114	.byte	0,12,0x14,0,0,0,0,0
115.size	.OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
116
117.globl	.OPENSSL_atomic_add
118.align	4
119.OPENSSL_atomic_add:
120Ladd:	lwarx	r5,0,r3
121	add	r0,r4,r5
122	stwcx.	r0,0,r3
123	bne-	Ladd
124	$SIGNX	r3,r0
125	blr
126	.long	0
127	.byte	0,12,0x14,0,0,0,2,0
128	.long	0
129.size	.OPENSSL_atomic_add,.-.OPENSSL_atomic_add
130
131.globl	.OPENSSL_rdtsc_mftb
132.align	4
133.OPENSSL_rdtsc_mftb:
134	mftb	r3
135	blr
136	.long	0
137	.byte	0,12,0x14,0,0,0,0,0
138.size	.OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
139
140.globl	.OPENSSL_rdtsc_mfspr268
141.align	4
142.OPENSSL_rdtsc_mfspr268:
143	mfspr	r3,268
144	blr
145	.long	0
146	.byte	0,12,0x14,0,0,0,0,0
147.size	.OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
148
149.globl	.OPENSSL_cleanse
150.align	4
151.OPENSSL_cleanse:
152	$CMPLI	r4,7
153	li	r0,0
154	bge	Lot
155	$CMPLI	r4,0
156	beqlr-
157Little:	mtctr	r4
158	stb	r0,0(r3)
159	addi	r3,r3,1
160	bdnz	\$-8
161	blr
162Lot:	andi.	r5,r3,3
163	beq	Laligned
164	stb	r0,0(r3)
165	subi	r4,r4,1
166	addi	r3,r3,1
167	b	Lot
168Laligned:
169	$SHRLI	r5,r4,2
170	mtctr	r5
171	stw	r0,0(r3)
172	addi	r3,r3,4
173	bdnz	\$-8
174	andi.	r4,r4,3
175	bne	Little
176	blr
177	.long	0
178	.byte	0,12,0x14,0,0,0,2,0
179	.long	0
180.size	.OPENSSL_cleanse,.-.OPENSSL_cleanse
181
182globl	.CRYPTO_memcmp
183.align	4
184.CRYPTO_memcmp:
185	$CMPLI	r5,0
186	li	r0,0
187	beq	Lno_data
188	mtctr	r5
189Loop_cmp:
190	lbz	r6,0(r3)
191	addi	r3,r3,1
192	lbz	r7,0(r4)
193	addi	r4,r4,1
194	xor	r6,r6,r7
195	or	r0,r0,r6
196	bdnz	Loop_cmp
197
198Lno_data:
199	li	r3,0
200	sub	r3,r3,r0
201	extrwi	r3,r3,1,0
202	blr
203	.long	0
204	.byte	0,12,0x14,0,0,0,3,0
205	.long	0
206.size	.CRYPTO_memcmp,.-.CRYPTO_memcmp
207___
208{
209my ($out,$cnt,$max)=("r3","r4","r5");
210my ($tick,$lasttick)=("r6","r7");
211my ($diff,$lastdiff)=("r8","r9");
212
213$code.=<<___;
214.globl	.OPENSSL_instrument_bus_mftb
215.align	4
216.OPENSSL_instrument_bus_mftb:
217	mtctr	$cnt
218
219	mftb	$lasttick		# collect 1st tick
220	li	$diff,0
221
222	dcbf	0,$out			# flush cache line
223	lwarx	$tick,0,$out		# load and lock
224	add	$tick,$tick,$diff
225	stwcx.	$tick,0,$out
226	stwx	$tick,0,$out
227
228Loop:	mftb	$tick
229	sub	$diff,$tick,$lasttick
230	mr	$lasttick,$tick
231	dcbf	0,$out			# flush cache line
232	lwarx	$tick,0,$out		# load and lock
233	add	$tick,$tick,$diff
234	stwcx.	$tick,0,$out
235	stwx	$tick,0,$out
236	addi	$out,$out,4		# ++$out
237	bdnz	Loop
238
239	mr	r3,$cnt
240	blr
241	.long	0
242	.byte	0,12,0x14,0,0,0,2,0
243	.long	0
244.size	.OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
245
246.globl	.OPENSSL_instrument_bus2_mftb
247.align	4
248.OPENSSL_instrument_bus2_mftb:
249	mr	r0,$cnt
250	slwi	$cnt,$cnt,2
251
252	mftb	$lasttick		# collect 1st tick
253	li	$diff,0
254
255	dcbf	0,$out			# flush cache line
256	lwarx	$tick,0,$out		# load and lock
257	add	$tick,$tick,$diff
258	stwcx.	$tick,0,$out
259	stwx	$tick,0,$out
260
261	mftb	$tick			# collect 1st diff
262	sub	$diff,$tick,$lasttick
263	mr	$lasttick,$tick
264	mr	$lastdiff,$diff
265Loop2:
266	dcbf	0,$out			# flush cache line
267	lwarx	$tick,0,$out		# load and lock
268	add	$tick,$tick,$diff
269	stwcx.	$tick,0,$out
270	stwx	$tick,0,$out
271
272	addic.	$max,$max,-1
273	beq	Ldone2
274
275	mftb	$tick
276	sub	$diff,$tick,$lasttick
277	mr	$lasttick,$tick
278	cmplw	7,$diff,$lastdiff
279	mr	$lastdiff,$diff
280
281	mfcr	$tick			# pull cr
282	not	$tick,$tick		# flip bits
283	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale
284
285	sub.	$cnt,$cnt,$tick		# conditional --$cnt
286	add	$out,$out,$tick		# conditional ++$out
287	bne	Loop2
288
289Ldone2:
290	srwi	$cnt,$cnt,2
291	sub	r3,r0,$cnt
292	blr
293	.long	0
294	.byte	0,12,0x14,0,0,0,3,0
295	.long	0
296.size	.OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
297
298.globl	.OPENSSL_instrument_bus_mfspr268
299.align	4
300.OPENSSL_instrument_bus_mfspr268:
301	mtctr	$cnt
302
303	mfspr	$lasttick,268		# collect 1st tick
304	li	$diff,0
305
306	dcbf	0,$out			# flush cache line
307	lwarx	$tick,0,$out		# load and lock
308	add	$tick,$tick,$diff
309	stwcx.	$tick,0,$out
310	stwx	$tick,0,$out
311
312Loop3:	mfspr	$tick,268
313	sub	$diff,$tick,$lasttick
314	mr	$lasttick,$tick
315	dcbf	0,$out			# flush cache line
316	lwarx	$tick,0,$out		# load and lock
317	add	$tick,$tick,$diff
318	stwcx.	$tick,0,$out
319	stwx	$tick,0,$out
320	addi	$out,$out,4		# ++$out
321	bdnz	Loop3
322
323	mr	r3,$cnt
324	blr
325	.long	0
326	.byte	0,12,0x14,0,0,0,2,0
327	.long	0
328.size	.OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
329
330.globl	.OPENSSL_instrument_bus2_mfspr268
331.align	4
332.OPENSSL_instrument_bus2_mfspr268:
333	mr	r0,$cnt
334	slwi	$cnt,$cnt,2
335
336	mfspr	$lasttick,268		# collect 1st tick
337	li	$diff,0
338
339	dcbf	0,$out			# flush cache line
340	lwarx	$tick,0,$out		# load and lock
341	add	$tick,$tick,$diff
342	stwcx.	$tick,0,$out
343	stwx	$tick,0,$out
344
345	mfspr	$tick,268		# collect 1st diff
346	sub	$diff,$tick,$lasttick
347	mr	$lasttick,$tick
348	mr	$lastdiff,$diff
349Loop4:
350	dcbf	0,$out			# flush cache line
351	lwarx	$tick,0,$out		# load and lock
352	add	$tick,$tick,$diff
353	stwcx.	$tick,0,$out
354	stwx	$tick,0,$out
355
356	addic.	$max,$max,-1
357	beq	Ldone4
358
359	mfspr	$tick,268
360	sub	$diff,$tick,$lasttick
361	mr	$lasttick,$tick
362	cmplw	7,$diff,$lastdiff
363	mr	$lastdiff,$diff
364
365	mfcr	$tick			# pull cr
366	not	$tick,$tick		# flip bits
367	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale
368
369	sub.	$cnt,$cnt,$tick		# conditional --$cnt
370	add	$out,$out,$tick		# conditional ++$out
371	bne	Loop4
372
373Ldone4:
374	srwi	$cnt,$cnt,2
375	sub	r3,r0,$cnt
376	blr
377	.long	0
378	.byte	0,12,0x14,0,0,0,3,0
379	.long	0
380.size	.OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
381___
382}
383
384$code =~ s/\`([^\`]*)\`/eval $1/gem;
385print $code;
386close STDOUT or die "error closing STDOUT: $!";
387