git: ce35a3bc852d - stable/13 - Add assembly optimized code for OpenSSL on powerpc, powerpc64 and powerpc64le

From: Piotr Kubaj <pkubaj_at_FreeBSD.org>
Date: Wed, 29 Dec 2021 13:45:58 UTC
The branch stable/13 has been updated by pkubaj (ports committer):

URL: https://cgit.FreeBSD.org/src/commit/?id=ce35a3bc852d25cb989bc1f3dc4ddb723d7d5117

commit ce35a3bc852d25cb989bc1f3dc4ddb723d7d5117
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2021-11-22 02:28:46 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2021-12-29 13:45:29 +0000

    Add assembly optimized code for OpenSSL on powerpc, powerpc64 and powerpc64le
    
    Summary:
    1. https://github.com/openssl/openssl/commit/34ab13b7d8e3e723adb60be8142e38b7c9cd382a
    needs to be merged for ELFv2 support on big-endian.
    2. crypto/openssl/crypto/ppccap.c needs to be patched.
    Same reason as in https://github.com/openssl/openssl/pull/17082.
    
    Approved by:    jkim, jhibbits, alfredo (MFC to stable/13)
    MFC after:      1 month
    Differential Revision: https://reviews.freebsd.org/D33076
    
    (cherry picked from commit 3a60869237b8b315fe66497cf5299ec08b688533)
---
 crypto/openssl/crypto/perlasm/ppc-xlate.pl         |    8 +-
 crypto/openssl/crypto/ppccap.c                     |   12 +-
 secure/lib/libcrypto/Makefile                      |   50 +-
 secure/lib/libcrypto/Makefile.asm                  |  189 +
 secure/lib/libcrypto/Makefile.inc                  |   35 +-
 sys/crypto/openssl/powerpc/aes-ppc.S               | 1562 +++++++
 sys/crypto/openssl/powerpc/aesp8-ppc.S             | 3643 +++++++++++++++
 sys/crypto/openssl/powerpc/chacha-ppc.S            | 1493 ++++++
 sys/crypto/openssl/powerpc/ghashp8-ppc.S           |  570 +++
 sys/crypto/openssl/powerpc/poly1305-ppc.S          |  313 ++
 sys/crypto/openssl/powerpc/poly1305-ppcfp.S        |  587 +++
 sys/crypto/openssl/powerpc/ppc-mont.S              | 1788 +++++++
 sys/crypto/openssl/powerpc/ppc.S                   | 1856 ++++++++
 sys/crypto/openssl/powerpc/ppccpuid.S              |  357 ++
 sys/crypto/openssl/powerpc/sha1-ppc.S              | 1119 +++++
 sys/crypto/openssl/powerpc/sha256-ppc.S            | 1322 ++++++
 sys/crypto/openssl/powerpc/sha256p8-ppc.S          |  736 +++
 sys/crypto/openssl/powerpc/sha512-ppc.S            | 3072 +++++++++++++
 sys/crypto/openssl/powerpc/sha512p8-ppc.S          |  834 ++++
 sys/crypto/openssl/powerpc/vpaes-ppc.S             | 1469 ++++++
 sys/crypto/openssl/powerpc64/aes-ppc.S             | 1534 +++++++
 sys/crypto/openssl/powerpc64/aesp8-ppc.S           | 3660 +++++++++++++++
 sys/crypto/openssl/powerpc64/chacha-ppc.S          | 1500 ++++++
 sys/crypto/openssl/powerpc64/ecp_nistz256-ppc64.S  | 4855 ++++++++++++++++++++
 sys/crypto/openssl/powerpc64/ghashp8-ppc.S         |  577 +++
 sys/crypto/openssl/powerpc64/keccak1600-ppc64.S    |  671 +++
 sys/crypto/openssl/powerpc64/poly1305-ppc.S        |  186 +
 sys/crypto/openssl/powerpc64/poly1305-ppcfp.S      |  597 +++
 sys/crypto/openssl/powerpc64/ppc-mont.S            | 1791 ++++++++
 sys/crypto/openssl/powerpc64/ppc.S                 | 1877 ++++++++
 sys/crypto/openssl/powerpc64/ppccpuid.S            |  388 ++
 sys/crypto/openssl/powerpc64/sha1-ppc.S            | 1122 +++++
 sys/crypto/openssl/powerpc64/sha256-ppc.S          | 1325 ++++++
 sys/crypto/openssl/powerpc64/sha256p8-ppc.S        |  739 +++
 sys/crypto/openssl/powerpc64/sha512-ppc.S          | 1421 ++++++
 sys/crypto/openssl/powerpc64/sha512p8-ppc.S        |  837 ++++
 sys/crypto/openssl/powerpc64/vpaes-ppc.S           | 1480 ++++++
 sys/crypto/openssl/powerpc64/x25519-ppc64.S        |  350 ++
 sys/crypto/openssl/powerpc64le/aes-ppc.S           | 1582 +++++++
 sys/crypto/openssl/powerpc64le/aesp8-ppc.S         | 3660 +++++++++++++++
 sys/crypto/openssl/powerpc64le/chacha-ppc.S        | 1372 ++++++
 .../openssl/powerpc64le/ecp_nistz256-ppc64.S       | 4855 ++++++++++++++++++++
 sys/crypto/openssl/powerpc64le/ghashp8-ppc.S       |  577 +++
 sys/crypto/openssl/powerpc64le/keccak1600-ppc64.S  |  671 +++
 sys/crypto/openssl/powerpc64le/poly1305-ppc.S      |  163 +
 sys/crypto/openssl/powerpc64le/poly1305-ppcfp.S    |  592 +++
 sys/crypto/openssl/powerpc64le/ppc-mont.S          | 1791 ++++++++
 sys/crypto/openssl/powerpc64le/ppc.S               | 1877 ++++++++
 sys/crypto/openssl/powerpc64le/ppccpuid.S          |  388 ++
 sys/crypto/openssl/powerpc64le/sha1-ppc.S          | 1170 +++++
 sys/crypto/openssl/powerpc64le/sha256-ppc.S        | 1373 ++++++
 sys/crypto/openssl/powerpc64le/sha256p8-ppc.S      |  747 +++
 sys/crypto/openssl/powerpc64le/sha512-ppc.S        | 1517 ++++++
 sys/crypto/openssl/powerpc64le/sha512p8-ppc.S      |  849 ++++
 sys/crypto/openssl/powerpc64le/vpaes-ppc.S         | 1480 ++++++
 sys/crypto/openssl/powerpc64le/x25519-ppc64.S      |  350 ++
 56 files changed, 70929 insertions(+), 10 deletions(-)

diff --git a/crypto/openssl/crypto/perlasm/ppc-xlate.pl b/crypto/openssl/crypto/perlasm/ppc-xlate.pl
index 08668b295bf6..f1a7fa835fc2 100755
--- a/crypto/openssl/crypto/perlasm/ppc-xlate.pl
+++ b/crypto/openssl/crypto/perlasm/ppc-xlate.pl
@@ -49,7 +49,7 @@ my $globl = sub {
 	/osx/		&& do { $name = "_$name";
 				last;
 			      };
-	/linux.*(32|64le)/
+	/linux.*(32|64(le|v2))/
 			&& do {	$ret .= ".globl	$name";
 				if (!$$type) {
 				    $ret .= "\n.type	$name,\@function";
@@ -80,7 +80,7 @@ my $globl = sub {
 };
 my $text = sub {
     my $ret = ($flavour =~ /aix/) ? ".csect\t.text[PR],7" : ".text";
-    $ret = ".abiversion	2\n".$ret	if ($flavour =~ /linux.*64le/);
+    $ret = ".abiversion	2\n".$ret	if ($flavour =~ /linux.*64(le|v2)/);
     $ret;
 };
 my $machine = sub {
@@ -186,7 +186,7 @@ my $vmr = sub {
 
 # Some ABIs specify vrsave, special-purpose register #256, as reserved
 # for system use.
-my $no_vrsave = ($flavour =~ /aix|linux64le/);
+my $no_vrsave = ($flavour =~ /aix|linux64(le|v2)/);
 my $mtspr = sub {
     my ($f,$idx,$ra) = @_;
     if ($idx == 256 && $no_vrsave) {
@@ -318,7 +318,7 @@ while($line=<>) {
 	if ($label) {
 	    my $xlated = ($GLOBALS{$label} or $label);
 	    print "$xlated:";
-	    if ($flavour =~ /linux.*64le/) {
+	    if ($flavour =~ /linux.*64(le|v2)/) {
 		if ($TYPES{$label} =~ /function/) {
 		    printf "\n.localentry	%s,0\n",$xlated;
 		}
diff --git a/crypto/openssl/crypto/ppccap.c b/crypto/openssl/crypto/ppccap.c
index eeaa47cc6b41..23bcf1f46e2e 100644
--- a/crypto/openssl/crypto/ppccap.c
+++ b/crypto/openssl/crypto/ppccap.c
@@ -239,14 +239,18 @@ static unsigned long getauxval(unsigned long key)
 #endif
 
 /* I wish <sys/auxv.h> was universally available */
-#define HWCAP                   16      /* AT_HWCAP */
+#ifndef AT_HWCAP
+# define AT_HWCAP               16      /* AT_HWCAP */
+#endif
 #define HWCAP_PPC64             (1U << 30)
 #define HWCAP_ALTIVEC           (1U << 28)
 #define HWCAP_FPU               (1U << 27)
 #define HWCAP_POWER6_EXT        (1U << 9)
 #define HWCAP_VSX               (1U << 7)
 
-#define HWCAP2                  26      /* AT_HWCAP2 */
+#ifndef AT_HWCAP2
+# define AT_HWCAP2              26      /* AT_HWCAP2 */
+#endif
 #define HWCAP_VEC_CRYPTO        (1U << 25)
 #define HWCAP_ARCH_3_00         (1U << 23)
 
@@ -337,8 +341,8 @@ void OPENSSL_cpuid_setup(void)
 
 #ifdef OSSL_IMPLEMENT_GETAUXVAL
     {
-        unsigned long hwcap = getauxval(HWCAP);
-        unsigned long hwcap2 = getauxval(HWCAP2);
+        unsigned long hwcap = getauxval(AT_HWCAP);
+        unsigned long hwcap2 = getauxval(AT_HWCAP2);
 
         if (hwcap & HWCAP_FPU) {
             OPENSSL_ppccap_P |= PPC_FPU;
diff --git a/secure/lib/libcrypto/Makefile b/secure/lib/libcrypto/Makefile
index ff9303c9edae..cf9259a19e16 100644
--- a/secure/lib/libcrypto/Makefile
+++ b/secure/lib/libcrypto/Makefile
@@ -28,6 +28,12 @@ SRCS+=	x86_64cpuid.S
 SRCS+=	armv4cpuid.S armcap.c
 .elif defined(ASM_i386)
 SRCS+=	x86cpuid.S
+.elif defined(ASM_powerpc)
+SRCS+=	ppccpuid.S ppccap.c
+.elif defined(ASM_powerpc64)
+SRCS+=	ppccpuid.S ppccap.c
+.elif defined(ASM_powerpc64le)
+SRCS+=	ppccpuid.S ppccap.c
 .else
 SRCS+=	mem_clr.c
 .endif
@@ -44,6 +50,12 @@ SRCS+=	aesni-x86_64.S vpaes-x86_64.S
 SRCS+=	aes-armv4.S aesv8-armx.S bsaes-armv7.S
 .elif defined(ASM_i386)
 SRCS+=	aes_core.c aesni-x86.S vpaes-x86.S
+.elif defined(ASM_powerpc)
+SRCS+=	aes_core.c aes-ppc.S vpaes-ppc.S aesp8-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+=	aes_core.c aes-ppc.S vpaes-ppc.S aesp8-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	aes_core.c aes-ppc.S vpaes-ppc.S aesp8-ppc.S
 .else
 SRCS+=	aes_core.c
 .endif
@@ -99,6 +111,12 @@ SRCS+=	x86_64-mont.S x86_64-mont5.S
 SRCS+=	armv4-gf2m.S armv4-mont.S bn_asm.c
 .elif defined(ASM_i386)
 SRCS+=	bn-586.S co-586.S x86-gf2m.S x86-mont.S
+.elif defined(ASM_powerpc)
+SRCS+=	ppc.S ppc-mont.S
+.elif defined(ASM_powerpc64)
+SRCS+=	ppc.S ppc-mont.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	ppc.S ppc-mont.S
 .else
 SRCS+=	bn_asm.c
 .endif
@@ -128,6 +146,12 @@ SRCS+=	chacha-x86_64.S
 SRCS+=	chacha-armv4.S
 .elif defined(ASM_i386)
 SRCS+=	chacha-x86.S
+.elif defined(ASM_powerpc)
+SRCS+=	chacha-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+=	chacha-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	chacha-ppc.S
 .else
 SRCS+=	chacha_enc.c
 .endif
@@ -189,6 +213,10 @@ SRCS+=	ecp_nistz256-x86_64.S ecp_nistz256.c x25519-x86_64.S
 SRCS+=	ecp_nistz256-armv4.S ecp_nistz256.c
 .elif defined(ASM_i386)
 SRCS+=	ecp_nistz256-x86.S ecp_nistz256.c
+.elif defined(ASM_powerpc64)
+SRCS+=	ecp_nistz256-ppc64.S ecp_nistz256.c x25519-ppc64.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	ecp_nistz256-ppc64.S ecp_nistz256.c x25519-ppc64.S
 .endif
 
 # engine
@@ -250,6 +278,12 @@ SRCS+=	aesni-gcm-x86_64.S ghash-x86_64.S
 SRCS+=	ghash-armv4.S ghashv8-armx.S
 .elif defined(ASM_i386)
 SRCS+=	ghash-x86.S
+.elif defined(ASM_powerpc)
+SRCS+=	ghashp8-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+=	ghashp8-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	ghashp8-ppc.S
 .endif
 
 # objects
@@ -282,6 +316,12 @@ SRCS+=	poly1305-x86_64.S
 SRCS+=	poly1305-armv4.S
 .elif defined(ASM_i386)
 SRCS+=	poly1305-x86.S
+.elif defined(ASM_powerpc)
+SRCS+=	poly1305-ppc.S poly1305-ppcfp.S
+.elif defined(ASM_powerpc64)
+SRCS+=	poly1305-ppc.S poly1305-ppcfp.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	poly1305-ppc.S poly1305-ppcfp.S
 .endif
 
 # rand
@@ -333,6 +373,12 @@ SRCS+=	sha256-mb-x86_64.S sha256-x86_64.S sha512-x86_64.S
 SRCS+=	keccak1600-armv4.S sha1-armv4-large.S sha256-armv4.S sha512-armv4.S
 .elif defined(ASM_i386)
 SRCS+=	keccak1600.c sha1-586.S sha256-586.S sha512-586.S
+.elif defined(ASM_powerpc)
+SRCS+=	keccak1600.c sha1-ppc.S sha256-ppc.S sha512-ppc.S sha256p8-ppc.S sha512p8-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+=	keccak1600-ppc64.S sha1-ppc.S sha256-ppc.S sha512-ppc.S sha256p8-ppc.S sha512p8-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+=	keccak1600-ppc64.S sha1-ppc.S sha256-ppc.S sha512-ppc.S sha256p8-ppc.S sha512p8-ppc.S
 .else
 SRCS+=	keccak1600.c
 .endif
@@ -430,7 +476,7 @@ SRCS+=	buildinf.h
 CLEANDIRS=	openssl
 CLEANFILES=	buildinf.h opensslconf.h opensslconf.h.tmp
 
-.if defined(ASM_${MACHINE_CPUARCH})
+.if defined(ASM_${MACHINE_CPUARCH}) || defined(ASM_${MACHINE_ARCH})
 _cmd1=/%%NO_ASM%%/d
 .else
 _cmd1=s/%%NO_ASM%%//
@@ -471,6 +517,8 @@ PICFLAG+=	-DOPENSSL_PIC
 .if defined(ASM_amd64)
 .PATH:	${LCRYPTO_SRC}/crypto/bn/asm
 .endif
+.elif defined(ASM_${MACHINE_ARCH})
+.PATH:	${SRCTOP}/sys/crypto/openssl/${MACHINE_ARCH}
 .endif
 
 .PATH:	${LCRYPTO_SRC}/crypto \
diff --git a/secure/lib/libcrypto/Makefile.asm b/secure/lib/libcrypto/Makefile.asm
index 9480c3a59833..5e44285de0d9 100644
--- a/secure/lib/libcrypto/Makefile.asm
+++ b/secure/lib/libcrypto/Makefile.asm
@@ -295,6 +295,195 @@ CLEANFILES=	${ASM} ${SRCS:R:S/$/.s/}
 	env CC=cc perl ${PERLPATH} ${.IMPSRC} elf ${CFLAGS} ${.IMPSRC:R:S/$/.s/} ;\
 	cat ${.IMPSRC:R:S/$/.s/} ;\
 	echo '#endif' ) > ${.TARGET}
+
+.elif defined(ASM_powerpc)
+
+.PATH:	${LCRYPTO_SRC}/crypto \
+	${LCRYPTO_SRC}/crypto/aes/asm \
+	${LCRYPTO_SRC}/crypto/bn/asm \
+	${LCRYPTO_SRC}/crypto/chacha/asm \
+	${LCRYPTO_SRC}/crypto/modes/asm \
+	${LCRYPTO_SRC}/crypto/poly1305/asm \
+	${LCRYPTO_SRC}/crypto/sha/asm
+
+PERLPATH=	-I${LCRYPTO_SRC}/crypto/perlasm
+
+#cpuid
+SRCS=	ppccpuid.pl
+
+#bn
+SRCS+=	ppc.pl ppc-mont.pl
+
+#aes
+SRCS+=	aes-ppc.pl vpaes-ppc.pl aesp8-ppc.pl
+
+#sha1
+SRCS+=	sha1-ppc.pl sha512-ppc.pl sha512p8-ppc.pl
+
+#modes
+SRCS+=	ghashp8-ppc.pl
+
+#chacha
+SRCS+=	chacha-ppc.pl
+
+#poly1305
+SRCS+=	poly1305-ppc.pl poly1305-ppcfp.pl
+
+ASM=	${SRCS:R:S/$/.S/} sha256-ppc.S sha256p8-ppc.S
+
+all:	${ASM}
+
+CLEANFILES=	${ASM}
+.SUFFIXES:	.pl
+
+sha256-ppc.S:	sha512-ppc.pl
+	env CC=cc perl ${.ALLSRC} linux32 ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+sha256p8-ppc.S:	sha512p8-ppc.pl
+	env CC=cc perl ${.ALLSRC} linux32 ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.pl.S:
+	env CC=cc perl ${.IMPSRC} linux32 ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.elif defined(ASM_powerpc64)
+
+.PATH:	${LCRYPTO_SRC}/crypto \
+	${LCRYPTO_SRC}/crypto/aes/asm \
+	${LCRYPTO_SRC}/crypto/bn/asm \
+	${LCRYPTO_SRC}/crypto/chacha/asm \
+	${LCRYPTO_SRC}/crypto/ec/asm \
+	${LCRYPTO_SRC}/crypto/modes/asm \
+	${LCRYPTO_SRC}/crypto/poly1305/asm \
+	${LCRYPTO_SRC}/crypto/sha/asm
+
+PERLPATH=	-I${LCRYPTO_SRC}/crypto/perlasm
+
+#cpuid
+SRCS=	ppccpuid.pl
+
+#bn
+SRCS+=	ppc.pl ppc-mont.pl
+
+#aes
+SRCS+=	aes-ppc.pl vpaes-ppc.pl aesp8-ppc.pl
+
+#sha1
+SRCS+=	sha1-ppc.pl sha512-ppc.pl sha512p8-ppc.pl
+
+#modes
+SRCS+=	ghashp8-ppc.pl
+
+#chacha
+SRCS+=	chacha-ppc.pl
+
+#poly1305
+SRCS+=	poly1305-ppc.pl poly1305-ppcfp.pl
+
+#ec
+SRCS+=	ecp_nistz256-ppc64.pl x25519-ppc64.pl
+
+#keccak1600
+SRCS+=	keccak1600-ppc64.pl
+
+ASM=	${SRCS:R:S/$/.S/} sha256-ppc.S sha256p8-ppc.S
+
+all:	${ASM}
+
+CLEANFILES=	${ASM}
+.SUFFIXES:	.pl
+
+sha256-ppc.S:	sha512-ppc.pl
+	env CC=cc perl ${.ALLSRC} linux64v2 ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+sha256p8-ppc.S:	sha512p8-ppc.pl
+	env CC=cc perl ${.ALLSRC} linux64v2 ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.pl.S:
+	env CC=cc perl ${.IMPSRC} linux64v2 ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.elif defined(ASM_powerpc64le)
+
+.PATH:	${LCRYPTO_SRC}/crypto \
+	${LCRYPTO_SRC}/crypto/aes/asm \
+	${LCRYPTO_SRC}/crypto/bn/asm \
+	${LCRYPTO_SRC}/crypto/chacha/asm \
+	${LCRYPTO_SRC}/crypto/ec/asm \
+	${LCRYPTO_SRC}/crypto/modes/asm \
+	${LCRYPTO_SRC}/crypto/poly1305/asm \
+	${LCRYPTO_SRC}/crypto/sha/asm
+
+PERLPATH=	-I${LCRYPTO_SRC}/crypto/perlasm
+
+#cpuid
+SRCS=	ppccpuid.pl
+
+#bn
+SRCS+=	ppc.pl ppc-mont.pl
+
+#aes
+SRCS+=	aes-ppc.pl vpaes-ppc.pl aesp8-ppc.pl
+
+#sha1
+SRCS+=	sha1-ppc.pl sha512-ppc.pl sha512p8-ppc.pl
+
+#modes
+SRCS+=	ghashp8-ppc.pl
+
+#chacha
+SRCS+=	chacha-ppc.pl
+
+#poly1305
+SRCS+=	poly1305-ppc.pl poly1305-ppcfp.pl
+
+#ec
+SRCS+=	ecp_nistz256-ppc64.pl x25519-ppc64.pl
+
+#keccak1600
+SRCS+=	keccak1600-ppc64.pl
+
+ASM=	${SRCS:R:S/$/.S/} sha256-ppc.S sha256p8-ppc.S
+
+all:	${ASM}
+
+CLEANFILES=	${ASM}
+.SUFFIXES:	.pl
+
+sha256-ppc.S:	sha512-ppc.pl
+	env CC=cc perl ${.ALLSRC} linux64le ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+sha256p8-ppc.S:	sha512p8-ppc.pl
+	env CC=cc perl ${.ALLSRC} linux64le ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.pl.S:
+	env CC=cc perl ${.IMPSRC} linux64le ${.TARGET:R:S/$/.s/}
+	( echo '/* $$'FreeBSD'$$ */' ;\
+	echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+	cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
 .endif
 
 .include <bsd.prog.mk>
diff --git a/secure/lib/libcrypto/Makefile.inc b/secure/lib/libcrypto/Makefile.inc
index 19bdf834dcad..c944e3242caa 100644
--- a/secure/lib/libcrypto/Makefile.inc
+++ b/secure/lib/libcrypto/Makefile.inc
@@ -23,9 +23,12 @@ CFLAGS+=	-DB_ENDIAN
 .if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64" || \
     ${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "i386"
 ASM_${MACHINE_CPUARCH}=
+.elif ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpc64" || \
+    ${MACHINE_ARCH} == "powerpc64le"
+ASM_${MACHINE_ARCH}=
 .endif
 
-.if defined(ASM_${MACHINE_CPUARCH})
+.if defined(ASM_${MACHINE_CPUARCH}) || defined(ASM_${MACHINE_ARCH})
 CFLAGS+=	-DOPENSSL_CPUID_OBJ
 .if defined(ASM_aarch64)
 CFLAGS+=	-DOPENSSL_BN_ASM_MONT
@@ -69,6 +72,36 @@ CFLAGS+=	-DGHASH_ASM
 CFLAGS+=	-DECP_NISTZ256_ASM
 CFLAGS+=	-DPADLOCK_ASM
 CFLAGS+=	-DPOLY1305_ASM
+.elif defined(ASM_powerpc)
+CFLAGS+=	-DOPENSSL_BN_ASM_MONT
+CFLAGS+=	-DAES_ASM
+CFLAGS+=	-DVPAES_ASM
+CFLAGS+=	-DSHA1_ASM
+CFLAGS+=	-DSHA256_ASM
+CFLAGS+=	-DSHA512_ASM
+CFLAGS+=	-DPOLY1305_ASM
+.elif defined(ASM_powerpc64)
+CFLAGS+=	-DOPENSSL_BN_ASM_MONT
+CFLAGS+=	-DAES_ASM
+CFLAGS+=	-DVPAES_ASM
+CFLAGS+=	-DSHA1_ASM
+CFLAGS+=	-DSHA256_ASM
+CFLAGS+=	-DSHA512_ASM
+CFLAGS+=	-DPOLY1305_ASM
+CFLAGS+=	-DECP_NISTZ256_ASM
+CFLAGS+=	-DX25519_ASM
+CFLAGS+=	-DKECCAK1600_ASM
+.elif defined(ASM_powerpc64le)
+CFLAGS+=	-DOPENSSL_BN_ASM_MONT
+CFLAGS+=	-DAES_ASM
+CFLAGS+=	-DVPAES_ASM
+CFLAGS+=	-DSHA1_ASM
+CFLAGS+=	-DSHA256_ASM
+CFLAGS+=	-DSHA512_ASM
+CFLAGS+=	-DPOLY1305_ASM
+CFLAGS+=	-DECP_NISTZ256_ASM
+CFLAGS+=	-DX25519_ASM
+CFLAGS+=	-DKECCAK1600_ASM
 .endif
 .endif
 
diff --git a/sys/crypto/openssl/powerpc/aes-ppc.S b/sys/crypto/openssl/powerpc/aes-ppc.S
new file mode 100644
index 000000000000..75eef3eb51f3
--- /dev/null
+++ b/sys/crypto/openssl/powerpc/aes-ppc.S
@@ -0,0 +1,1562 @@
+/* $FreeBSD$ */
+/* Do not modify. This file is auto-generated from aes-ppc.pl. */
+.machine	"any"
+.text
+
+.align	7
+.LAES_Te:
+	mflr	0
+	bcl	20,31,$+4
+	mflr	3
+	addi	3,3,120
+	mtlr	0
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,0,0
+.space	28
+.LAES_Td:
+	mflr	0
+	bcl	20,31,$+4
+	mflr	3
+	addi	3,3,2360
+	mtlr	0
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,0,0
+.space	28
+.long	0xc66363a5,0xc66363a5
+.long	0xf87c7c84,0xf87c7c84
+.long	0xee777799,0xee777799
+.long	0xf67b7b8d,0xf67b7b8d
+.long	0xfff2f20d,0xfff2f20d
+.long	0xd66b6bbd,0xd66b6bbd
+.long	0xde6f6fb1,0xde6f6fb1
+.long	0x91c5c554,0x91c5c554
+.long	0x60303050,0x60303050
+.long	0x02010103,0x02010103
+.long	0xce6767a9,0xce6767a9
+.long	0x562b2b7d,0x562b2b7d
+.long	0xe7fefe19,0xe7fefe19
+.long	0xb5d7d762,0xb5d7d762
+.long	0x4dababe6,0x4dababe6
+.long	0xec76769a,0xec76769a
+.long	0x8fcaca45,0x8fcaca45
+.long	0x1f82829d,0x1f82829d
+.long	0x89c9c940,0x89c9c940
+.long	0xfa7d7d87,0xfa7d7d87
+.long	0xeffafa15,0xeffafa15
+.long	0xb25959eb,0xb25959eb
+.long	0x8e4747c9,0x8e4747c9
+.long	0xfbf0f00b,0xfbf0f00b
+.long	0x41adadec,0x41adadec
+.long	0xb3d4d467,0xb3d4d467
+.long	0x5fa2a2fd,0x5fa2a2fd
+.long	0x45afafea,0x45afafea
+.long	0x239c9cbf,0x239c9cbf
+.long	0x53a4a4f7,0x53a4a4f7
+.long	0xe4727296,0xe4727296
+.long	0x9bc0c05b,0x9bc0c05b
+.long	0x75b7b7c2,0x75b7b7c2
+.long	0xe1fdfd1c,0xe1fdfd1c
+.long	0x3d9393ae,0x3d9393ae
+.long	0x4c26266a,0x4c26266a
+.long	0x6c36365a,0x6c36365a
+.long	0x7e3f3f41,0x7e3f3f41
+.long	0xf5f7f702,0xf5f7f702
+.long	0x83cccc4f,0x83cccc4f
+.long	0x6834345c,0x6834345c
+.long	0x51a5a5f4,0x51a5a5f4
+.long	0xd1e5e534,0xd1e5e534
+.long	0xf9f1f108,0xf9f1f108
+.long	0xe2717193,0xe2717193
+.long	0xabd8d873,0xabd8d873
+.long	0x62313153,0x62313153
+.long	0x2a15153f,0x2a15153f
+.long	0x0804040c,0x0804040c
+.long	0x95c7c752,0x95c7c752
+.long	0x46232365,0x46232365
+.long	0x9dc3c35e,0x9dc3c35e
+.long	0x30181828,0x30181828
+.long	0x379696a1,0x379696a1
+.long	0x0a05050f,0x0a05050f
+.long	0x2f9a9ab5,0x2f9a9ab5
+.long	0x0e070709,0x0e070709
+.long	0x24121236,0x24121236
+.long	0x1b80809b,0x1b80809b
+.long	0xdfe2e23d,0xdfe2e23d
+.long	0xcdebeb26,0xcdebeb26
+.long	0x4e272769,0x4e272769
+.long	0x7fb2b2cd,0x7fb2b2cd
+.long	0xea75759f,0xea75759f
+.long	0x1209091b,0x1209091b
+.long	0x1d83839e,0x1d83839e
+.long	0x582c2c74,0x582c2c74
+.long	0x341a1a2e,0x341a1a2e
+.long	0x361b1b2d,0x361b1b2d
+.long	0xdc6e6eb2,0xdc6e6eb2
+.long	0xb45a5aee,0xb45a5aee
+.long	0x5ba0a0fb,0x5ba0a0fb
+.long	0xa45252f6,0xa45252f6
+.long	0x763b3b4d,0x763b3b4d
+.long	0xb7d6d661,0xb7d6d661
+.long	0x7db3b3ce,0x7db3b3ce
+.long	0x5229297b,0x5229297b
+.long	0xdde3e33e,0xdde3e33e
+.long	0x5e2f2f71,0x5e2f2f71
+.long	0x13848497,0x13848497
+.long	0xa65353f5,0xa65353f5
+.long	0xb9d1d168,0xb9d1d168
+.long	0x00000000,0x00000000
+.long	0xc1eded2c,0xc1eded2c
+.long	0x40202060,0x40202060
+.long	0xe3fcfc1f,0xe3fcfc1f
+.long	0x79b1b1c8,0x79b1b1c8
+.long	0xb65b5bed,0xb65b5bed
+.long	0xd46a6abe,0xd46a6abe
+.long	0x8dcbcb46,0x8dcbcb46
+.long	0x67bebed9,0x67bebed9
+.long	0x7239394b,0x7239394b
+.long	0x944a4ade,0x944a4ade
+.long	0x984c4cd4,0x984c4cd4
+.long	0xb05858e8,0xb05858e8
+.long	0x85cfcf4a,0x85cfcf4a
+.long	0xbbd0d06b,0xbbd0d06b
+.long	0xc5efef2a,0xc5efef2a
+.long	0x4faaaae5,0x4faaaae5
+.long	0xedfbfb16,0xedfbfb16
+.long	0x864343c5,0x864343c5
+.long	0x9a4d4dd7,0x9a4d4dd7
+.long	0x66333355,0x66333355
+.long	0x11858594,0x11858594
+.long	0x8a4545cf,0x8a4545cf
+.long	0xe9f9f910,0xe9f9f910
+.long	0x04020206,0x04020206
+.long	0xfe7f7f81,0xfe7f7f81
+.long	0xa05050f0,0xa05050f0
+.long	0x783c3c44,0x783c3c44
+.long	0x259f9fba,0x259f9fba
+.long	0x4ba8a8e3,0x4ba8a8e3
+.long	0xa25151f3,0xa25151f3
+.long	0x5da3a3fe,0x5da3a3fe
+.long	0x804040c0,0x804040c0
+.long	0x058f8f8a,0x058f8f8a
+.long	0x3f9292ad,0x3f9292ad
+.long	0x219d9dbc,0x219d9dbc
+.long	0x70383848,0x70383848
+.long	0xf1f5f504,0xf1f5f504
+.long	0x63bcbcdf,0x63bcbcdf
+.long	0x77b6b6c1,0x77b6b6c1
+.long	0xafdada75,0xafdada75
+.long	0x42212163,0x42212163
+.long	0x20101030,0x20101030
+.long	0xe5ffff1a,0xe5ffff1a
+.long	0xfdf3f30e,0xfdf3f30e
+.long	0xbfd2d26d,0xbfd2d26d
+.long	0x81cdcd4c,0x81cdcd4c
+.long	0x180c0c14,0x180c0c14
+.long	0x26131335,0x26131335
+.long	0xc3ecec2f,0xc3ecec2f
+.long	0xbe5f5fe1,0xbe5f5fe1
+.long	0x359797a2,0x359797a2
+.long	0x884444cc,0x884444cc
+.long	0x2e171739,0x2e171739
+.long	0x93c4c457,0x93c4c457
+.long	0x55a7a7f2,0x55a7a7f2
+.long	0xfc7e7e82,0xfc7e7e82
+.long	0x7a3d3d47,0x7a3d3d47
+.long	0xc86464ac,0xc86464ac
+.long	0xba5d5de7,0xba5d5de7
+.long	0x3219192b,0x3219192b
+.long	0xe6737395,0xe6737395
+.long	0xc06060a0,0xc06060a0
+.long	0x19818198,0x19818198
+.long	0x9e4f4fd1,0x9e4f4fd1
+.long	0xa3dcdc7f,0xa3dcdc7f
+.long	0x44222266,0x44222266
+.long	0x542a2a7e,0x542a2a7e
+.long	0x3b9090ab,0x3b9090ab
+.long	0x0b888883,0x0b888883
+.long	0x8c4646ca,0x8c4646ca
+.long	0xc7eeee29,0xc7eeee29
+.long	0x6bb8b8d3,0x6bb8b8d3
+.long	0x2814143c,0x2814143c
+.long	0xa7dede79,0xa7dede79
+.long	0xbc5e5ee2,0xbc5e5ee2
+.long	0x160b0b1d,0x160b0b1d
+.long	0xaddbdb76,0xaddbdb76
+.long	0xdbe0e03b,0xdbe0e03b
+.long	0x64323256,0x64323256
+.long	0x743a3a4e,0x743a3a4e
+.long	0x140a0a1e,0x140a0a1e
+.long	0x924949db,0x924949db
+.long	0x0c06060a,0x0c06060a
+.long	0x4824246c,0x4824246c
+.long	0xb85c5ce4,0xb85c5ce4
+.long	0x9fc2c25d,0x9fc2c25d
+.long	0xbdd3d36e,0xbdd3d36e
+.long	0x43acacef,0x43acacef
+.long	0xc46262a6,0xc46262a6
+.long	0x399191a8,0x399191a8
+.long	0x319595a4,0x319595a4
+.long	0xd3e4e437,0xd3e4e437
+.long	0xf279798b,0xf279798b
+.long	0xd5e7e732,0xd5e7e732
+.long	0x8bc8c843,0x8bc8c843
+.long	0x6e373759,0x6e373759
+.long	0xda6d6db7,0xda6d6db7
+.long	0x018d8d8c,0x018d8d8c
+.long	0xb1d5d564,0xb1d5d564
+.long	0x9c4e4ed2,0x9c4e4ed2
+.long	0x49a9a9e0,0x49a9a9e0
+.long	0xd86c6cb4,0xd86c6cb4
+.long	0xac5656fa,0xac5656fa
+.long	0xf3f4f407,0xf3f4f407
+.long	0xcfeaea25,0xcfeaea25
+.long	0xca6565af,0xca6565af
+.long	0xf47a7a8e,0xf47a7a8e
+.long	0x47aeaee9,0x47aeaee9
+.long	0x10080818,0x10080818
+.long	0x6fbabad5,0x6fbabad5
+.long	0xf0787888,0xf0787888
+.long	0x4a25256f,0x4a25256f
+.long	0x5c2e2e72,0x5c2e2e72
+.long	0x381c1c24,0x381c1c24
+.long	0x57a6a6f1,0x57a6a6f1
+.long	0x73b4b4c7,0x73b4b4c7
+.long	0x97c6c651,0x97c6c651
+.long	0xcbe8e823,0xcbe8e823
+.long	0xa1dddd7c,0xa1dddd7c
+.long	0xe874749c,0xe874749c
+.long	0x3e1f1f21,0x3e1f1f21
+.long	0x964b4bdd,0x964b4bdd
+.long	0x61bdbddc,0x61bdbddc
+.long	0x0d8b8b86,0x0d8b8b86
+.long	0x0f8a8a85,0x0f8a8a85
+.long	0xe0707090,0xe0707090
+.long	0x7c3e3e42,0x7c3e3e42
+.long	0x71b5b5c4,0x71b5b5c4
+.long	0xcc6666aa,0xcc6666aa
+.long	0x904848d8,0x904848d8
+.long	0x06030305,0x06030305
+.long	0xf7f6f601,0xf7f6f601
+.long	0x1c0e0e12,0x1c0e0e12
+.long	0xc26161a3,0xc26161a3
+.long	0x6a35355f,0x6a35355f
+.long	0xae5757f9,0xae5757f9
+.long	0x69b9b9d0,0x69b9b9d0
+.long	0x17868691,0x17868691
+.long	0x99c1c158,0x99c1c158
+.long	0x3a1d1d27,0x3a1d1d27
+.long	0x279e9eb9,0x279e9eb9
+.long	0xd9e1e138,0xd9e1e138
+.long	0xebf8f813,0xebf8f813
+.long	0x2b9898b3,0x2b9898b3
+.long	0x22111133,0x22111133
+.long	0xd26969bb,0xd26969bb
+.long	0xa9d9d970,0xa9d9d970
+.long	0x078e8e89,0x078e8e89
+.long	0x339494a7,0x339494a7
+.long	0x2d9b9bb6,0x2d9b9bb6
+.long	0x3c1e1e22,0x3c1e1e22
+.long	0x15878792,0x15878792
+.long	0xc9e9e920,0xc9e9e920
+.long	0x87cece49,0x87cece49
+.long	0xaa5555ff,0xaa5555ff
+.long	0x50282878,0x50282878
+.long	0xa5dfdf7a,0xa5dfdf7a
+.long	0x038c8c8f,0x038c8c8f
+.long	0x59a1a1f8,0x59a1a1f8
+.long	0x09898980,0x09898980
+.long	0x1a0d0d17,0x1a0d0d17
+.long	0x65bfbfda,0x65bfbfda
+.long	0xd7e6e631,0xd7e6e631
+.long	0x844242c6,0x844242c6
+.long	0xd06868b8,0xd06868b8
+.long	0x824141c3,0x824141c3
+.long	0x299999b0,0x299999b0
+.long	0x5a2d2d77,0x5a2d2d77
+.long	0x1e0f0f11,0x1e0f0f11
+.long	0x7bb0b0cb,0x7bb0b0cb
+.long	0xa85454fc,0xa85454fc
+.long	0x6dbbbbd6,0x6dbbbbd6
+.long	0x2c16163a,0x2c16163a
+.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
+.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
+.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
+.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
+.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
+.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
+.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
+.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
+.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
+.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
+.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
+.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
+.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
+.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
+.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
+.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
+.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
+.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
+.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
+.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
+.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
+.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
+.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
+.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
+.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
+.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
+.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
+.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
+.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
+.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
+.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
+.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
+.long	0x51f4a750,0x51f4a750
+.long	0x7e416553,0x7e416553
+.long	0x1a17a4c3,0x1a17a4c3
+.long	0x3a275e96,0x3a275e96
+.long	0x3bab6bcb,0x3bab6bcb
+.long	0x1f9d45f1,0x1f9d45f1
+.long	0xacfa58ab,0xacfa58ab
+.long	0x4be30393,0x4be30393
+.long	0x2030fa55,0x2030fa55
+.long	0xad766df6,0xad766df6
+.long	0x88cc7691,0x88cc7691
+.long	0xf5024c25,0xf5024c25
+.long	0x4fe5d7fc,0x4fe5d7fc
+.long	0xc52acbd7,0xc52acbd7
+.long	0x26354480,0x26354480
+.long	0xb562a38f,0xb562a38f
+.long	0xdeb15a49,0xdeb15a49
+.long	0x25ba1b67,0x25ba1b67
+.long	0x45ea0e98,0x45ea0e98
+.long	0x5dfec0e1,0x5dfec0e1
+.long	0xc32f7502,0xc32f7502
+.long	0x814cf012,0x814cf012
+.long	0x8d4697a3,0x8d4697a3
+.long	0x6bd3f9c6,0x6bd3f9c6
+.long	0x038f5fe7,0x038f5fe7
+.long	0x15929c95,0x15929c95
+.long	0xbf6d7aeb,0xbf6d7aeb
+.long	0x955259da,0x955259da
+.long	0xd4be832d,0xd4be832d
+.long	0x587421d3,0x587421d3
+.long	0x49e06929,0x49e06929
+.long	0x8ec9c844,0x8ec9c844
+.long	0x75c2896a,0x75c2896a
+.long	0xf48e7978,0xf48e7978
+.long	0x99583e6b,0x99583e6b
+.long	0x27b971dd,0x27b971dd
+.long	0xbee14fb6,0xbee14fb6
+.long	0xf088ad17,0xf088ad17
+.long	0xc920ac66,0xc920ac66
+.long	0x7dce3ab4,0x7dce3ab4
+.long	0x63df4a18,0x63df4a18
+.long	0xe51a3182,0xe51a3182
+.long	0x97513360,0x97513360
+.long	0x62537f45,0x62537f45
+.long	0xb16477e0,0xb16477e0
+.long	0xbb6bae84,0xbb6bae84
+.long	0xfe81a01c,0xfe81a01c
+.long	0xf9082b94,0xf9082b94
+.long	0x70486858,0x70486858
+.long	0x8f45fd19,0x8f45fd19
+.long	0x94de6c87,0x94de6c87
+.long	0x527bf8b7,0x527bf8b7
+.long	0xab73d323,0xab73d323
+.long	0x724b02e2,0x724b02e2
+.long	0xe31f8f57,0xe31f8f57
+.long	0x6655ab2a,0x6655ab2a
+.long	0xb2eb2807,0xb2eb2807
+.long	0x2fb5c203,0x2fb5c203
+.long	0x86c57b9a,0x86c57b9a
+.long	0xd33708a5,0xd33708a5
+.long	0x302887f2,0x302887f2
+.long	0x23bfa5b2,0x23bfa5b2
+.long	0x02036aba,0x02036aba
+.long	0xed16825c,0xed16825c
+.long	0x8acf1c2b,0x8acf1c2b
+.long	0xa779b492,0xa779b492
+.long	0xf307f2f0,0xf307f2f0
+.long	0x4e69e2a1,0x4e69e2a1
+.long	0x65daf4cd,0x65daf4cd
+.long	0x0605bed5,0x0605bed5
+.long	0xd134621f,0xd134621f
+.long	0xc4a6fe8a,0xc4a6fe8a
+.long	0x342e539d,0x342e539d
+.long	0xa2f355a0,0xa2f355a0
+.long	0x058ae132,0x058ae132
+.long	0xa4f6eb75,0xa4f6eb75
+.long	0x0b83ec39,0x0b83ec39
+.long	0x4060efaa,0x4060efaa
+.long	0x5e719f06,0x5e719f06
+.long	0xbd6e1051,0xbd6e1051
+.long	0x3e218af9,0x3e218af9
+.long	0x96dd063d,0x96dd063d
+.long	0xdd3e05ae,0xdd3e05ae
+.long	0x4de6bd46,0x4de6bd46
+.long	0x91548db5,0x91548db5
+.long	0x71c45d05,0x71c45d05
+.long	0x0406d46f,0x0406d46f
+.long	0x605015ff,0x605015ff
+.long	0x1998fb24,0x1998fb24
+.long	0xd6bde997,0xd6bde997
+.long	0x894043cc,0x894043cc
+.long	0x67d99e77,0x67d99e77
+.long	0xb0e842bd,0xb0e842bd
+.long	0x07898b88,0x07898b88
+.long	0xe7195b38,0xe7195b38
+.long	0x79c8eedb,0x79c8eedb
+.long	0xa17c0a47,0xa17c0a47
+.long	0x7c420fe9,0x7c420fe9
+.long	0xf8841ec9,0xf8841ec9
+.long	0x00000000,0x00000000
+.long	0x09808683,0x09808683
+.long	0x322bed48,0x322bed48
+.long	0x1e1170ac,0x1e1170ac
+.long	0x6c5a724e,0x6c5a724e
+.long	0xfd0efffb,0xfd0efffb
+.long	0x0f853856,0x0f853856
+.long	0x3daed51e,0x3daed51e
+.long	0x362d3927,0x362d3927
+.long	0x0a0fd964,0x0a0fd964
+.long	0x685ca621,0x685ca621
+.long	0x9b5b54d1,0x9b5b54d1
+.long	0x24362e3a,0x24362e3a
+.long	0x0c0a67b1,0x0c0a67b1
+.long	0x9357e70f,0x9357e70f
+.long	0xb4ee96d2,0xb4ee96d2
+.long	0x1b9b919e,0x1b9b919e
+.long	0x80c0c54f,0x80c0c54f
+.long	0x61dc20a2,0x61dc20a2
+.long	0x5a774b69,0x5a774b69
+.long	0x1c121a16,0x1c121a16
+.long	0xe293ba0a,0xe293ba0a
+.long	0xc0a02ae5,0xc0a02ae5
+.long	0x3c22e043,0x3c22e043
+.long	0x121b171d,0x121b171d
+.long	0x0e090d0b,0x0e090d0b
+.long	0xf28bc7ad,0xf28bc7ad
+.long	0x2db6a8b9,0x2db6a8b9
+.long	0x141ea9c8,0x141ea9c8
+.long	0x57f11985,0x57f11985
+.long	0xaf75074c,0xaf75074c
*** 70501 LINES SKIPPED ***