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
34290207Sjkim.size	.OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
35238384Sjkim
36238384Sjkim.globl	.OPENSSL_altivec_probe
37238384Sjkim.align	4
38238384Sjkim.OPENSSL_altivec_probe:
39238384Sjkim	.long	0x10000484	# vor	v0,v0,v0
40238384Sjkim	blr
41238384Sjkim	.long	0
42238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
43290207Sjkim.size	.OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
44238384Sjkim
45290207Sjkim.globl	.OPENSSL_crypto207_probe
46290207Sjkim.align	4
47290207Sjkim.OPENSSL_crypto207_probe:
48290207Sjkim	lvx_u	v0,0,r1
49290207Sjkim	vcipher	v0,v0,v0
50290207Sjkim	blr
51290207Sjkim	.long	0
52290207Sjkim	.byte	0,12,0x14,0,0,0,0,0
53290207Sjkim.size	.OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
54290207Sjkim
55238384Sjkim.globl	.OPENSSL_wipe_cpu
56238384Sjkim.align	4
57238384Sjkim.OPENSSL_wipe_cpu:
58238384Sjkim	xor	r0,r0,r0
59238384Sjkim	fmr	f0,f31
60238384Sjkim	fmr	f1,f31
61238384Sjkim	fmr	f2,f31
62238384Sjkim	mr	r3,r1
63238384Sjkim	fmr	f3,f31
64238384Sjkim	xor	r4,r4,r4
65238384Sjkim	fmr	f4,f31
66238384Sjkim	xor	r5,r5,r5
67238384Sjkim	fmr	f5,f31
68238384Sjkim	xor	r6,r6,r6
69238384Sjkim	fmr	f6,f31
70238384Sjkim	xor	r7,r7,r7
71238384Sjkim	fmr	f7,f31
72238384Sjkim	xor	r8,r8,r8
73238384Sjkim	fmr	f8,f31
74238384Sjkim	xor	r9,r9,r9
75238384Sjkim	fmr	f9,f31
76238384Sjkim	xor	r10,r10,r10
77238384Sjkim	fmr	f10,f31
78238384Sjkim	xor	r11,r11,r11
79238384Sjkim	fmr	f11,f31
80238384Sjkim	xor	r12,r12,r12
81238384Sjkim	fmr	f12,f31
82238384Sjkim	fmr	f13,f31
83238384Sjkim	blr
84238384Sjkim	.long	0
85238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
86290207Sjkim.size	.OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
87238384Sjkim
88238384Sjkim.globl	.OPENSSL_atomic_add
89238384Sjkim.align	4
90238384Sjkim.OPENSSL_atomic_add:
91238384SjkimLadd:	lwarx	r5,0,r3
92238384Sjkim	add	r0,r4,r5
93238384Sjkim	stwcx.	r0,0,r3
94238384Sjkim	bne-	Ladd
95238384Sjkim	$SIGNX	r3,r0
96238384Sjkim	blr
97238384Sjkim	.long	0
98238384Sjkim	.byte	0,12,0x14,0,0,0,2,0
99238384Sjkim	.long	0
100290207Sjkim.size	.OPENSSL_atomic_add,.-.OPENSSL_atomic_add
101238384Sjkim
102238384Sjkim.globl	.OPENSSL_rdtsc
103238384Sjkim.align	4
104238384Sjkim.OPENSSL_rdtsc:
105238384Sjkim	mftb	r3
106238384Sjkim	mftbu	r4
107238384Sjkim	blr
108238384Sjkim	.long	0
109238384Sjkim	.byte	0,12,0x14,0,0,0,0,0
110290207Sjkim.size	.OPENSSL_rdtsc,.-.OPENSSL_rdtsc
111238384Sjkim
112238384Sjkim.globl	.OPENSSL_cleanse
113238384Sjkim.align	4
114238384Sjkim.OPENSSL_cleanse:
115238384Sjkim	$CMPLI	r4,7
116238384Sjkim	li	r0,0
117238384Sjkim	bge	Lot
118238384Sjkim	$CMPLI	r4,0
119238384Sjkim	beqlr-
120238384SjkimLittle:	mtctr	r4
121238384Sjkim	stb	r0,0(r3)
122238384Sjkim	addi	r3,r3,1
123238384Sjkim	bdnz	\$-8
124238384Sjkim	blr
125238384SjkimLot:	andi.	r5,r3,3
126238384Sjkim	beq	Laligned
127238384Sjkim	stb	r0,0(r3)
128238384Sjkim	subi	r4,r4,1
129238384Sjkim	addi	r3,r3,1
130238384Sjkim	b	Lot
131238384SjkimLaligned:
132238384Sjkim	$SHRLI	r5,r4,2
133238384Sjkim	mtctr	r5
134238384Sjkim	stw	r0,0(r3)
135238384Sjkim	addi	r3,r3,4
136238384Sjkim	bdnz	\$-8
137238384Sjkim	andi.	r4,r4,3
138238384Sjkim	bne	Little
139238384Sjkim	blr
140238384Sjkim	.long	0
141238384Sjkim	.byte	0,12,0x14,0,0,0,2,0
142238384Sjkim	.long	0
143290207Sjkim.size	.OPENSSL_cleanse,.-.OPENSSL_cleanse
144238384Sjkim___
145238384Sjkim
146238384Sjkim$code =~ s/\`([^\`]*)\`/eval $1/gem;
147238384Sjkimprint $code;
148238384Sjkimclose STDOUT;
149