reverted to previous fr_raw_generic.cpp and added polygon team fix

This commit is contained in:
0xturboblitz
2024-05-11 15:35:15 +09:00
parent 2c8afd1035
commit 10cd473a3f
4 changed files with 84 additions and 84 deletions

View File

@@ -10,60 +10,58 @@ static uint64_t lboMask = 0x3fffffffffffffff;
void Fr_rawAdd(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawElement pRawB)
{
// Cast the pointers from uint64_t* to mp_ptr (unsigned long long*) to match the expected types
uint64_t carry = mpn_add_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
uint64_t carry = mpn_add_n(pRawResult, pRawA, pRawB, Fr_N64);
if(carry || mpn_cmp((mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if(carry || mpn_cmp(pRawResult, Fr_rawq, Fr_N64) >= 0)
{
// Also cast the pointers for mpn_sub_n for consistency
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawAddLS(FrRawElement pRawResult, FrRawElement pRawA, uint64_t rawB)
{
uint64_t carry = mpn_add_1((mp_ptr)pRawResult, (mp_srcptr)pRawA, Fr_N64, rawB);
uint64_t carry = mpn_add_1(pRawResult, pRawA, Fr_N64, rawB);
if(carry || mpn_cmp((mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if(carry || mpn_cmp(pRawResult, Fr_rawq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawSub(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawElement pRawB)
{
uint64_t carry = mpn_sub_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
uint64_t carry = mpn_sub_n(pRawResult, pRawA, pRawB, Fr_N64);
if(carry)
{
mpn_add_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_add_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawSubRegular(FrRawElement pRawResult, FrRawElement pRawA, FrRawElement pRawB)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
mpn_sub_n(pRawResult, pRawA, pRawB, Fr_N64);
}
void Fr_rawSubSL(FrRawElement pRawResult, uint64_t rawA, FrRawElement pRawB)
{
FrRawElement pRawA = {rawA, 0, 0, 0};
uint64_t carry = mpn_sub_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
uint64_t carry = mpn_sub_n(pRawResult, pRawA, pRawB, Fr_N64);
if(carry)
{
mpn_add_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_add_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawSubLS(FrRawElement pRawResult, FrRawElement pRawA, uint64_t rawB)
{
uint64_t carry = mpn_sub_1((mp_ptr)pRawResult, (mp_srcptr)pRawA, Fr_N64, rawB);
uint64_t carry = mpn_sub_1(pRawResult, pRawA, Fr_N64, rawB);
if(carry)
{
mpn_add_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_add_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
@@ -71,25 +69,25 @@ void Fr_rawNeg(FrRawElement pRawResult, const FrRawElement pRawA)
{
const uint64_t zero[Fr_N64] = {0, 0, 0, 0};
if (mpn_cmp((mp_srcptr)pRawA, (mp_srcptr)zero, Fr_N64) != 0)
if (mpn_cmp(pRawA, zero, Fr_N64) != 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, (mp_srcptr)pRawA, Fr_N64);
mpn_sub_n(pRawResult, Fr_rawq, pRawA, Fr_N64);
}
else
{
mpn_copyi((mp_ptr)pRawResult, (mp_srcptr)zero, Fr_N64);
mpn_copyi(pRawResult, zero, Fr_N64);
}
}
// Substracts a long element and a short element form 0
void Fr_rawNegLS(FrRawElement pRawResult, FrRawElement pRawA, uint64_t rawB)
{
uint64_t carry1 = mpn_sub_1((mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64, rawB);
uint64_t carry2 = mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)pRawA, Fr_N64);
uint64_t carry1 = mpn_sub_1(pRawResult, Fr_rawq, Fr_N64, rawB);
uint64_t carry2 = mpn_sub_n(pRawResult, pRawResult, pRawA, Fr_N64);
if (carry1 || carry2)
{
mpn_add_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_add_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
@@ -100,9 +98,10 @@ void Fr_rawCopy(FrRawElement pRawResult, const FrRawElement pRawA)
pRawResult[2] = pRawA[2];
pRawResult[3] = pRawA[3];
}
int Fr_rawIsEq(const FrRawElement pRawA, const FrRawElement pRawB)
{
return mpn_cmp((mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64) == 0;
return mpn_cmp(pRawA, pRawB, Fr_N64) == 0;
}
void Fr_rawMMul(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawElement pRawB)
@@ -117,34 +116,34 @@ void Fr_rawMMul(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawEl
uint64_t product2[N] = {0};
uint64_t product3[N] = {0};
product0[4] = mpn_mul_1((mp_ptr)product0, (mp_srcptr)pRawB, Fr_N64, pRawA[0]);
product0[4] = mpn_mul_1(product0, pRawB, Fr_N64, pRawA[0]);
np0 = Fr_np * product0[0];
product1[1] = mpn_addmul_1((mp_ptr)product0, (mp_srcptr)mq, N, np0);
product1[1] = mpn_addmul_1(product0, mq, N, np0);
product1[4] = mpn_addmul_1((mp_ptr)product1, (mp_srcptr)pRawB, Fr_N64, pRawA[1]);
mpn_add((mp_ptr)product1, (mp_ptr)product1, N, (mp_ptr)product0+1, N-1);
product1[4] = mpn_addmul_1(product1, pRawB, Fr_N64, pRawA[1]);
mpn_add(product1, product1, N, product0+1, N-1);
np0 = Fr_np * product1[0];
product2[1] = mpn_addmul_1((mp_ptr)product1, (mp_srcptr)mq, N, np0);
product2[1] = mpn_addmul_1(product1, mq, N, np0);
product2[4] = mpn_addmul_1((mp_ptr)product2, (mp_srcptr)pRawB, Fr_N64, pRawA[2]);
mpn_add((mp_ptr)product2, (mp_ptr)product2, N, (mp_ptr)product1+1, N-1);
product2[4] = mpn_addmul_1(product2, pRawB, Fr_N64, pRawA[2]);
mpn_add(product2, product2, N, product1+1, N-1);
np0 = Fr_np * product2[0];
product3[1] = mpn_addmul_1((mp_ptr)product2, (mp_srcptr)mq, N, np0);
product3[1] = mpn_addmul_1(product2, mq, N, np0);
product3[4] = mpn_addmul_1((mp_ptr)product3, (mp_srcptr)pRawB, Fr_N64, pRawA[3]);
mpn_add((mp_ptr)product3, (mp_ptr)product3, N, (mp_ptr)product2+1, N-1);
product3[4] = mpn_addmul_1(product3, pRawB, Fr_N64, pRawA[3]);
mpn_add(product3, product3, N, product2+1, N-1);
np0 = Fr_np * product3[0];
mpn_addmul_1((mp_ptr)product3, (mp_srcptr)mq, N, np0);
mpn_addmul_1(product3, mq, N, np0);
mpn_copyi((mp_ptr)pRawResult, (mp_ptr)product3+1, Fr_N64);
mpn_copyi(pRawResult, product3+1, Fr_N64);
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)mq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, mq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)mq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, mq, Fr_N64);
}
}
@@ -165,30 +164,31 @@ void Fr_rawMMul1(FrRawElement pRawResult, const FrRawElement pRawA, uint64_t pRa
uint64_t product2[N] = {0};
uint64_t product3[N] = {0};
product0[4] = mpn_mul_1((mp_ptr)product0, (mp_srcptr)pRawA, Fr_N64, pRawB);
product0[4] = mpn_mul_1(product0, pRawA, Fr_N64, pRawB);
np0 = Fr_np * product0[0];
product1[1] = mpn_addmul_1((mp_ptr)product0, (mp_srcptr)mq, N, np0);
mpn_add((mp_ptr)product1, (mp_ptr)product1, N, (mp_ptr)product0+1, N-1);
product1[1] = mpn_addmul_1(product0, mq, N, np0);
mpn_add(product1, product1, N, product0+1, N-1);
np0 = Fr_np * product1[0];
product2[1] = mpn_addmul_1((mp_ptr)product1, (mp_srcptr)mq, N, np0);
mpn_add((mp_ptr)product2, (mp_ptr)product2, N, (mp_ptr)product1+1, N-1);
product2[1] = mpn_addmul_1(product1, mq, N, np0);
mpn_add(product2, product2, N, product1+1, N-1);
np0 = Fr_np * product2[0];
product3[1] = mpn_addmul_1((mp_ptr)product2, (mp_srcptr)mq, N, np0);
mpn_add((mp_ptr)product3, (mp_ptr)product3, N, (mp_ptr)product2+1, N-1);
product3[1] = mpn_addmul_1(product2, mq, N, np0);
mpn_add(product3, product3, N, product2+1, N-1);
np0 = Fr_np * product3[0];
mpn_addmul_1((mp_ptr)product3, (mp_srcptr)mq, N, np0);
mpn_addmul_1(product3, mq, N, np0);
mpn_copyi((mp_ptr)pRawResult, (mp_ptr)product3+1, Fr_N64);
mpn_copyi(pRawResult, product3+1, Fr_N64);
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)mq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, mq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)mq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, mq, Fr_N64);
}
}
void Fr_rawToMontgomery(FrRawElement pRawResult, const FrRawElement &pRawA)
{
Fr_rawMMul(pRawResult, pRawA, Fr_rawR2);
@@ -206,39 +206,39 @@ void Fr_rawFromMontgomery(FrRawElement pRawResult, const FrRawElement &pRawA)
uint64_t product2[N] = {0};
uint64_t product3[N] = {0};
mpn_copyi((mp_ptr)product0, (mp_srcptr)pRawA, Fr_N64); product0[4] = 0;
mpn_copyi(product0, pRawA, Fr_N64); product0[4] = 0;
np0 = Fr_np * product0[0];
product1[1] = mpn_addmul_1((mp_ptr)product0, (mp_srcptr)mq, N, np0);
mpn_add((mp_ptr)product1, (mp_ptr)product1, N, (mp_ptr)product0+1, N-1);
product1[1] = mpn_addmul_1(product0, mq, N, np0);
mpn_add(product1, product1, N, product0+1, N-1);
np0 = Fr_np * product1[0];
product2[1] = mpn_addmul_1((mp_ptr)product1, (mp_srcptr)mq, N, np0);
mpn_add((mp_ptr)product2, (mp_ptr)product2, N, (mp_ptr)product1+1, N-1);
product2[1] = mpn_addmul_1(product1, mq, N, np0);
mpn_add(product2, product2, N, product1+1, N-1);
np0 = Fr_np * product2[0];
product3[1] = mpn_addmul_1((mp_ptr)product2, (mp_srcptr)mq, N, np0);
mpn_add((mp_ptr)product3, (mp_ptr)product3, N, (mp_ptr)product2+1, N-1);
product3[1] = mpn_addmul_1(product2, mq, N, np0);
mpn_add(product3, product3, N, product2+1, N-1);
np0 = Fr_np * product3[0];
mpn_addmul_1((mp_ptr)product3, (mp_srcptr)mq, N, np0);
mpn_addmul_1(product3, mq, N, np0);
mpn_copyi((mp_ptr)pRawResult, (mp_ptr)product3+1, Fr_N64);
mpn_copyi(pRawResult, product3+1, Fr_N64);
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)mq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, mq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)mq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, mq, Fr_N64);
}
}
int Fr_rawIsZero(const FrRawElement rawA)
{
return mpn_zero_p((mp_srcptr)rawA, Fr_N64) ? 1 : 0;
return mpn_zero_p(rawA, Fr_N64) ? 1 : 0;
}
int Fr_rawCmp(FrRawElement pRawA, FrRawElement pRawB)
{
return mpn_cmp((mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
return mpn_cmp(pRawA, pRawB, Fr_N64);
}
void Fr_rawSwap(FrRawElement pRawResult, FrRawElement pRawA)
@@ -274,43 +274,43 @@ void Fr_rawCopyS2L(FrRawElement pRawResult, int64_t val)
pRawResult[2] = -1;
pRawResult[3] = -1;
mpn_add_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_add_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawAnd(FrRawElement pRawResult, FrRawElement pRawA, FrRawElement pRawB)
{
mpn_and_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
mpn_and_n(pRawResult, pRawA, pRawB, Fr_N64);
pRawResult[3] &= lboMask;
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, Fr_rawq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawOr(FrRawElement pRawResult, FrRawElement pRawA, FrRawElement pRawB)
{
mpn_ior_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
mpn_ior_n(pRawResult, pRawA, pRawB, Fr_N64);
pRawResult[3] &= lboMask;
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, Fr_rawq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
void Fr_rawXor(FrRawElement pRawResult, FrRawElement pRawA, FrRawElement pRawB)
{
mpn_xor_n((mp_ptr)pRawResult, (mp_srcptr)pRawA, (mp_srcptr)pRawB, Fr_N64);
mpn_xor_n(pRawResult, pRawA, pRawB, Fr_N64);
pRawResult[3] &= lboMask;
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, Fr_rawq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
@@ -320,19 +320,19 @@ void Fr_rawShl(FrRawElement r, FrRawElement a, uint64_t b)
uint64_t word_shift = b / 64;
uint64_t word_count = Fr_N64 - word_shift;
mpn_copyi((mp_ptr)(r + word_shift), (mp_srcptr)a, word_count);
mpn_copyi(r + word_shift, a, word_count);
std::memset(r, 0, word_shift * sizeof(uint64_t));
if (bit_shift)
{
mpn_lshift((mp_ptr)r, (mp_ptr)r, Fr_N64, bit_shift);
mpn_lshift(r, r, Fr_N64, bit_shift);
}
r[3] &= lboMask;
if (mpn_cmp((mp_srcptr)r, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if (mpn_cmp(r, Fr_rawq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)r, (mp_ptr)r, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(r, r, Fr_rawq, Fr_N64);
}
}
@@ -342,23 +342,23 @@ void Fr_rawShr(FrRawElement r, FrRawElement a, uint64_t b)
const uint64_t word_shift = b / 64;
const uint64_t word_count = Fr_N64 - word_shift;
mpn_copyi((mp_ptr)r, (mp_srcptr)(a + word_shift), word_count);
mpn_copyi(r, a + word_shift, word_count);
std::memset(r + word_count, 0, word_shift * sizeof(uint64_t));
if (bit_shift)
{
mpn_rshift((mp_ptr)r, (mp_ptr)r, Fr_N64, bit_shift);
mpn_rshift(r, r, Fr_N64, bit_shift);
}
}
void Fr_rawNot(FrRawElement pRawResult, FrRawElement pRawA)
{
mpn_com((mp_ptr)pRawResult, (mp_srcptr)pRawA, Fr_N64);
mpn_com(pRawResult, pRawA, Fr_N64);
pRawResult[3] &= lboMask;
if (mpn_cmp((mp_srcptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64) >= 0)
if (mpn_cmp(pRawResult, Fr_rawq, Fr_N64) >= 0)
{
mpn_sub_n((mp_ptr)pRawResult, (mp_ptr)pRawResult, (mp_srcptr)Fr_rawq, Fr_N64);
mpn_sub_n(pRawResult, pRawResult, Fr_rawq, Fr_N64);
}
}
}

View File

@@ -128,7 +128,7 @@ build_android()
return 1
fi
export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/Darwin-x86_64
export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TARGET=aarch64-linux-android
export API=21
@@ -173,7 +173,7 @@ build_android_x86_64()
return 1
fi
export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/Darwin-x86_64
export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TARGET=x86_64-linux-android
export API=21

View File

@@ -62,7 +62,7 @@ else()
endif()
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin" AND NOT TARGET_PLATFORM MATCHES "^android(_x86_64)?")
set(GMP_DEFINIONS -D_LONG_LONG_LIMB)
endif()

View File

@@ -17,7 +17,7 @@ endif()
if(USE_ASM AND ARCH MATCHES "x86_64")
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin" AND NOT TARGET_PLATFORM MATCHES "^android(_x86_64)?")
set(NASM_FLAGS -fmacho64 --prefix _)
else()
set(NASM_FLAGS -felf64 -DPIC)