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
35.globl	.OPENSSL_altivec_probe
36.align	4
37.OPENSSL_altivec_probe:
38	.long	0x10000484	# vor	v0,v0,v0
39	blr
40	.long	0
41	.byte	0,12,0x14,0,0,0,0,0
42
43.globl	.OPENSSL_wipe_cpu
44.align	4
45.OPENSSL_wipe_cpu:
46	xor	r0,r0,r0
47	fmr	f0,f31
48	fmr	f1,f31
49	fmr	f2,f31
50	mr	r3,r1
51	fmr	f3,f31
52	xor	r4,r4,r4
53	fmr	f4,f31
54	xor	r5,r5,r5
55	fmr	f5,f31
56	xor	r6,r6,r6
57	fmr	f6,f31
58	xor	r7,r7,r7
59	fmr	f7,f31
60	xor	r8,r8,r8
61	fmr	f8,f31
62	xor	r9,r9,r9
63	fmr	f9,f31
64	xor	r10,r10,r10
65	fmr	f10,f31
66	xor	r11,r11,r11
67	fmr	f11,f31
68	xor	r12,r12,r12
69	fmr	f12,f31
70	fmr	f13,f31
71	blr
72	.long	0
73	.byte	0,12,0x14,0,0,0,0,0
74
75.globl	.OPENSSL_atomic_add
76.align	4
77.OPENSSL_atomic_add:
78Ladd:	lwarx	r5,0,r3
79	add	r0,r4,r5
80	stwcx.	r0,0,r3
81	bne-	Ladd
82	$SIGNX	r3,r0
83	blr
84	.long	0
85	.byte	0,12,0x14,0,0,0,2,0
86	.long	0
87
88.globl	.OPENSSL_rdtsc
89.align	4
90.OPENSSL_rdtsc:
91Lrdtsc:
92	mftb	r5
93	mftbu	r4
94	mftb	r3
95	cmplw	r3,r5
96	bne	Lrdtsc
97	blr
98	.long	0
99	.byte	0,12,0x14,0,0,0,0,0
100
101.globl	.OPENSSL_cleanse
102.align	4
103.OPENSSL_cleanse:
104	$CMPLI	r4,7
105	li	r0,0
106	bge	Lot
107	$CMPLI	r4,0
108	beqlr-
109Little:	mtctr	r4
110	stb	r0,0(r3)
111	addi	r3,r3,1
112	bdnz	\$-8
113	blr
114Lot:	andi.	r5,r3,3
115	beq	Laligned
116	stb	r0,0(r3)
117	subi	r4,r4,1
118	addi	r3,r3,1
119	b	Lot
120Laligned:
121	$SHRLI	r5,r4,2
122	mtctr	r5
123	stw	r0,0(r3)
124	addi	r3,r3,4
125	bdnz	\$-8
126	andi.	r4,r4,3
127	bne	Little
128	blr
129	.long	0
130	.byte	0,12,0x14,0,0,0,2,0
131	.long	0
132___
133
134$code =~ s/\`([^\`]*)\`/eval $1/gem;
135print $code;
136close STDOUT;
137