1238384Sjkim#!/usr/bin/env perl
2238384Sjkim
3238384Sjkim$flavour = shift;
4238384Sjkim$output = shift;
5238384Sjkimopen STDOUT,">$output";
6238384Sjkim
7238384Sjkimif ($flavour =~ /64/) {
8238384Sjkim	$LEVEL		="2.0W";
9238384Sjkim	$SIZE_T		=8;
10238384Sjkim	$ST		="std";
11238384Sjkim} else {
12238384Sjkim	$LEVEL		="1.1";
13238384Sjkim	$SIZE_T		=4;
14238384Sjkim	$ST		="stw";
15238384Sjkim}
16238384Sjkim
17238384Sjkim$rp="%r2";
18238384Sjkim$sp="%r30";
19238384Sjkim$rv="%r28";
20238384Sjkim
21238384Sjkim$code=<<___;
22238384Sjkim	.LEVEL	$LEVEL
23238384Sjkim	.SPACE	\$TEXT\$
24238384Sjkim	.SUBSPA	\$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
25238384Sjkim
26238384Sjkim	.EXPORT	OPENSSL_cpuid_setup,ENTRY
27238384Sjkim	.ALIGN	8
28238384SjkimOPENSSL_cpuid_setup
29238384Sjkim	.PROC
30238384Sjkim	.CALLINFO	NO_CALLS
31238384Sjkim	.ENTRY
32238384Sjkim	bv	($rp)
33238384Sjkim	.EXIT
34238384Sjkim	nop
35238384Sjkim	.PROCEND
36238384Sjkim
37238384Sjkim	.EXPORT	OPENSSL_rdtsc,ENTRY
38238384Sjkim	.ALIGN	8
39238384SjkimOPENSSL_rdtsc
40238384Sjkim	.PROC
41238384Sjkim	.CALLINFO	NO_CALLS
42238384Sjkim	.ENTRY
43238384Sjkim	mfctl	%cr16,$rv
44238384Sjkim	bv	($rp)
45238384Sjkim	.EXIT
46238384Sjkim	nop
47238384Sjkim	.PROCEND
48238384Sjkim
49238384Sjkim	.EXPORT	OPENSSL_wipe_cpu,ENTRY
50238384Sjkim	.ALIGN	8
51238384SjkimOPENSSL_wipe_cpu
52238384Sjkim	.PROC
53238384Sjkim	.CALLINFO	NO_CALLS
54238384Sjkim	.ENTRY
55238384Sjkim	xor		%r0,%r0,%r1
56238384Sjkim	fcpy,dbl	%fr0,%fr4
57238384Sjkim	xor		%r0,%r0,%r19
58238384Sjkim	fcpy,dbl	%fr0,%fr5
59238384Sjkim	xor		%r0,%r0,%r20
60238384Sjkim	fcpy,dbl	%fr0,%fr6
61238384Sjkim	xor		%r0,%r0,%r21
62238384Sjkim	fcpy,dbl	%fr0,%fr7
63238384Sjkim	xor		%r0,%r0,%r22
64238384Sjkim	fcpy,dbl	%fr0,%fr8
65238384Sjkim	xor		%r0,%r0,%r23
66238384Sjkim	fcpy,dbl	%fr0,%fr9
67238384Sjkim	xor		%r0,%r0,%r24
68238384Sjkim	fcpy,dbl	%fr0,%fr10
69238384Sjkim	xor		%r0,%r0,%r25
70238384Sjkim	fcpy,dbl	%fr0,%fr11
71238384Sjkim	xor		%r0,%r0,%r26
72238384Sjkim	fcpy,dbl	%fr0,%fr22
73238384Sjkim	xor		%r0,%r0,%r29
74238384Sjkim	fcpy,dbl	%fr0,%fr23
75238384Sjkim	xor		%r0,%r0,%r31
76238384Sjkim	fcpy,dbl	%fr0,%fr24
77238384Sjkim	fcpy,dbl	%fr0,%fr25
78238384Sjkim	fcpy,dbl	%fr0,%fr26
79238384Sjkim	fcpy,dbl	%fr0,%fr27
80238384Sjkim	fcpy,dbl	%fr0,%fr28
81238384Sjkim	fcpy,dbl	%fr0,%fr29
82238384Sjkim	fcpy,dbl	%fr0,%fr30
83238384Sjkim	fcpy,dbl	%fr0,%fr31
84238384Sjkim	bv		($rp)
85238384Sjkim	.EXIT
86238384Sjkim	ldo		0($sp),$rv
87238384Sjkim	.PROCEND
88238384Sjkim___
89238384Sjkim{
90238384Sjkimmy $inp="%r26";
91238384Sjkimmy $len="%r25";
92238384Sjkim
93238384Sjkim$code.=<<___;
94238384Sjkim	.EXPORT	OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
95238384Sjkim	.ALIGN	8
96238384SjkimOPENSSL_cleanse
97238384Sjkim	.PROC
98238384Sjkim	.CALLINFO	NO_CALLS
99238384Sjkim	.ENTRY
100264331Sjkim	cmpib,*=	0,$len,L\$done
101238384Sjkim	nop
102264331Sjkim	cmpib,*>>=	15,$len,L\$ittle
103238384Sjkim	ldi		$SIZE_T-1,%r1
104238384Sjkim
105264331SjkimL\$align
106238384Sjkim	and,*<>		$inp,%r1,%r28
107264331Sjkim	b,n		L\$aligned
108238384Sjkim	stb		%r0,0($inp)
109238384Sjkim	ldo		-1($len),$len
110264331Sjkim	b		L\$align
111238384Sjkim	ldo		1($inp),$inp
112238384Sjkim
113264331SjkimL\$aligned
114238384Sjkim	andcm		$len,%r1,%r28
115264331SjkimL\$ot
116238384Sjkim	$ST		%r0,0($inp)
117264331Sjkim	addib,*<>	-$SIZE_T,%r28,L\$ot
118238384Sjkim	ldo		$SIZE_T($inp),$inp
119238384Sjkim
120238384Sjkim	and,*<>		$len,%r1,$len
121264331Sjkim	b,n		L\$done
122264331SjkimL\$ittle
123238384Sjkim	stb		%r0,0($inp)
124264331Sjkim	addib,*<>	-1,$len,L\$ittle
125238384Sjkim	ldo		1($inp),$inp
126264331SjkimL\$done
127238384Sjkim	bv		($rp)
128238384Sjkim	.EXIT
129238384Sjkim	nop
130238384Sjkim	.PROCEND
131238384Sjkim___
132238384Sjkim}
133238384Sjkim{
134238384Sjkimmy ($out,$cnt,$max)=("%r26","%r25","%r24");
135238384Sjkimmy ($tick,$lasttick)=("%r23","%r22");
136238384Sjkimmy ($diff,$lastdiff)=("%r21","%r20");
137238384Sjkim
138238384Sjkim$code.=<<___;
139238384Sjkim	.EXPORT	OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR
140238384Sjkim	.ALIGN	8
141238384SjkimOPENSSL_instrument_bus
142238384Sjkim	.PROC
143238384Sjkim	.CALLINFO	NO_CALLS
144238384Sjkim	.ENTRY
145238384Sjkim	copy		$cnt,$rv
146238384Sjkim	mfctl		%cr16,$tick
147238384Sjkim	copy		$tick,$lasttick
148238384Sjkim	ldi		0,$diff
149238384Sjkim
150238384Sjkim	fdc		0($out)
151238384Sjkim	ldw		0($out),$tick
152238384Sjkim	add		$diff,$tick,$tick
153238384Sjkim	stw		$tick,0($out)
154264331SjkimL\$oop
155238384Sjkim	mfctl		%cr16,$tick
156238384Sjkim	sub		$tick,$lasttick,$diff
157238384Sjkim	copy		$tick,$lasttick
158238384Sjkim
159238384Sjkim	fdc		0($out)
160238384Sjkim	ldw		0($out),$tick
161238384Sjkim	add		$diff,$tick,$tick
162238384Sjkim	stw		$tick,0($out)
163238384Sjkim
164264331Sjkim	addib,<>	-1,$cnt,L\$oop
165238384Sjkim	addi		4,$out,$out
166238384Sjkim
167238384Sjkim	bv		($rp)
168238384Sjkim	.EXIT
169238384Sjkim	sub		$rv,$cnt,$rv
170238384Sjkim	.PROCEND
171238384Sjkim
172238384Sjkim	.EXPORT	OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR
173238384Sjkim	.ALIGN	8
174238384SjkimOPENSSL_instrument_bus2
175238384Sjkim	.PROC
176238384Sjkim	.CALLINFO	NO_CALLS
177238384Sjkim	.ENTRY
178238384Sjkim	copy		$cnt,$rv
179238384Sjkim	sub		%r0,$cnt,$cnt
180238384Sjkim
181238384Sjkim	mfctl		%cr16,$tick
182238384Sjkim	copy		$tick,$lasttick
183238384Sjkim	ldi		0,$diff
184238384Sjkim
185238384Sjkim	fdc		0($out)
186238384Sjkim	ldw		0($out),$tick
187238384Sjkim	add		$diff,$tick,$tick
188238384Sjkim	stw		$tick,0($out)
189238384Sjkim
190238384Sjkim	mfctl		%cr16,$tick
191238384Sjkim	sub		$tick,$lasttick,$diff
192238384Sjkim	copy		$tick,$lasttick
193264331SjkimL\$oop2
194238384Sjkim	copy		$diff,$lastdiff
195238384Sjkim	fdc		0($out)
196238384Sjkim	ldw		0($out),$tick
197238384Sjkim	add		$diff,$tick,$tick
198238384Sjkim	stw		$tick,0($out)
199238384Sjkim
200264331Sjkim	addib,=		-1,$max,L\$done2
201238384Sjkim	nop
202238384Sjkim
203238384Sjkim	mfctl		%cr16,$tick
204238384Sjkim	sub		$tick,$lasttick,$diff
205238384Sjkim	copy		$tick,$lasttick
206238384Sjkim	cmpclr,<>	$lastdiff,$diff,$tick
207238384Sjkim	ldi		1,$tick
208238384Sjkim
209238384Sjkim	ldi		1,%r1
210238384Sjkim	xor		%r1,$tick,$tick
211264331Sjkim	addb,<>		$tick,$cnt,L\$oop2
212238384Sjkim	shladd,l	$tick,2,$out,$out
213264331SjkimL\$done2
214238384Sjkim	bv		($rp)
215238384Sjkim	.EXIT
216238384Sjkim	add		$rv,$cnt,$rv
217238384Sjkim	.PROCEND
218238384Sjkim___
219238384Sjkim}
220264331Sjkim$code =~ s/cmpib,\*/comib,/gm	if ($SIZE_T==4);
221264331Sjkim$code =~ s/,\*/,/gm		if ($SIZE_T==4);
222264331Sjkim$code =~ s/\bbv\b/bve/gm	if ($SIZE_T==8);
223238384Sjkimprint $code;
224238384Sjkimclose STDOUT;
225238384Sjkim
226