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:
91	mftb	r3
92	mftbu	r4
93	blr
94	.long	0
95	.byte	0,12,0x14,0,0,0,0,0
96
97.globl	.OPENSSL_cleanse
98.align	4
99.OPENSSL_cleanse:
100	$CMPLI	r4,7
101	li	r0,0
102	bge	Lot
103	$CMPLI	r4,0
104	beqlr-
105Little:	mtctr	r4
106	stb	r0,0(r3)
107	addi	r3,r3,1
108	bdnz	\$-8
109	blr
110Lot:	andi.	r5,r3,3
111	beq	Laligned
112	stb	r0,0(r3)
113	subi	r4,r4,1
114	addi	r3,r3,1
115	b	Lot
116Laligned:
117	$SHRLI	r5,r4,2
118	mtctr	r5
119	stw	r0,0(r3)
120	addi	r3,r3,4
121	bdnz	\$-8
122	andi.	r4,r4,3
123	bne	Little
124	blr
125	.long	0
126	.byte	0,12,0x14,0,0,0,2,0
127	.long	0
128___
129
130$code =~ s/\`([^\`]*)\`/eval $1/gem;
131print $code;
132close STDOUT;
133