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_cpuid_setup
27.align	4
28.OPENSSL_cpuid_setup:
29	blr
30
31.globl	.OPENSSL_wipe_cpu
32.align	4
33.OPENSSL_wipe_cpu:
34	xor	r0,r0,r0
35	mr	r3,r1
36	xor	r4,r4,r4
37	xor	r5,r5,r5
38	xor	r6,r6,r6
39	xor	r7,r7,r7
40	xor	r8,r8,r8
41	xor	r9,r9,r9
42	xor	r10,r10,r10
43	xor	r11,r11,r11
44	xor	r12,r12,r12
45	blr
46
47.globl	.OPENSSL_atomic_add
48.align	4
49.OPENSSL_atomic_add:
50Loop:	lwarx	r5,0,r3
51	add	r0,r4,r5
52	stwcx.	r0,0,r3
53	bne-	Loop
54	$SIGNX	r3,r0
55	blr
56
57.globl	.OPENSSL_rdtsc
58.align	4
59.OPENSSL_rdtsc:
60	mftb	r3
61	mftbu	r4
62	blr
63
64.globl	.OPENSSL_cleanse
65.align	4
66.OPENSSL_cleanse:
67	$CMPLI	r4,7
68	li	r0,0
69	bge	Lot
70	$CMPLI	r4,0
71	beqlr-
72Little:	mtctr	r4
73	stb	r0,0(r3)
74	addi	r3,r3,1
75	bdnz	\$-8
76	blr
77Lot:	andi.	r5,r3,3
78	beq	Laligned
79	stb	r0,0(r3)
80	subi	r4,r4,1
81	addi	r3,r3,1
82	b	Lot
83Laligned:
84	$SHRLI	r5,r4,2
85	mtctr	r5
86	stw	r0,0(r3)
87	addi	r3,r3,4
88	bdnz	\$-8
89	andi.	r4,r4,3
90	bne	Little
91	blr
92___
93
94$code =~ s/\`([^\`]*)\`/eval $1/gem;
95print $code;
96close STDOUT;
97