Skip to content

Commit 9bc127c

Browse files
Edwards twisted torsion 16
1 parent 91fe5ef commit 9bc127c

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

src/modes/RunEcmTwistedEdwards.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,37 @@ struct EC_mod4 {
146146
mpz_class y3 = (lambda * (P.x - x3) - P.y) % N; if (y3 < 0) y3 += N;
147147
return Pt{x3, y3, false};
148148
}
149+
#ifdef _MSC_VER
150+
# include <intrin.h>
151+
#endif
152+
153+
static inline int msb_index_u64(uint64_t n) {
154+
if (!n) return -1;
155+
#if defined(_MSC_VER) && !defined(__clang__)
156+
unsigned long idx;
157+
#if defined(_M_X64) || defined(_M_ARM64)
158+
_BitScanReverse64(&idx, n);
159+
return (int)idx;
160+
#else
161+
// 32-bit MSVC fallback
162+
unsigned long hi = (unsigned long)(n >> 32);
163+
if (hi) { _BitScanReverse(&idx, hi); return (int)idx + 32; }
164+
_BitScanReverse(&idx, (unsigned long)(n & 0xFFFFFFFFu));
165+
return (int)idx;
166+
#endif
167+
#else
168+
// GCC/Clang
169+
return 63 - __builtin_clzll(n);
170+
#endif
171+
}
149172

150173
static void get(uint64_t n, int s1, int t1, const mpz_class& N, mpz_class& s, mpz_class& t) {
151174
Pt P0, P;
152175
P0.x = s1; if (s1 < 0) P0.x += N; P0.x %= N;
153176
P0.y = t1; if (t1 < 0) P0.y += N; P0.y %= N;
154177
P = P0;
155178

156-
int msb = 63 - __builtin_clzll(n);
179+
int msb = msb_index_u64(n);
157180
for (int b = msb - 1; b >= 0; --b) {
158181
P = dbl(P, N);
159182
if (((n >> b) & 1ULL) != 0) P = add(P, P0, N);
@@ -727,10 +750,10 @@ int App::runECMMarinTwistedEdwards()
727750
auto hadamard = [&](size_t a, size_t b, size_t s, size_t d){
728751
eng->addsub((engine::Reg)s, (engine::Reg)d, (engine::Reg)a, (engine::Reg)b); // s=a+b, d=a-b
729752
};
730-
auto hadamard_copy = [&](size_t a, size_t b, size_t s, size_t d, size_t s_copy, size_t d_copy){
753+
/*auto hadamard_copy = [&](size_t a, size_t b, size_t s, size_t d, size_t s_copy, size_t d_copy){
731754
eng->addsub_copy((engine::Reg)s,(engine::Reg)d,(engine::Reg)s_copy,(engine::Reg)d_copy,
732755
(engine::Reg)a,(engine::Reg)b);
733-
};
756+
};*/
734757
// Inputs/outputs mapping :
735758
// X1=R3, Y1=R4, Z1=R1, T1=R5
736759
// X2=R6, Y2=R7, Z2=1 (affine), T2=R9
@@ -854,8 +877,8 @@ int App::runECMMarinTwistedEdwards()
854877
//eng->add ((engine::Reg)23,(engine::Reg)RY); // 23 = G
855878
//eng->copy((engine::Reg)25,(engine::Reg)RX);
856879
//eng->sub_reg((engine::Reg)25,(engine::Reg)RY); // 25 = H
857-
hadamard_copy(RX,RY,23,25,24,RX);
858-
//eng->copy((engine::Reg)24,(engine::Reg)23);
880+
hadamard(RX,RY,23,25);
881+
eng->copy((engine::Reg)24,(engine::Reg)23);
859882
eng->sub_reg((engine::Reg)24,(engine::Reg)RZ); // 24 = F
860883

861884

@@ -920,8 +943,8 @@ int App::runECMMarinTwistedEdwards()
920943
//eng->add ((engine::Reg)23,(engine::Reg)RY); // 23 = G
921944
//eng->copy((engine::Reg)25,(engine::Reg)RX);
922945
//eng->sub_reg((engine::Reg)25,(engine::Reg)RY); // 25 = H
923-
hadamard_copy(RX,RY,23,25,24,RX);
924-
//eng->copy((engine::Reg)24,(engine::Reg)23);
946+
hadamard(RX,RY,23,25);
947+
eng->copy((engine::Reg)24,(engine::Reg)23);
925948
eng->sub_reg((engine::Reg)24,(engine::Reg)RZ); // 24 = F
926949

927950

0 commit comments

Comments
 (0)