1#! /usr/bin/env perl 2# Copyright 2007-2022 The OpenSSL Project Authors. All Rights Reserved. 3# 4# Licensed under the Apache License 2.0 (the "License"). You may not use 5# this file except in compliance with the License. You can obtain a copy 6# in the file LICENSE in the source distribution or at 7# https://www.openssl.org/source/license.html 8 9 10# $output is the last argument if it looks like a file (it has an extension) 11# $flavour is the first argument if it doesn't look like a file 12$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; 13$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; 14 15$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 16( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or 17( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or 18die "can't locate ppc-xlate.pl"; 19 20open STDOUT,"| $^X $xlate $flavour \"$output\"" 21 or die "can't call $xlate: $!"; 22 23if ($flavour=~/64/) { 24 $CMPLI="cmpldi"; 25 $SHRLI="srdi"; 26 $SIGNX="extsw"; 27} else { 28 $CMPLI="cmplwi"; 29 $SHRLI="srwi"; 30 $SIGNX="mr"; 31} 32 33$code=<<___; 34.machine "any" 35.text 36 37.globl .OPENSSL_fpu_probe 38.align 4 39.OPENSSL_fpu_probe: 40 fmr f0,f0 41 blr 42 .long 0 43 .byte 0,12,0x14,0,0,0,0,0 44.size .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe 45.globl .OPENSSL_ppc64_probe 46.align 4 47.OPENSSL_ppc64_probe: 48 fcfid f1,f1 49 extrdi r0,r0,32,0 50 blr 51 .long 0 52 .byte 0,12,0x14,0,0,0,0,0 53.size .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe 54 55.globl .OPENSSL_altivec_probe 56.align 4 57.OPENSSL_altivec_probe: 58 .long 0x10000484 # vor v0,v0,v0 59 blr 60 .long 0 61 .byte 0,12,0x14,0,0,0,0,0 62.size .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe 63 64.globl .OPENSSL_crypto207_probe 65.align 4 66.OPENSSL_crypto207_probe: 67 lvx_u v0,0,r1 68 vcipher v0,v0,v0 69 blr 70 .long 0 71 .byte 0,12,0x14,0,0,0,0,0 72.size .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe 73 74.globl .OPENSSL_madd300_probe 75.align 4 76.OPENSSL_madd300_probe: 77 xor r0,r0,r0 78 maddld r3,r0,r0,r0 79 maddhdu r3,r0,r0,r0 80 blr 81 .long 0 82 .byte 0,12,0x14,0,0,0,0,0 83 84.globl .OPENSSL_brd31_probe 85.align 4 86.OPENSSL_brd31_probe: 87 xor r0,r0,r0 88 brd r3,r0 89 blr 90 .long 0 91 .byte 0,12,0x14,0,0,0,0,0 92.size .OPENSSL_brd31_probe,.-.OPENSSL_brd31_probe 93 94 95.globl .OPENSSL_wipe_cpu 96.align 4 97.OPENSSL_wipe_cpu: 98 xor r0,r0,r0 99 fmr f0,f31 100 fmr f1,f31 101 fmr f2,f31 102 mr r3,r1 103 fmr f3,f31 104 xor r4,r4,r4 105 fmr f4,f31 106 xor r5,r5,r5 107 fmr f5,f31 108 xor r6,r6,r6 109 fmr f6,f31 110 xor r7,r7,r7 111 fmr f7,f31 112 xor r8,r8,r8 113 fmr f8,f31 114 xor r9,r9,r9 115 fmr f9,f31 116 xor r10,r10,r10 117 fmr f10,f31 118 xor r11,r11,r11 119 fmr f11,f31 120 xor r12,r12,r12 121 fmr f12,f31 122 fmr f13,f31 123 blr 124 .long 0 125 .byte 0,12,0x14,0,0,0,0,0 126.size .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu 127 128.globl .OPENSSL_atomic_add 129.align 4 130.OPENSSL_atomic_add: 131Ladd: lwarx r5,0,r3 132 add r0,r4,r5 133 stwcx. r0,0,r3 134 bne- Ladd 135 $SIGNX r3,r0 136 blr 137 .long 0 138 .byte 0,12,0x14,0,0,0,2,0 139 .long 0 140.size .OPENSSL_atomic_add,.-.OPENSSL_atomic_add 141 142.globl .OPENSSL_rdtsc_mftb 143.align 4 144.OPENSSL_rdtsc_mftb: 145 mftb r3 146 blr 147 .long 0 148 .byte 0,12,0x14,0,0,0,0,0 149.size .OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb 150 151.globl .OPENSSL_rdtsc_mfspr268 152.align 4 153.OPENSSL_rdtsc_mfspr268: 154 mfspr r3,268 155 blr 156 .long 0 157 .byte 0,12,0x14,0,0,0,0,0 158.size .OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268 159 160.globl .OPENSSL_cleanse 161.align 4 162.OPENSSL_cleanse: 163 $CMPLI r4,7 164 li r0,0 165 bge Lot 166 $CMPLI r4,0 167 beqlr- 168Little: mtctr r4 169 stb r0,0(r3) 170 addi r3,r3,1 171 bdnz \$-8 172 blr 173Lot: andi. r5,r3,3 174 beq Laligned 175 stb r0,0(r3) 176 subi r4,r4,1 177 addi r3,r3,1 178 b Lot 179Laligned: 180 $SHRLI r5,r4,2 181 mtctr r5 182 stw r0,0(r3) 183 addi r3,r3,4 184 bdnz \$-8 185 andi. r4,r4,3 186 bne Little 187 blr 188 .long 0 189 .byte 0,12,0x14,0,0,0,2,0 190 .long 0 191.size .OPENSSL_cleanse,.-.OPENSSL_cleanse 192 193globl .CRYPTO_memcmp 194.align 4 195.CRYPTO_memcmp: 196 $CMPLI r5,0 197 li r0,0 198 beq Lno_data 199 mtctr r5 200Loop_cmp: 201 lbz r6,0(r3) 202 addi r3,r3,1 203 lbz r7,0(r4) 204 addi r4,r4,1 205 xor r6,r6,r7 206 or r0,r0,r6 207 bdnz Loop_cmp 208 209Lno_data: 210 li r3,0 211 sub r3,r3,r0 212 extrwi r3,r3,1,0 213 blr 214 .long 0 215 .byte 0,12,0x14,0,0,0,3,0 216 .long 0 217.size .CRYPTO_memcmp,.-.CRYPTO_memcmp 218___ 219{ 220my ($out,$cnt,$max)=("r3","r4","r5"); 221my ($tick,$lasttick)=("r6","r7"); 222my ($diff,$lastdiff)=("r8","r9"); 223 224$code.=<<___; 225.globl .OPENSSL_instrument_bus_mftb 226.align 4 227.OPENSSL_instrument_bus_mftb: 228 mtctr $cnt 229 230 mftb $lasttick # collect 1st tick 231 li $diff,0 232 233 dcbf 0,$out # flush cache line 234 lwarx $tick,0,$out # load and lock 235 add $tick,$tick,$diff 236 stwcx. $tick,0,$out 237 stwx $tick,0,$out 238 239Loop: mftb $tick 240 sub $diff,$tick,$lasttick 241 mr $lasttick,$tick 242 dcbf 0,$out # flush cache line 243 lwarx $tick,0,$out # load and lock 244 add $tick,$tick,$diff 245 stwcx. $tick,0,$out 246 stwx $tick,0,$out 247 addi $out,$out,4 # ++$out 248 bdnz Loop 249 250 mr r3,$cnt 251 blr 252 .long 0 253 .byte 0,12,0x14,0,0,0,2,0 254 .long 0 255.size .OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb 256 257.globl .OPENSSL_instrument_bus2_mftb 258.align 4 259.OPENSSL_instrument_bus2_mftb: 260 mr r0,$cnt 261 slwi $cnt,$cnt,2 262 263 mftb $lasttick # collect 1st tick 264 li $diff,0 265 266 dcbf 0,$out # flush cache line 267 lwarx $tick,0,$out # load and lock 268 add $tick,$tick,$diff 269 stwcx. $tick,0,$out 270 stwx $tick,0,$out 271 272 mftb $tick # collect 1st diff 273 sub $diff,$tick,$lasttick 274 mr $lasttick,$tick 275 mr $lastdiff,$diff 276Loop2: 277 dcbf 0,$out # flush cache line 278 lwarx $tick,0,$out # load and lock 279 add $tick,$tick,$diff 280 stwcx. $tick,0,$out 281 stwx $tick,0,$out 282 283 addic. $max,$max,-1 284 beq Ldone2 285 286 mftb $tick 287 sub $diff,$tick,$lasttick 288 mr $lasttick,$tick 289 cmplw 7,$diff,$lastdiff 290 mr $lastdiff,$diff 291 292 mfcr $tick # pull cr 293 not $tick,$tick # flip bits 294 rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale 295 296 sub. $cnt,$cnt,$tick # conditional --$cnt 297 add $out,$out,$tick # conditional ++$out 298 bne Loop2 299 300Ldone2: 301 srwi $cnt,$cnt,2 302 sub r3,r0,$cnt 303 blr 304 .long 0 305 .byte 0,12,0x14,0,0,0,3,0 306 .long 0 307.size .OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb 308 309.globl .OPENSSL_instrument_bus_mfspr268 310.align 4 311.OPENSSL_instrument_bus_mfspr268: 312 mtctr $cnt 313 314 mfspr $lasttick,268 # collect 1st tick 315 li $diff,0 316 317 dcbf 0,$out # flush cache line 318 lwarx $tick,0,$out # load and lock 319 add $tick,$tick,$diff 320 stwcx. $tick,0,$out 321 stwx $tick,0,$out 322 323Loop3: mfspr $tick,268 324 sub $diff,$tick,$lasttick 325 mr $lasttick,$tick 326 dcbf 0,$out # flush cache line 327 lwarx $tick,0,$out # load and lock 328 add $tick,$tick,$diff 329 stwcx. $tick,0,$out 330 stwx $tick,0,$out 331 addi $out,$out,4 # ++$out 332 bdnz Loop3 333 334 mr r3,$cnt 335 blr 336 .long 0 337 .byte 0,12,0x14,0,0,0,2,0 338 .long 0 339.size .OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268 340 341.globl .OPENSSL_instrument_bus2_mfspr268 342.align 4 343.OPENSSL_instrument_bus2_mfspr268: 344 mr r0,$cnt 345 slwi $cnt,$cnt,2 346 347 mfspr $lasttick,268 # collect 1st tick 348 li $diff,0 349 350 dcbf 0,$out # flush cache line 351 lwarx $tick,0,$out # load and lock 352 add $tick,$tick,$diff 353 stwcx. $tick,0,$out 354 stwx $tick,0,$out 355 356 mfspr $tick,268 # collect 1st diff 357 sub $diff,$tick,$lasttick 358 mr $lasttick,$tick 359 mr $lastdiff,$diff 360Loop4: 361 dcbf 0,$out # flush cache line 362 lwarx $tick,0,$out # load and lock 363 add $tick,$tick,$diff 364 stwcx. $tick,0,$out 365 stwx $tick,0,$out 366 367 addic. $max,$max,-1 368 beq Ldone4 369 370 mfspr $tick,268 371 sub $diff,$tick,$lasttick 372 mr $lasttick,$tick 373 cmplw 7,$diff,$lastdiff 374 mr $lastdiff,$diff 375 376 mfcr $tick # pull cr 377 not $tick,$tick # flip bits 378 rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale 379 380 sub. $cnt,$cnt,$tick # conditional --$cnt 381 add $out,$out,$tick # conditional ++$out 382 bne Loop4 383 384Ldone4: 385 srwi $cnt,$cnt,2 386 sub r3,r0,$cnt 387 blr 388 .long 0 389 .byte 0,12,0x14,0,0,0,3,0 390 .long 0 391.size .OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268 392___ 393} 394 395$code =~ s/\`([^\`]*)\`/eval $1/gem; 396print $code; 397close STDOUT or die "error closing STDOUT: $!"; 398