forked from wolfSSL/wolfssl
Merge pull request #1962 from dgarske/fix_fe25519_noavx2
Fix for Intel Speedups with no AVX2 (part 2)
This commit is contained in:
@ -20,8 +20,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(USE_INTEL_SPEEDUP)
|
#if defined(USE_INTEL_SPEEDUP)
|
||||||
#define HAVE_INTEL_AVX1
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && ((__GNUC__ < 4) || \
|
#if defined(__GNUC__) && ((__GNUC__ < 4) || \
|
||||||
(__GNUC__ == 4 && __GNUC_MINOR__ <= 8))
|
(__GNUC__ == 4 && __GNUC_MINOR__ <= 8))
|
||||||
#undef NO_AVX2_SUPPORT
|
#undef NO_AVX2_SUPPORT
|
||||||
@ -54,7 +52,7 @@ static void (*fe_mul_p)(fe r, const fe a, const fe b) = fe_mul_x64;
|
|||||||
static void (*fe_sq_p)(fe r, const fe a) = fe_sq_x64;
|
static void (*fe_sq_p)(fe r, const fe a) = fe_sq_x64;
|
||||||
static void (*fe_sq2_p)(fe r, const fe a) = fe_sq2_x64;
|
static void (*fe_sq2_p)(fe r, const fe a) = fe_sq2_x64;
|
||||||
|
|
||||||
#ifdef HAVE_INTEL_AVX2
|
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
|
||||||
|
|
||||||
static int cpuFlagsSet = 0;
|
static int cpuFlagsSet = 0;
|
||||||
static int intelFlags;
|
static int intelFlags;
|
||||||
@ -63,18 +61,20 @@ static int intelFlags;
|
|||||||
|
|
||||||
void fe_init(void)
|
void fe_init(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_INTEL_AVX2
|
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
|
||||||
if (cpuFlagsSet)
|
if (cpuFlagsSet)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
intelFlags = cpuid_get_flags();
|
intelFlags = cpuid_get_flags();
|
||||||
cpuFlagsSet = 1;
|
cpuFlagsSet = 1;
|
||||||
|
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_mul_p = fe_mul_avx2;
|
fe_mul_p = fe_mul_avx2;
|
||||||
fe_sq_p = fe_sq_avx2;
|
fe_sq_p = fe_sq_avx2;
|
||||||
fe_sq2_p = fe_sq2_avx2;
|
fe_sq2_p = fe_sq2_avx2;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1096,6 +1096,7 @@ int curve25519(byte* r, byte* n, byte* a)
|
|||||||
fe_copy(x3, x1);
|
fe_copy(x3, x1);
|
||||||
fe_1(z3);
|
fe_1(z3);
|
||||||
|
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
j = 6;
|
j = 6;
|
||||||
for (i = 31; i >= 0; i--) {
|
for (i = 31; i >= 0; i--) {
|
||||||
@ -1134,7 +1135,9 @@ int curve25519(byte* r, byte* n, byte* a)
|
|||||||
fe_mul_avx2(x2, x2, z2);
|
fe_mul_avx2(x2, x2, z2);
|
||||||
fe_tobytes(r, x2);
|
fe_tobytes(r, x2);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
j = 6;
|
j = 6;
|
||||||
for (i = 31; i >= 0; i--) {
|
for (i = 31; i >= 0; i--) {
|
||||||
while (j >= 0) {
|
while (j >= 0) {
|
||||||
@ -1597,12 +1600,15 @@ uint64_t load_4(const unsigned char *in)
|
|||||||
void fe_ge_to_p2(fe rx, fe ry, fe rz, const fe px, const fe py, const fe pz,
|
void fe_ge_to_p2(fe rx, fe ry, fe rz, const fe px, const fe py, const fe pz,
|
||||||
const fe pt)
|
const fe pt)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_mul_avx2(rx, px, pt);
|
fe_mul_avx2(rx, px, pt);
|
||||||
fe_mul_avx2(ry, py, pz);
|
fe_mul_avx2(ry, py, pz);
|
||||||
fe_mul_avx2(rz, pz, pt);
|
fe_mul_avx2(rz, pz, pt);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_mul_x64(rx, px, pt);
|
fe_mul_x64(rx, px, pt);
|
||||||
fe_mul_x64(ry, py, pz);
|
fe_mul_x64(ry, py, pz);
|
||||||
fe_mul_x64(rz, pz, pt);
|
fe_mul_x64(rz, pz, pt);
|
||||||
@ -1612,13 +1618,16 @@ void fe_ge_to_p2(fe rx, fe ry, fe rz, const fe px, const fe py, const fe pz,
|
|||||||
void fe_ge_to_p3(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
void fe_ge_to_p3(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
||||||
const fe pz, const fe pt)
|
const fe pz, const fe pt)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_mul_avx2(rx, px, pt);
|
fe_mul_avx2(rx, px, pt);
|
||||||
fe_mul_avx2(ry, py, pz);
|
fe_mul_avx2(ry, py, pz);
|
||||||
fe_mul_avx2(rz, pz, pt);
|
fe_mul_avx2(rz, pz, pt);
|
||||||
fe_mul_avx2(rt, px, py);
|
fe_mul_avx2(rt, px, py);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_mul_x64(rx, px, pt);
|
fe_mul_x64(rx, px, pt);
|
||||||
fe_mul_x64(ry, py, pz);
|
fe_mul_x64(ry, py, pz);
|
||||||
fe_mul_x64(rz, pz, pt);
|
fe_mul_x64(rz, pz, pt);
|
||||||
@ -1630,6 +1639,7 @@ void fe_ge_dbl(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
const fe pz)
|
const fe pz)
|
||||||
{
|
{
|
||||||
fe t0;
|
fe t0;
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_sq_avx2(rx,px);
|
fe_sq_avx2(rx,px);
|
||||||
fe_sq_avx2(rz,py);
|
fe_sq_avx2(rz,py);
|
||||||
@ -1641,7 +1651,9 @@ void fe_ge_dbl(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
fe_sub_int(rx,t0,ry);
|
fe_sub_int(rx,t0,ry);
|
||||||
fe_sub_int(rt,rt,rz);
|
fe_sub_int(rt,rt,rz);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_sq_x64(rx,px);
|
fe_sq_x64(rx,px);
|
||||||
fe_sq_x64(rz,py);
|
fe_sq_x64(rz,py);
|
||||||
fe_sq2_x64(rt,pz);
|
fe_sq2_x64(rt,pz);
|
||||||
@ -1659,6 +1671,7 @@ void fe_ge_madd(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
const fe qyminusx)
|
const fe qyminusx)
|
||||||
{
|
{
|
||||||
fe t0;
|
fe t0;
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
@ -1671,7 +1684,9 @@ void fe_ge_madd(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
fe_add_int(rz,t0,rt);
|
fe_add_int(rz,t0,rt);
|
||||||
fe_sub_int(rt,t0,rt);
|
fe_sub_int(rt,t0,rt);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
fe_mul_x64(rz,rx,qyplusx);
|
fe_mul_x64(rz,rx,qyplusx);
|
||||||
@ -1690,6 +1705,7 @@ void fe_ge_msub(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
const fe qyminusx)
|
const fe qyminusx)
|
||||||
{
|
{
|
||||||
fe t0;
|
fe t0;
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
@ -1702,7 +1718,9 @@ void fe_ge_msub(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
fe_sub_int(rz,t0,rt);
|
fe_sub_int(rz,t0,rt);
|
||||||
fe_add_int(rt,t0,rt);
|
fe_add_int(rt,t0,rt);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
fe_mul_x64(rz,rx,qyminusx);
|
fe_mul_x64(rz,rx,qyminusx);
|
||||||
@ -1721,6 +1739,7 @@ void fe_ge_add(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
const fe qyplusx, const fe qyminusx)
|
const fe qyplusx, const fe qyminusx)
|
||||||
{
|
{
|
||||||
fe t0;
|
fe t0;
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
@ -1734,7 +1753,9 @@ void fe_ge_add(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
fe_add_int(rz,t0,rt);
|
fe_add_int(rz,t0,rt);
|
||||||
fe_sub_int(rt,t0,rt);
|
fe_sub_int(rt,t0,rt);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
fe_mul_x64(rz,rx,qyplusx);
|
fe_mul_x64(rz,rx,qyplusx);
|
||||||
@ -1754,6 +1775,7 @@ void fe_ge_sub(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
const fe qyplusx, const fe qyminusx)
|
const fe qyplusx, const fe qyminusx)
|
||||||
{
|
{
|
||||||
fe t0;
|
fe t0;
|
||||||
|
#ifdef HAVE_INTEL_AVX2
|
||||||
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
if (IS_INTEL_BMI2(intelFlags) && IS_INTEL_ADX(intelFlags)) {
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
@ -1767,7 +1789,9 @@ void fe_ge_sub(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py,
|
|||||||
fe_sub_int(rz,t0,rt);
|
fe_sub_int(rz,t0,rt);
|
||||||
fe_add_int(rt,t0,rt);
|
fe_add_int(rt,t0,rt);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
fe_add_int(rx,py,px);
|
fe_add_int(rx,py,px);
|
||||||
fe_sub_int(ry,py,px);
|
fe_sub_int(ry,py,px);
|
||||||
fe_mul_x64(rz,rx,qyminusx);
|
fe_mul_x64(rz,rx,qyminusx);
|
||||||
|
Reference in New Issue
Block a user