1238384Sjkim#!/usr/bin/env perl
2238384Sjkim
3238384Sjkim$flavour = shift;
4238384Sjkim
5238384Sjkim$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
6238384Sjkim( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
7238384Sjkim( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
8238384Sjkimdie "can't locate ppc-xlate.pl";
9238384Sjkim
10238384Sjkimopen STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
11238384Sjkim
12238384Sjkimif ($flavour=~/64/) {
13238384Sjkim    $CMPLI="cmpldi";
14238384Sjkim    $SHRLI="srdi";
15238384Sjkim    $SIGNX="extsw";
16238384Sjkim} else {
17238384Sjkim    $CMPLI="cmplwi";
18238384Sjkim    $SHRLI="srwi";
19238384Sjkim    $SIGNX="mr";
20238384Sjkim}
21238384Sjkim
22238384Sjkim$code=<<___;
23238384Sjkim.machine	"any"
24238384Sjkim.text
25238384Sjkim
26238384Sjkim.globl	.OPENSSL_ppc64_probe
27238384Sjkim.align	4
28238384Sjkim.OPENSSL_ppc64_probe:
29238384Sjkim	fcfid	f1,f1
30238384Sjkim	extrdi	r0,r0,32,0
31238384Sjkim	blr
32238384Sjkim	.long	0
33238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
34238384Sjkim
35238384Sjkim.globl	.OPENSSL_altivec_probe
36238384Sjkim.align	4
37238384Sjkim.OPENSSL_altivec_probe:
38238384Sjkim	.long	0x10000484	# vor	v0,v0,v0
39238384Sjkim	blr
40238384Sjkim	.long	0
41238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
42238384Sjkim
43238384Sjkim.globl	.OPENSSL_wipe_cpu
44238384Sjkim.align	4
45238384Sjkim.OPENSSL_wipe_cpu:
46238384Sjkim	xor	r0,r0,r0
47238384Sjkim	fmr	f0,f31
48238384Sjkim	fmr	f1,f31
49238384Sjkim	fmr	f2,f31
50238384Sjkim	mr	r3,r1
51238384Sjkim	fmr	f3,f31
52238384Sjkim	xor	r4,r4,r4
53238384Sjkim	fmr	f4,f31
54238384Sjkim	xor	r5,r5,r5
55238384Sjkim	fmr	f5,f31
56238384Sjkim	xor	r6,r6,r6
57238384Sjkim	fmr	f6,f31
58238384Sjkim	xor	r7,r7,r7
59238384Sjkim	fmr	f7,f31
60238384Sjkim	xor	r8,r8,r8
61238384Sjkim	fmr	f8,f31
62238384Sjkim	xor	r9,r9,r9
63238384Sjkim	fmr	f9,f31
64238384Sjkim	xor	r10,r10,r10
65238384Sjkim	fmr	f10,f31
66238384Sjkim	xor	r11,r11,r11
67238384Sjkim	fmr	f11,f31
68238384Sjkim	xor	r12,r12,r12
69238384Sjkim	fmr	f12,f31
70238384Sjkim	fmr	f13,f31
71238384Sjkim	blr
72238384Sjkim	.long	0
73238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
74238384Sjkim
75238384Sjkim.globl	.OPENSSL_atomic_add
76238384Sjkim.align	4
77238384Sjkim.OPENSSL_atomic_add:
78238384SjkimLadd:	lwarx	r5,0,r3
79238384Sjkim	add	r0,r4,r5
80238384Sjkim	stwcx.	r0,0,r3
81238384Sjkim	bne-	Ladd
82238384Sjkim	$SIGNX	r3,r0
83238384Sjkim	blr
84238384Sjkim	.long	0
85238384Sjkim	.byte	0,12,0x14,0,0,0,2,0
86238384Sjkim	.long	0
87238384Sjkim
88238384Sjkim.globl	.OPENSSL_rdtsc
89238384Sjkim.align	4
90238384Sjkim.OPENSSL_rdtsc:
91238384Sjkim	mftb	r3
92238384Sjkim	mftbu	r4
93238384Sjkim	blr
94238384Sjkim	.long	0
95238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
96238384Sjkim
97238384Sjkim.globl	.OPENSSL_cleanse
98238384Sjkim.align	4
99238384Sjkim.OPENSSL_cleanse:
100238384Sjkim	$CMPLI	r4,7
101238384Sjkim	li	r0,0
102238384Sjkim	bge	Lot
103238384Sjkim	$CMPLI	r4,0
104238384Sjkim	beqlr-
105238384SjkimLittle:	mtctr	r4
106238384Sjkim	stb	r0,0(r3)
107238384Sjkim	addi	r3,r3,1
108238384Sjkim	bdnz	\$-8
109238384Sjkim	blr
110238384SjkimLot:	andi.	r5,r3,3
111238384Sjkim	beq	Laligned
112238384Sjkim	stb	r0,0(r3)
113238384Sjkim	subi	r4,r4,1
114238384Sjkim	addi	r3,r3,1
115238384Sjkim	b	Lot
116238384SjkimLaligned:
117238384Sjkim	$SHRLI	r5,r4,2
118238384Sjkim	mtctr	r5
119238384Sjkim	stw	r0,0(r3)
120238384Sjkim	addi	r3,r3,4
121238384Sjkim	bdnz	\$-8
122238384Sjkim	andi.	r4,r4,3
123238384Sjkim	bne	Little
124238384Sjkim	blr
125238384Sjkim	.long	0
126238384Sjkim	.byte	0,12,0x14,0,0,0,2,0
127238384Sjkim	.long	0
128238384Sjkim___
129238384Sjkim
130238384Sjkim$code =~ s/\`([^\`]*)\`/eval $1/gem;
131238384Sjkimprint $code;
132238384Sjkimclose STDOUT;
133