Blame crypto/ppccpuid.pl

Packit Service 084de1
#! /usr/bin/env perl
Packit Service 084de1
# Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
#
Packit Service 084de1
# Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
# this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
# in the file LICENSE in the source distribution or at
Packit Service 084de1
# https://www.openssl.org/source/license.html
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
$flavour = shift;
Packit Service 084de1
Packit Service 084de1
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
Packit Service 084de1
( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
Packit Service 084de1
( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
Packit Service 084de1
die "can't locate ppc-xlate.pl";
Packit Service 084de1
Packit Service 084de1
open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
Packit Service 084de1
Packit Service 084de1
if ($flavour=~/64/) {
Packit Service 084de1
    $CMPLI="cmpldi";
Packit Service 084de1
    $SHRLI="srdi";
Packit Service 084de1
    $SIGNX="extsw";
Packit Service 084de1
} else {
Packit Service 084de1
    $CMPLI="cmplwi";
Packit Service 084de1
    $SHRLI="srwi";
Packit Service 084de1
    $SIGNX="mr";
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
$code=<<___;
Packit Service 084de1
.machine	"any"
Packit Service 084de1
.text
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_fpu_probe
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_fpu_probe:
Packit Service 084de1
	fmr	f0,f0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
Packit Service 084de1
.globl	.OPENSSL_ppc64_probe
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_ppc64_probe:
Packit Service 084de1
	fcfid	f1,f1
Packit Service 084de1
	extrdi	r0,r0,32,0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_altivec_probe
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_altivec_probe:
Packit Service 084de1
	.long	0x10000484	# vor	v0,v0,v0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_crypto207_probe
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_crypto207_probe:
Packit Service 084de1
	lvx_u	v0,0,r1
Packit Service 084de1
	vcipher	v0,v0,v0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_madd300_probe
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_madd300_probe:
Packit Service 084de1
	xor	r0,r0,r0
Packit Service 084de1
	maddld	r3,r0,r0,r0
Packit Service 084de1
	maddhdu	r3,r0,r0,r0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_wipe_cpu
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_wipe_cpu:
Packit Service 084de1
	xor	r0,r0,r0
Packit Service 084de1
	fmr	f0,f31
Packit Service 084de1
	fmr	f1,f31
Packit Service 084de1
	fmr	f2,f31
Packit Service 084de1
	mr	r3,r1
Packit Service 084de1
	fmr	f3,f31
Packit Service 084de1
	xor	r4,r4,r4
Packit Service 084de1
	fmr	f4,f31
Packit Service 084de1
	xor	r5,r5,r5
Packit Service 084de1
	fmr	f5,f31
Packit Service 084de1
	xor	r6,r6,r6
Packit Service 084de1
	fmr	f6,f31
Packit Service 084de1
	xor	r7,r7,r7
Packit Service 084de1
	fmr	f7,f31
Packit Service 084de1
	xor	r8,r8,r8
Packit Service 084de1
	fmr	f8,f31
Packit Service 084de1
	xor	r9,r9,r9
Packit Service 084de1
	fmr	f9,f31
Packit Service 084de1
	xor	r10,r10,r10
Packit Service 084de1
	fmr	f10,f31
Packit Service 084de1
	xor	r11,r11,r11
Packit Service 084de1
	fmr	f11,f31
Packit Service 084de1
	xor	r12,r12,r12
Packit Service 084de1
	fmr	f12,f31
Packit Service 084de1
	fmr	f13,f31
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_atomic_add
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_atomic_add:
Packit Service 084de1
Ladd:	lwarx	r5,0,r3
Packit Service 084de1
	add	r0,r4,r5
Packit Service 084de1
	stwcx.	r0,0,r3
Packit Service 084de1
	bne-	Ladd
Packit Service 084de1
	$SIGNX	r3,r0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,2,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.OPENSSL_atomic_add,.-.OPENSSL_atomic_add
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_rdtsc_mftb
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_rdtsc_mftb:
Packit Service 084de1
	mftb	r3
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_rdtsc_mfspr268
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_rdtsc_mfspr268:
Packit Service 084de1
	mfspr	r3,268
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,0,0
Packit Service 084de1
.size	.OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_cleanse
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_cleanse:
Packit Service 084de1
	$CMPLI	r4,7
Packit Service 084de1
	li	r0,0
Packit Service 084de1
	bge	Lot
Packit Service 084de1
	$CMPLI	r4,0
Packit Service 084de1
	beqlr-
Packit Service 084de1
Little:	mtctr	r4
Packit Service 084de1
	stb	r0,0(r3)
Packit Service 084de1
	addi	r3,r3,1
Packit Service 084de1
	bdnz	\$-8
Packit Service 084de1
	blr
Packit Service 084de1
Lot:	andi.	r5,r3,3
Packit Service 084de1
	beq	Laligned
Packit Service 084de1
	stb	r0,0(r3)
Packit Service 084de1
	subi	r4,r4,1
Packit Service 084de1
	addi	r3,r3,1
Packit Service 084de1
	b	Lot
Packit Service 084de1
Laligned:
Packit Service 084de1
	$SHRLI	r5,r4,2
Packit Service 084de1
	mtctr	r5
Packit Service 084de1
	stw	r0,0(r3)
Packit Service 084de1
	addi	r3,r3,4
Packit Service 084de1
	bdnz	\$-8
Packit Service 084de1
	andi.	r4,r4,3
Packit Service 084de1
	bne	Little
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,2,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.OPENSSL_cleanse,.-.OPENSSL_cleanse
Packit Service 084de1
Packit Service 084de1
globl	.CRYPTO_memcmp
Packit Service 084de1
.align	4
Packit Service 084de1
.CRYPTO_memcmp:
Packit Service 084de1
	$CMPLI	r5,0
Packit Service 084de1
	li	r0,0
Packit Service 084de1
	beq	Lno_data
Packit Service 084de1
	mtctr	r5
Packit Service 084de1
Loop_cmp:
Packit Service 084de1
	lbz	r6,0(r3)
Packit Service 084de1
	addi	r3,r3,1
Packit Service 084de1
	lbz	r7,0(r4)
Packit Service 084de1
	addi	r4,r4,1
Packit Service 084de1
	xor	r6,r6,r7
Packit Service 084de1
	or	r0,r0,r6
Packit Service 084de1
	bdnz	Loop_cmp
Packit Service 084de1
Packit Service 084de1
Lno_data:
Packit Service 084de1
	li	r3,0
Packit Service 084de1
	sub	r3,r3,r0
Packit Service 084de1
	extrwi	r3,r3,1,0
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,3,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.CRYPTO_memcmp,.-.CRYPTO_memcmp
Packit Service 084de1
___
Packit Service 084de1
{
Packit Service 084de1
my ($out,$cnt,$max)=("r3","r4","r5");
Packit Service 084de1
my ($tick,$lasttick)=("r6","r7");
Packit Service 084de1
my ($diff,$lastdiff)=("r8","r9");
Packit Service 084de1
Packit Service 084de1
$code.=<<___;
Packit Service 084de1
.globl	.OPENSSL_instrument_bus_mftb
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_instrument_bus_mftb:
Packit Service 084de1
	mtctr	$cnt
Packit Service 084de1
Packit Service 084de1
	mftb	$lasttick		# collect 1st tick
Packit Service 084de1
	li	$diff,0
Packit Service 084de1
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
Packit Service 084de1
Loop:	mftb	$tick
Packit Service 084de1
	sub	$diff,$tick,$lasttick
Packit Service 084de1
	mr	$lasttick,$tick
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
	addi	$out,$out,4		# ++$out
Packit Service 084de1
	bdnz	Loop
Packit Service 084de1
Packit Service 084de1
	mr	r3,$cnt
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,2,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_instrument_bus2_mftb
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_instrument_bus2_mftb:
Packit Service 084de1
	mr	r0,$cnt
Packit Service 084de1
	slwi	$cnt,$cnt,2
Packit Service 084de1
Packit Service 084de1
	mftb	$lasttick		# collect 1st tick
Packit Service 084de1
	li	$diff,0
Packit Service 084de1
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
Packit Service 084de1
	mftb	$tick			# collect 1st diff
Packit Service 084de1
	sub	$diff,$tick,$lasttick
Packit Service 084de1
	mr	$lasttick,$tick
Packit Service 084de1
	mr	$lastdiff,$diff
Packit Service 084de1
Loop2:
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
Packit Service 084de1
	addic.	$max,$max,-1
Packit Service 084de1
	beq	Ldone2
Packit Service 084de1
Packit Service 084de1
	mftb	$tick
Packit Service 084de1
	sub	$diff,$tick,$lasttick
Packit Service 084de1
	mr	$lasttick,$tick
Packit Service 084de1
	cmplw	7,$diff,$lastdiff
Packit Service 084de1
	mr	$lastdiff,$diff
Packit Service 084de1
Packit Service 084de1
	mfcr	$tick			# pull cr
Packit Service 084de1
	not	$tick,$tick		# flip bits
Packit Service 084de1
	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale
Packit Service 084de1
Packit Service 084de1
	sub.	$cnt,$cnt,$tick		# conditional --$cnt
Packit Service 084de1
	add	$out,$out,$tick		# conditional ++$out
Packit Service 084de1
	bne	Loop2
Packit Service 084de1
Packit Service 084de1
Ldone2:
Packit Service 084de1
	srwi	$cnt,$cnt,2
Packit Service 084de1
	sub	r3,r0,$cnt
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,3,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_instrument_bus_mfspr268
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_instrument_bus_mfspr268:
Packit Service 084de1
	mtctr	$cnt
Packit Service 084de1
Packit Service 084de1
	mfspr	$lasttick,268		# collect 1st tick
Packit Service 084de1
	li	$diff,0
Packit Service 084de1
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
Packit Service 084de1
Loop3:	mfspr	$tick,268
Packit Service 084de1
	sub	$diff,$tick,$lasttick
Packit Service 084de1
	mr	$lasttick,$tick
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
	addi	$out,$out,4		# ++$out
Packit Service 084de1
	bdnz	Loop3
Packit Service 084de1
Packit Service 084de1
	mr	r3,$cnt
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,2,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
Packit Service 084de1
Packit Service 084de1
.globl	.OPENSSL_instrument_bus2_mfspr268
Packit Service 084de1
.align	4
Packit Service 084de1
.OPENSSL_instrument_bus2_mfspr268:
Packit Service 084de1
	mr	r0,$cnt
Packit Service 084de1
	slwi	$cnt,$cnt,2
Packit Service 084de1
Packit Service 084de1
	mfspr	$lasttick,268		# collect 1st tick
Packit Service 084de1
	li	$diff,0
Packit Service 084de1
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
Packit Service 084de1
	mfspr	$tick,268		# collect 1st diff
Packit Service 084de1
	sub	$diff,$tick,$lasttick
Packit Service 084de1
	mr	$lasttick,$tick
Packit Service 084de1
	mr	$lastdiff,$diff
Packit Service 084de1
Loop4:
Packit Service 084de1
	dcbf	0,$out			# flush cache line
Packit Service 084de1
	lwarx	$tick,0,$out		# load and lock
Packit Service 084de1
	add	$tick,$tick,$diff
Packit Service 084de1
	stwcx.	$tick,0,$out
Packit Service 084de1
	stwx	$tick,0,$out
Packit Service 084de1
Packit Service 084de1
	addic.	$max,$max,-1
Packit Service 084de1
	beq	Ldone4
Packit Service 084de1
Packit Service 084de1
	mfspr	$tick,268
Packit Service 084de1
	sub	$diff,$tick,$lasttick
Packit Service 084de1
	mr	$lasttick,$tick
Packit Service 084de1
	cmplw	7,$diff,$lastdiff
Packit Service 084de1
	mr	$lastdiff,$diff
Packit Service 084de1
Packit Service 084de1
	mfcr	$tick			# pull cr
Packit Service 084de1
	not	$tick,$tick		# flip bits
Packit Service 084de1
	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale
Packit Service 084de1
Packit Service 084de1
	sub.	$cnt,$cnt,$tick		# conditional --$cnt
Packit Service 084de1
	add	$out,$out,$tick		# conditional ++$out
Packit Service 084de1
	bne	Loop4
Packit Service 084de1
Packit Service 084de1
Ldone4:
Packit Service 084de1
	srwi	$cnt,$cnt,2
Packit Service 084de1
	sub	r3,r0,$cnt
Packit Service 084de1
	blr
Packit Service 084de1
	.long	0
Packit Service 084de1
	.byte	0,12,0x14,0,0,0,3,0
Packit Service 084de1
	.long	0
Packit Service 084de1
.size	.OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
Packit Service 084de1
___
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
$code =~ s/\`([^\`]*)\`/eval $1/gem;
Packit Service 084de1
print $code;
Packit Service 084de1
close STDOUT or die "error closing STDOUT: $!";