blob: bfc56fdc7fc04be2f8f92f64a5d7e8645e18a9ce [file] [log] [blame]
Andy Polyakovcb3b9b12009-12-27 20:49:40 +00001#!/usr/bin/env perl
2
3$flavour = shift;
4$output = shift;
5open STDOUT,">$output";
6
7if ($flavour =~ /64/) {
8 $LEVEL ="2.0W";
9 $SIZE_T =8;
10 $ST ="std";
11} else {
12 $LEVEL ="1.1";
13 $SIZE_T =4;
14 $ST ="stw";
15}
16
17$rp="%r2";
18$sp="%r30";
19$rv="%r28";
20
21$code=<<___;
22 .LEVEL $LEVEL
23 .SPACE \$TEXT\$
24 .SUBSPA \$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
25
Andy Polyakov3fc2efd2009-12-28 16:13:35 +000026 .EXPORT OPENSSL_cpuid_setup,ENTRY
27 .ALIGN 8
28OPENSSL_cpuid_setup
29 .PROC
30 .CALLINFO NO_CALLS
31 .ENTRY
32 bv ($rp)
33 .EXIT
34 nop
35 .PROCEND
36
Andy Polyakovcb3b9b12009-12-27 20:49:40 +000037 .EXPORT OPENSSL_rdtsc,ENTRY
38 .ALIGN 8
39OPENSSL_rdtsc
40 .PROC
41 .CALLINFO NO_CALLS
42 .ENTRY
43 mfctl %cr16,$rv
44 bv ($rp)
45 .EXIT
46 nop
47 .PROCEND
48
49 .EXPORT OPENSSL_wipe_cpu,ENTRY
50 .ALIGN 8
51OPENSSL_wipe_cpu
52 .PROC
53 .CALLINFO NO_CALLS
54 .ENTRY
55 xor %r0,%r0,%r1
56 fcpy,dbl %fr0,%fr4
57 xor %r0,%r0,%r19
58 fcpy,dbl %fr0,%fr5
59 xor %r0,%r0,%r20
60 fcpy,dbl %fr0,%fr6
61 xor %r0,%r0,%r21
62 fcpy,dbl %fr0,%fr7
63 xor %r0,%r0,%r22
64 fcpy,dbl %fr0,%fr8
65 xor %r0,%r0,%r23
66 fcpy,dbl %fr0,%fr9
67 xor %r0,%r0,%r24
68 fcpy,dbl %fr0,%fr10
69 xor %r0,%r0,%r25
70 fcpy,dbl %fr0,%fr11
71 xor %r0,%r0,%r26
72 fcpy,dbl %fr0,%fr22
73 xor %r0,%r0,%r29
74 fcpy,dbl %fr0,%fr23
75 xor %r0,%r0,%r31
76 fcpy,dbl %fr0,%fr24
77 fcpy,dbl %fr0,%fr25
78 fcpy,dbl %fr0,%fr26
79 fcpy,dbl %fr0,%fr27
80 fcpy,dbl %fr0,%fr28
81 fcpy,dbl %fr0,%fr29
82 fcpy,dbl %fr0,%fr30
83 fcpy,dbl %fr0,%fr31
84 bv ($rp)
85 .EXIT
86 ldo 0($sp),$rv
87 .PROCEND
88___
89{
Andy Polyakov5fabb882011-04-17 12:46:00 +000090my $inp="%r26";
91my $len="%r25";
Andy Polyakovcb3b9b12009-12-27 20:49:40 +000092
93$code.=<<___;
94 .EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
95 .ALIGN 8
96OPENSSL_cleanse
97 .PROC
98 .CALLINFO NO_CALLS
99 .ENTRY
Andy Polyakov02450ec2013-06-18 10:37:00 +0200100 cmpib,*= 0,$len,L\$done
Andy Polyakov82a66ce2010-01-24 15:04:28 +0000101 nop
Andy Polyakov02450ec2013-06-18 10:37:00 +0200102 cmpib,*>>= 15,$len,L\$ittle
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000103 ldi $SIZE_T-1,%r1
104
Andy Polyakov02450ec2013-06-18 10:37:00 +0200105L\$align
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000106 and,*<> $inp,%r1,%r28
Andy Polyakov02450ec2013-06-18 10:37:00 +0200107 b,n L\$aligned
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000108 stb %r0,0($inp)
109 ldo -1($len),$len
Andy Polyakov02450ec2013-06-18 10:37:00 +0200110 b L\$align
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000111 ldo 1($inp),$inp
112
Andy Polyakov02450ec2013-06-18 10:37:00 +0200113L\$aligned
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000114 andcm $len,%r1,%r28
Andy Polyakov02450ec2013-06-18 10:37:00 +0200115L\$ot
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000116 $ST %r0,0($inp)
Andy Polyakov02450ec2013-06-18 10:37:00 +0200117 addib,*<> -$SIZE_T,%r28,L\$ot
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000118 ldo $SIZE_T($inp),$inp
119
120 and,*<> $len,%r1,$len
Andy Polyakov02450ec2013-06-18 10:37:00 +0200121 b,n L\$done
122L\$ittle
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000123 stb %r0,0($inp)
Andy Polyakov02450ec2013-06-18 10:37:00 +0200124 addib,*<> -1,$len,L\$ittle
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000125 ldo 1($inp),$inp
Andy Polyakov02450ec2013-06-18 10:37:00 +0200126L\$done
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000127 bv ($rp)
128 .EXIT
129 nop
130 .PROCEND
131___
132}
Andy Polyakov5fabb882011-04-17 12:46:00 +0000133{
134my ($out,$cnt,$max)=("%r26","%r25","%r24");
135my ($tick,$lasttick)=("%r23","%r22");
136my ($diff,$lastdiff)=("%r21","%r20");
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000137
Andy Polyakov5fabb882011-04-17 12:46:00 +0000138$code.=<<___;
139 .EXPORT OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR
140 .ALIGN 8
141OPENSSL_instrument_bus
142 .PROC
143 .CALLINFO NO_CALLS
144 .ENTRY
145 copy $cnt,$rv
146 mfctl %cr16,$tick
147 copy $tick,$lasttick
148 ldi 0,$diff
149
150 fdc 0($out)
151 ldw 0($out),$tick
152 add $diff,$tick,$tick
153 stw $tick,0($out)
Andy Polyakov02450ec2013-06-18 10:37:00 +0200154L\$oop
Andy Polyakov5fabb882011-04-17 12:46:00 +0000155 mfctl %cr16,$tick
156 sub $tick,$lasttick,$diff
157 copy $tick,$lasttick
158
159 fdc 0($out)
160 ldw 0($out),$tick
161 add $diff,$tick,$tick
162 stw $tick,0($out)
163
Andy Polyakov02450ec2013-06-18 10:37:00 +0200164 addib,<> -1,$cnt,L\$oop
Andy Polyakov5fabb882011-04-17 12:46:00 +0000165 addi 4,$out,$out
166
167 bv ($rp)
168 .EXIT
169 sub $rv,$cnt,$rv
170 .PROCEND
171
172 .EXPORT OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR
173 .ALIGN 8
174OPENSSL_instrument_bus2
175 .PROC
176 .CALLINFO NO_CALLS
177 .ENTRY
178 copy $cnt,$rv
179 sub %r0,$cnt,$cnt
180
181 mfctl %cr16,$tick
182 copy $tick,$lasttick
183 ldi 0,$diff
184
185 fdc 0($out)
186 ldw 0($out),$tick
187 add $diff,$tick,$tick
188 stw $tick,0($out)
189
190 mfctl %cr16,$tick
191 sub $tick,$lasttick,$diff
192 copy $tick,$lasttick
Andy Polyakov02450ec2013-06-18 10:37:00 +0200193L\$oop2
Andy Polyakov5fabb882011-04-17 12:46:00 +0000194 copy $diff,$lastdiff
195 fdc 0($out)
196 ldw 0($out),$tick
197 add $diff,$tick,$tick
198 stw $tick,0($out)
199
Andy Polyakov02450ec2013-06-18 10:37:00 +0200200 addib,= -1,$max,L\$done2
Andy Polyakov5fabb882011-04-17 12:46:00 +0000201 nop
202
203 mfctl %cr16,$tick
204 sub $tick,$lasttick,$diff
205 copy $tick,$lasttick
206 cmpclr,<> $lastdiff,$diff,$tick
207 ldi 1,$tick
208
209 ldi 1,%r1
210 xor %r1,$tick,$tick
Andy Polyakov02450ec2013-06-18 10:37:00 +0200211 addb,<> $tick,$cnt,L\$oop2
Andy Polyakov5fabb882011-04-17 12:46:00 +0000212 shladd,l $tick,2,$out,$out
Andy Polyakov02450ec2013-06-18 10:37:00 +0200213L\$done2
Andy Polyakov5fabb882011-04-17 12:46:00 +0000214 bv ($rp)
215 .EXIT
216 add $rv,$cnt,$rv
217 .PROCEND
218___
219}
Andy Polyakov02450ec2013-06-18 10:37:00 +0200220$code =~ s/cmpib,\*/comib,/gm if ($SIZE_T==4);
221$code =~ s/,\*/,/gm if ($SIZE_T==4);
222$code =~ s/\bbv\b/bve/gm if ($SIZE_T==8);
Andy Polyakovcb3b9b12009-12-27 20:49:40 +0000223print $code;
224close STDOUT;
225