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