@@ -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