1111#include  "num.h" 
1212#include  "field.h" 
1313
14+ static  SECP256K1_INLINE  void  secp256k1_fe_cmov_limbs (uint32_t  * r , const  uint32_t  * a , int  len , int  flag ) {
15+     int  i ;
16+     uint32_t  diff , rest , r_i ;
17+     static  const  uint32_t  half  =  0x55555555UL ;
18+     VERIFY_CHECK (flag  ==  0  ||  flag  ==  1 );
19+     rest  =  half  << flag ;
20+     for  (i = 0 ; i < len ; i ++ ) {
21+         r_i  =  r [i ];
22+         diff  =  r_i  ^ a [i ];
23+         r_i  ^= (diff  &  half );
24+         r_i  ^= (diff  &  rest );
25+         r [i ] =  r_i ;
26+     }
27+ }
28+ 
1429#ifdef  VERIFY 
1530static  void  secp256k1_fe_verify (const  secp256k1_fe  * a ) {
1631    const  uint32_t  * d  =  a -> n ;
@@ -1092,19 +1107,7 @@ static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) {
10921107}
10931108
10941109static  SECP256K1_INLINE  void  secp256k1_fe_cmov (secp256k1_fe  * r , const  secp256k1_fe  * a , int  flag ) {
1095-     uint32_t  mask0 , mask1 ;
1096-     mask0  =  flag  +  ~((uint32_t )0 );
1097-     mask1  =  ~mask0 ;
1098-     r -> n [0 ] =  (r -> n [0 ] &  mask0 ) | (a -> n [0 ] &  mask1 );
1099-     r -> n [1 ] =  (r -> n [1 ] &  mask0 ) | (a -> n [1 ] &  mask1 );
1100-     r -> n [2 ] =  (r -> n [2 ] &  mask0 ) | (a -> n [2 ] &  mask1 );
1101-     r -> n [3 ] =  (r -> n [3 ] &  mask0 ) | (a -> n [3 ] &  mask1 );
1102-     r -> n [4 ] =  (r -> n [4 ] &  mask0 ) | (a -> n [4 ] &  mask1 );
1103-     r -> n [5 ] =  (r -> n [5 ] &  mask0 ) | (a -> n [5 ] &  mask1 );
1104-     r -> n [6 ] =  (r -> n [6 ] &  mask0 ) | (a -> n [6 ] &  mask1 );
1105-     r -> n [7 ] =  (r -> n [7 ] &  mask0 ) | (a -> n [7 ] &  mask1 );
1106-     r -> n [8 ] =  (r -> n [8 ] &  mask0 ) | (a -> n [8 ] &  mask1 );
1107-     r -> n [9 ] =  (r -> n [9 ] &  mask0 ) | (a -> n [9 ] &  mask1 );
1110+     secp256k1_fe_cmov_limbs (r -> n , a -> n , 10 , flag );
11081111#ifdef  VERIFY 
11091112    if  (a -> magnitude  >  r -> magnitude ) {
11101113        r -> magnitude  =  a -> magnitude ;
@@ -1114,17 +1117,7 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_
11141117}
11151118
11161119static  SECP256K1_INLINE  void  secp256k1_fe_storage_cmov (secp256k1_fe_storage  * r , const  secp256k1_fe_storage  * a , int  flag ) {
1117-     uint32_t  mask0 , mask1 ;
1118-     mask0  =  flag  +  ~((uint32_t )0 );
1119-     mask1  =  ~mask0 ;
1120-     r -> n [0 ] =  (r -> n [0 ] &  mask0 ) | (a -> n [0 ] &  mask1 );
1121-     r -> n [1 ] =  (r -> n [1 ] &  mask0 ) | (a -> n [1 ] &  mask1 );
1122-     r -> n [2 ] =  (r -> n [2 ] &  mask0 ) | (a -> n [2 ] &  mask1 );
1123-     r -> n [3 ] =  (r -> n [3 ] &  mask0 ) | (a -> n [3 ] &  mask1 );
1124-     r -> n [4 ] =  (r -> n [4 ] &  mask0 ) | (a -> n [4 ] &  mask1 );
1125-     r -> n [5 ] =  (r -> n [5 ] &  mask0 ) | (a -> n [5 ] &  mask1 );
1126-     r -> n [6 ] =  (r -> n [6 ] &  mask0 ) | (a -> n [6 ] &  mask1 );
1127-     r -> n [7 ] =  (r -> n [7 ] &  mask0 ) | (a -> n [7 ] &  mask1 );
1120+     secp256k1_fe_cmov_limbs (r -> n , a -> n , 8 , flag );
11281121}
11291122
11301123static  void  secp256k1_fe_to_storage (secp256k1_fe_storage  * r , const  secp256k1_fe  * a ) {
0 commit comments