1#!/usr/bin/env perl
2
3$flavour = shift;
4
5$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
6( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
7( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
8die "can't locate ppc-xlate.pl";
9
10open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
11
12if ($flavour=~/64/) {
13    $CMPLI="cmpldi";
14    $SHRLI="srdi";
15    $SIGNX="extsw";
16} else {
17    $CMPLI="cmplwi";
18    $SHRLI="srwi";
19    $SIGNX="mr";
20}
21
22$code=<<___;
23.machine	"any"
24.text
25
26.globl	.OPENSSL_ppc64_probe
27.align	4
28.OPENSSL_ppc64_probe:
29	fcfid	f1,f1
30	extrdi	r0,r0,32,0
31	blr
32	.long	0
33	.byte	0,12,0x14,0,0,0,0,0
34.size	.OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
35
36.globl	.OPENSSL_altivec_probe
37.align	4
38.OPENSSL_altivec_probe:
39	.long	0x10000484	# vor	v0,v0,v0
40	blr
41	.long	0
42	.byte	0,12,0x14,0,0,0,0,0
43.size	.OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
44
45.globl	.OPENSSL_crypto207_probe
46.align	4
47.OPENSSL_crypto207_probe:
48	lvx_u	v0,0,r1
49	vcipher	v0,v0,v0
50	blr
51	.long	0
52	.byte	0,12,0x14,0,0,0,0,0
53.size	.OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
54
55.globl	.OPENSSL_wipe_cpu
56.align	4
57.OPENSSL_wipe_cpu:
58	xor	r0,r0,r0
59	fmr	f0,f31
60	fmr	f1,f31
61	fmr	f2,f31
62	mr	r3,r1
63	fmr	f3,f31
64	xor	r4,r4,r4
65	fmr	f4,f31
66	xor	r5,r5,r5
67	fmr	f5,f31
68	xor	r6,r6,r6
69	fmr	f6,f31
70	xor	r7,r7,r7
71	fmr	f7,f31
72	xor	r8,r8,r8
73	fmr	f8,f31
74	xor	r9,r9,r9
75	fmr	f9,f31
76	xor	r10,r10,r10
77	fmr	f10,f31
78	xor	r11,r11,r11
79	fmr	f11,f31
80	xor	r12,r12,r12
81	fmr	f12,f31
82	fmr	f13,f31
83	blr
84	.long	0
85	.byte	0,12,0x14,0,0,0,0,0
86.size	.OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
87
88.globl	.OPENSSL_atomic_add
89.align	4
90.OPENSSL_atomic_add:
91Ladd:	lwarx	r5,0,r3
92	add	r0,r4,r5
93	stwcx.	r0,0,r3
94	bne-	Ladd
95	$SIGNX	r3,r0
96	blr
97	.long	0
98	.byte	0,12,0x14,0,0,0,2,0
99	.long	0
100.size	.OPENSSL_atomic_add,.-.OPENSSL_atomic_add
101
102.globl	.OPENSSL_rdtsc
103.align	4
104.OPENSSL_rdtsc:
105	mftb	r3
106	mftbu	r4
107	blr
108	.long	0
109	.byte	0,12,0x14,0,0,0,0,0
110.size	.OPENSSL_rdtsc,.-.OPENSSL_rdtsc
111
112.globl	.OPENSSL_cleanse
113.align	4
114.OPENSSL_cleanse:
115	$CMPLI	r4,7
116	li	r0,0
117	bge	Lot
118	$CMPLI	r4,0
119	beqlr-
120Little:	mtctr	r4
121	stb	r0,0(r3)
122	addi	r3,r3,1
123	bdnz	\$-8
124	blr
125Lot:	andi.	r5,r3,3
126	beq	Laligned
127	stb	r0,0(r3)
128	subi	r4,r4,1
129	addi	r3,r3,1
130	b	Lot
131Laligned:
132	$SHRLI	r5,r4,2
133	mtctr	r5
134	stw	r0,0(r3)
135	addi	r3,r3,4
136	bdnz	\$-8
137	andi.	r4,r4,3
138	bne	Little
139	blr
140	.long	0
141	.byte	0,12,0x14,0,0,0,2,0
142	.long	0
143.size	.OPENSSL_cleanse,.-.OPENSSL_cleanse
144___
145
146$code =~ s/\`([^\`]*)\`/eval $1/gem;
147print $code;
148close STDOUT;
149