diff options
author | Tomas Mraz <tomas@openssl.org> | 2021-06-18 17:35:40 +0200 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2021-06-25 08:49:45 +0100 |
commit | 3d178db73b1ac13011e950baae5225837c587df1 (patch) | |
tree | 448200c4eb072c508064fa3da5dfac76a89829c9 /crypto/bn | |
parent | 991519aeb99b41e2239b20a254535436cad39553 (diff) |
ppccap.c: Split out algorithm-specific functions
Fixes #13336
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15828)
Diffstat (limited to 'crypto/bn')
-rw-r--r-- | crypto/bn/bn_ppc.c | 51 | ||||
-rw-r--r-- | crypto/bn/build.info | 2 |
2 files changed, 52 insertions, 1 deletions
diff --git a/crypto/bn/bn_ppc.c b/crypto/bn/bn_ppc.c new file mode 100644 index 0000000000..24b384acbd --- /dev/null +++ b/crypto/bn/bn_ppc.c @@ -0,0 +1,51 @@ +/* + * Copyright 2009-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include <openssl/crypto.h> +#include <openssl/bn.h> +#include "crypto/ppc_arch.h" +#include "bn_local.h" + +int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + const BN_ULONG *np, const BN_ULONG *n0, int num) +{ + int bn_mul_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + const BN_ULONG *np, const BN_ULONG *n0, int num); + int bn_mul4x_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + const BN_ULONG *np, const BN_ULONG *n0, int num); + int bn_mul_mont_fixed_n6(BN_ULONG *rp, const BN_ULONG *ap, + const BN_ULONG *bp, const BN_ULONG *np, + const BN_ULONG *n0, int num); + int bn_mul_mont_300_fixed_n6(BN_ULONG *rp, const BN_ULONG *ap, + const BN_ULONG *bp, const BN_ULONG *np, + const BN_ULONG *n0, int num); + + if (num < 4) + return 0; + + if ((num & 3) == 0) + return bn_mul4x_mont_int(rp, ap, bp, np, n0, num); + + /* + * There used to be [optional] call to bn_mul_mont_fpu64 here, + * but above subroutine is faster on contemporary processors. + * Formulation means that there might be old processors where + * FPU code path would be faster, POWER6 perhaps, but there was + * no opportunity to figure it out... + */ + + if (num == 6) { + if (OPENSSL_ppccap_P & PPC_MADD300) + return bn_mul_mont_300_fixed_n6(rp, ap, bp, np, n0, num); + else + return bn_mul_mont_fixed_n6(rp, ap, bp, np, n0, num); + } + + return bn_mul_mont_int(rp, ap, bp, np, n0, num); +} diff --git a/crypto/bn/build.info b/crypto/bn/build.info index d0c1034bde..c3c71884e5 100644 --- a/crypto/bn/build.info +++ b/crypto/bn/build.info @@ -77,7 +77,7 @@ IF[{- !$disabled{asm} -}] $BNASM_parisc20_64=$BNASM_parisc11 $BNDEF_parisc20_64=$BNDEF_parisc11 - $BNASM_ppc32=bn-ppc.s ppc-mont.s + $BNASM_ppc32=bn_ppc.c bn-ppc.s ppc-mont.s $BNDEF_ppc32=OPENSSL_BN_ASM_MONT $BNASM_ppc64=$BNASM_ppc32 ppc64-mont-fixed.s $BNDEF_ppc64=$BNDEF_ppc32 |