]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/ppccpuid.pl
Refactor config - @MK1MF_Builds out, general build scheme in
[thirdparty/openssl.git] / crypto / ppccpuid.pl
CommitLineData
9c9c83cc
AP
1#!/usr/bin/env perl
2
addd641f 3$flavour = shift;
9c9c83cc
AP
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
addd641f 10open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
9c9c83cc 11
addd641f 12if ($flavour=~/64/) {
9c9c83cc
AP
13 $CMPLI="cmpldi";
14 $SHRLI="srdi";
15 $SIGNX="extsw";
16} else {
17 $CMPLI="cmplwi";
18 $SHRLI="srwi";
19 $SIGNX="mr";
20}
21
22$code=<<___;
492279f6 23.machine "any"
9c9c83cc
AP
24.text
25
81eae077
AP
26.globl .OPENSSL_fpu_probe
27.align 4
28.OPENSSL_fpu_probe:
29 fmr f0,f0
30 blr
31 .long 0
32 .byte 0,12,0x14,0,0,0,0,0
33.size .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
b4b48a10 34.globl .OPENSSL_ppc64_probe
9c9c83cc 35.align 4
b4b48a10
AP
36.OPENSSL_ppc64_probe:
37 fcfid f1,f1
38 extrdi r0,r0,32,0
9c9c83cc 39 blr
67150340
AP
40 .long 0
41 .byte 0,12,0x14,0,0,0,0,0
d6019e16 42.size .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
9c9c83cc 43
6415dd7b
AP
44.globl .OPENSSL_altivec_probe
45.align 4
46.OPENSSL_altivec_probe:
47 .long 0x10000484 # vor v0,v0,v0
48 blr
67150340
AP
49 .long 0
50 .byte 0,12,0x14,0,0,0,0,0
d6019e16 51.size .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
6415dd7b 52
de51e830
AP
53.globl .OPENSSL_crypto207_probe
54.align 4
d86689e1 55.OPENSSL_crypto207_probe:
de51e830
AP
56 lvx_u v0,0,r1
57 vcipher v0,v0,v0
58 blr
59 .long 0
60 .byte 0,12,0x14,0,0,0,0,0
61.size .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
62
9c9c83cc
AP
63.globl .OPENSSL_wipe_cpu
64.align 4
65.OPENSSL_wipe_cpu:
66 xor r0,r0,r0
78a533cb
AP
67 fmr f0,f31
68 fmr f1,f31
69 fmr f2,f31
9c9c83cc 70 mr r3,r1
78a533cb 71 fmr f3,f31
9c9c83cc 72 xor r4,r4,r4
78a533cb 73 fmr f4,f31
9c9c83cc 74 xor r5,r5,r5
78a533cb 75 fmr f5,f31
9c9c83cc 76 xor r6,r6,r6
78a533cb 77 fmr f6,f31
9c9c83cc 78 xor r7,r7,r7
78a533cb 79 fmr f7,f31
9c9c83cc 80 xor r8,r8,r8
78a533cb 81 fmr f8,f31
9c9c83cc 82 xor r9,r9,r9
78a533cb 83 fmr f9,f31
9c9c83cc 84 xor r10,r10,r10
78a533cb 85 fmr f10,f31
9c9c83cc 86 xor r11,r11,r11
78a533cb 87 fmr f11,f31
9c9c83cc 88 xor r12,r12,r12
78a533cb
AP
89 fmr f12,f31
90 fmr f13,f31
9c9c83cc 91 blr
67150340
AP
92 .long 0
93 .byte 0,12,0x14,0,0,0,0,0
d6019e16 94.size .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
9c9c83cc
AP
95
96.globl .OPENSSL_atomic_add
97.align 4
98.OPENSSL_atomic_add:
5fabb88a 99Ladd: lwarx r5,0,r3
9c9c83cc
AP
100 add r0,r4,r5
101 stwcx. r0,0,r3
5fabb88a 102 bne- Ladd
9c9c83cc
AP
103 $SIGNX r3,r0
104 blr
67150340
AP
105 .long 0
106 .byte 0,12,0x14,0,0,0,2,0
107 .long 0
d6019e16 108.size .OPENSSL_atomic_add,.-.OPENSSL_atomic_add
9c9c83cc
AP
109
110.globl .OPENSSL_rdtsc
111.align 4
112.OPENSSL_rdtsc:
81eae077
AP
113___
114$code.=<<___ if ($flavour =~ /64/);
115 mftb r3
116___
117$code.=<<___ if ($flavour !~ /64/);
118Loop_rdtsc:
119 mftbu r5
9c9c83cc
AP
120 mftb r3
121 mftbu r4
81eae077
AP
122 cmplw r4,r5
123 bne Loop_rdtsc
124___
125$code.=<<___;
9c9c83cc 126 blr
67150340
AP
127 .long 0
128 .byte 0,12,0x14,0,0,0,0,0
d6019e16 129.size .OPENSSL_rdtsc,.-.OPENSSL_rdtsc
9c9c83cc
AP
130
131.globl .OPENSSL_cleanse
132.align 4
133.OPENSSL_cleanse:
134 $CMPLI r4,7
135 li r0,0
136 bge Lot
7676eebf
AP
137 $CMPLI r4,0
138 beqlr-
9c9c83cc
AP
139Little: mtctr r4
140 stb r0,0(r3)
141 addi r3,r3,1
9474483a 142 bdnz \$-8
9c9c83cc
AP
143 blr
144Lot: andi. r5,r3,3
145 beq Laligned
146 stb r0,0(r3)
147 subi r4,r4,1
148 addi r3,r3,1
149 b Lot
150Laligned:
151 $SHRLI r5,r4,2
152 mtctr r5
153 stw r0,0(r3)
154 addi r3,r3,4
9474483a 155 bdnz \$-8
9c9c83cc
AP
156 andi. r4,r4,3
157 bne Little
158 blr
67150340
AP
159 .long 0
160 .byte 0,12,0x14,0,0,0,2,0
161 .long 0
d6019e16 162.size .OPENSSL_cleanse,.-.OPENSSL_cleanse
9c9c83cc 163___
5fabb88a
AP
164{
165my ($out,$cnt,$max)=("r3","r4","r5");
166my ($tick,$lasttick)=("r6","r7");
167my ($diff,$lastdiff)=("r8","r9");
168
169$code.=<<___;
170.globl .OPENSSL_instrument_bus
171.align 4
172.OPENSSL_instrument_bus:
173 mtctr $cnt
174
175 mftb $lasttick # collect 1st tick
176 li $diff,0
177
178 dcbf 0,$out # flush cache line
179 lwarx $tick,0,$out # load and lock
180 add $tick,$tick,$diff
181 stwcx. $tick,0,$out
182 stwx $tick,0,$out
183
184Loop: mftb $tick
185 sub $diff,$tick,$lasttick
186 mr $lasttick,$tick
187 dcbf 0,$out # flush cache line
188 lwarx $tick,0,$out # load and lock
189 add $tick,$tick,$diff
190 stwcx. $tick,0,$out
191 stwx $tick,0,$out
192 addi $out,$out,4 # ++$out
193 bdnz Loop
194
195 mr r3,$cnt
196 blr
67150340
AP
197 .long 0
198 .byte 0,12,0x14,0,0,0,2,0
199 .long 0
d6019e16 200.size .OPENSSL_instrument_bus,.-.OPENSSL_instrument_bus
5fabb88a
AP
201
202.globl .OPENSSL_instrument_bus2
203.align 4
204.OPENSSL_instrument_bus2:
205 mr r0,$cnt
206 slwi $cnt,$cnt,2
207
208 mftb $lasttick # collect 1st tick
209 li $diff,0
210
211 dcbf 0,$out # flush cache line
212 lwarx $tick,0,$out # load and lock
213 add $tick,$tick,$diff
214 stwcx. $tick,0,$out
215 stwx $tick,0,$out
216
217 mftb $tick # collect 1st diff
218 sub $diff,$tick,$lasttick
219 mr $lasttick,$tick
220 mr $lastdiff,$diff
221Loop2:
222 dcbf 0,$out # flush cache line
223 lwarx $tick,0,$out # load and lock
224 add $tick,$tick,$diff
225 stwcx. $tick,0,$out
226 stwx $tick,0,$out
227
228 addic. $max,$max,-1
229 beq Ldone2
230
231 mftb $tick
232 sub $diff,$tick,$lasttick
233 mr $lasttick,$tick
234 cmplw 7,$diff,$lastdiff
235 mr $lastdiff,$diff
236
237 mfcr $tick # pull cr
238 not $tick,$tick # flip bits
239 rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale
240
241 sub. $cnt,$cnt,$tick # conditional --$cnt
242 add $out,$out,$tick # conditional ++$out
243 bne Loop2
244
245Ldone2:
246 srwi $cnt,$cnt,2
247 sub r3,r0,$cnt
248 blr
67150340
AP
249 .long 0
250 .byte 0,12,0x14,0,0,0,3,0
251 .long 0
d6019e16 252.size .OPENSSL_instrument_bus2,.-.OPENSSL_instrument_bus2
5fabb88a
AP
253___
254}
9c9c83cc
AP
255
256$code =~ s/\`([^\`]*)\`/eval $1/gem;
257print $code;
258close STDOUT;