@@ -16,9 +16,18 @@ typedef unsigned long long llimb_t;
16
16
# pragma GCC diagnostic ignored "-Wstatic-in-inline"
17
17
#endif
18
18
19
+ #if !defined(__clang__ )
20
+ # if defined(__GNUC__ ) && __GNUC__ >=5
21
+ # define __builtin_assume (condition ) if (!(condition)) __builtin_unreachable()
22
+ # else
23
+ # define __builtin_assume (condition )
24
+ # endif
25
+ #endif
26
+
19
27
static void mul_mont_n (limb_t ret [], const limb_t a [], const limb_t b [],
20
28
const limb_t p [], limb_t n0 , size_t n )
21
29
{
30
+ __builtin_assume (n != 0 && n %2 == 0 );
22
31
llimb_t limbx ;
23
32
limb_t mask , borrow , mx , hi , tmp [n + 1 ], carry ;
24
33
size_t i , j ;
@@ -92,6 +101,7 @@ MUL_MONT_IMPL(384)
92
101
static void add_mod_n (limb_t ret [], const limb_t a [], const limb_t b [],
93
102
const limb_t p [], size_t n )
94
103
{
104
+ __builtin_assume (n != 0 );
95
105
llimb_t limbx ;
96
106
limb_t mask , carry , borrow , tmp [n ];
97
107
size_t i ;
@@ -125,6 +135,7 @@ ADD_MOD_IMPL(384)
125
135
static void sub_mod_n (limb_t ret [], const limb_t a [], const limb_t b [],
126
136
const limb_t p [], size_t n )
127
137
{
138
+ __builtin_assume (n != 0 );
128
139
llimb_t limbx ;
129
140
limb_t mask , carry , borrow ;
130
141
size_t i ;
@@ -155,6 +166,7 @@ SUB_MOD_IMPL(384)
155
166
static void mul_by_3_mod_n (limb_t ret [], const limb_t a [], const limb_t p [],
156
167
size_t n )
157
168
{
169
+ __builtin_assume (n != 0 );
158
170
llimb_t limbx ;
159
171
limb_t mask , carry , borrow , tmp [n ], two_a [n ];
160
172
size_t i ;
@@ -205,6 +217,7 @@ MUL_BY_3_MOD_IMPL(384)
205
217
static void lshift_mod_n (limb_t ret [], const limb_t a [], size_t count ,
206
218
const limb_t p [], size_t n )
207
219
{
220
+ __builtin_assume (n != 0 );
208
221
llimb_t limbx ;
209
222
limb_t mask , carry , borrow , tmp [n ];
210
223
size_t i ;
@@ -242,6 +255,7 @@ LSHIFT_MOD_IMPL(384)
242
255
static void cneg_mod_n (limb_t ret [], const limb_t a [], bool_t flag ,
243
256
const limb_t p [], size_t n )
244
257
{
258
+ __builtin_assume (n != 0 );
245
259
llimb_t limbx ;
246
260
limb_t borrow , mask , tmp [n ];
247
261
size_t i ;
@@ -269,6 +283,7 @@ CNEG_MOD_IMPL(384)
269
283
270
284
static limb_t check_mod_n (const byte a [], const limb_t p [], size_t n )
271
285
{
286
+ __builtin_assume (n != 0 );
272
287
llimb_t limbx ;
273
288
limb_t borrow , ai , acc ;
274
289
size_t i , j ;
@@ -293,6 +308,7 @@ CHECK_MOD_IMPL(256)
293
308
static limb_t add_n_check_mod_n (byte ret [], const byte a [], const byte b [],
294
309
const limb_t p [], size_t n )
295
310
{
311
+ __builtin_assume (n != 0 );
296
312
limb_t ret_ [n ], a_ [n ], b_ [n ], zero ;
297
313
298
314
limbs_from_le_bytes (a_ , a , sizeof (a_ ));
@@ -316,6 +332,7 @@ ADD_N_CHECK_MOD_IMPL(256)
316
332
static limb_t sub_n_check_mod_n (byte ret [], const byte a [], const byte b [],
317
333
const limb_t p [], size_t n )
318
334
{
335
+ __builtin_assume (n != 0 );
319
336
limb_t ret_ [n ], a_ [n ], b_ [n ], zero ;
320
337
321
338
limbs_from_le_bytes (a_ , a , sizeof (a_ ));
@@ -339,6 +356,7 @@ SUB_N_CHECK_MOD_IMPL(256)
339
356
static void from_mont_n (limb_t ret [], const limb_t a [],
340
357
const limb_t p [], limb_t n0 , size_t n )
341
358
{
359
+ __builtin_assume (n != 0 && n %2 == 0 );
342
360
llimb_t limbx ;
343
361
limb_t mask , borrow , mx , hi , tmp [n ];
344
362
size_t i , j ;
@@ -380,6 +398,7 @@ FROM_MONT_IMPL(384)
380
398
static void redc_mont_n (limb_t ret [], const limb_t a [],
381
399
const limb_t p [], limb_t n0 , size_t n )
382
400
{
401
+ __builtin_assume (n != 0 && n %2 == 0 );
383
402
llimb_t limbx ;
384
403
limb_t mask , carry , borrow , mx , hi , tmp [n ];
385
404
const limb_t * b = a ;
@@ -427,6 +446,7 @@ REDC_MONT_IMPL(384, 768)
427
446
static void rshift_mod_n (limb_t ret [], const limb_t a [], size_t count ,
428
447
const limb_t p [], size_t n )
429
448
{
449
+ __builtin_assume (n != 0 && n %2 == 0 );
430
450
llimb_t limbx ;
431
451
limb_t mask , carry , limb , next ;
432
452
size_t i ;
@@ -467,6 +487,7 @@ DIV_BY_2_MOD_IMPL(384)
467
487
468
488
static limb_t sgn0_pty_mod_n (const limb_t a [], const limb_t p [], size_t n )
469
489
{
490
+ __builtin_assume (n != 0 );
470
491
llimb_t limbx ;
471
492
limb_t carry , borrow , ret , tmp [n ];
472
493
size_t i ;
@@ -552,6 +573,7 @@ void mul_mont_384x(vec384x ret, const vec384x a, const vec384x b,
552
573
static void mul_mont_nonred_n (limb_t ret [], const limb_t a [], const limb_t b [],
553
574
const limb_t p [], limb_t n0 , size_t n )
554
575
{
576
+ __builtin_assume (n != 0 && n %2 == 0 );
555
577
llimb_t limbx ;
556
578
limb_t mx , hi , tmp [n + 1 ];
557
579
size_t i , j ;
@@ -592,6 +614,7 @@ static void mul_mont_nonred_n(limb_t ret[], const limb_t a[], const limb_t b[],
592
614
void sqr_n_mul_mont_383 (vec384 ret , const vec384 a , size_t count ,
593
615
const vec384 p , limb_t n0 , const vec384 b )
594
616
{
617
+ __builtin_assume (count != 0 );
595
618
while (count -- ) {
596
619
mul_mont_nonred_n (ret , a , a , p , n0 , NLIMBS (384 ));
597
620
a = ret ;
@@ -704,6 +727,7 @@ static limb_t lshift_2(limb_t hi, limb_t lo, size_t l)
704
727
static void ab_approximation_n (limb_t a_ [2 ], const limb_t a [],
705
728
limb_t b_ [2 ], const limb_t b [], size_t n )
706
729
{
730
+ __builtin_assume (n != 0 && n %2 == 0 );
707
731
limb_t a_hi , a_lo , b_hi , b_lo , mask ;
708
732
size_t i ;
709
733
@@ -729,6 +753,7 @@ typedef struct { limb_t f0, g0, f1, g1; } factors;
729
753
static void inner_loop_n (factors * fg , const limb_t a_ [2 ], const limb_t b_ [2 ],
730
754
size_t n )
731
755
{
756
+ __builtin_assume (n != 0 );
732
757
llimb_t limbx ;
733
758
limb_t f0 = 1 , g0 = 0 , f1 = 0 , g1 = 1 ;
734
759
limb_t a_lo , a_hi , b_lo , b_hi , t_lo , t_hi , odd , borrow , xorm ;
@@ -784,6 +809,7 @@ static void inner_loop_n(factors *fg, const limb_t a_[2], const limb_t b_[2],
784
809
785
810
static limb_t cneg_n (limb_t ret [], const limb_t a [], limb_t neg , size_t n )
786
811
{
812
+ __builtin_assume (n != 0 );
787
813
llimb_t limbx = 0 ;
788
814
limb_t carry ;
789
815
size_t i ;
@@ -799,6 +825,7 @@ static limb_t cneg_n(limb_t ret[], const limb_t a[], limb_t neg, size_t n)
799
825
800
826
static limb_t add_n (limb_t ret [], const limb_t a [], limb_t b [], size_t n )
801
827
{
828
+ __builtin_assume (n != 0 );
802
829
llimb_t limbx ;
803
830
limb_t carry ;
804
831
size_t i ;
@@ -814,6 +841,7 @@ static limb_t add_n(limb_t ret[], const limb_t a[], limb_t b[], size_t n)
814
841
815
842
static limb_t umul_n (limb_t ret [], const limb_t a [], limb_t b , size_t n )
816
843
{
844
+ __builtin_assume (n != 0 );
817
845
llimb_t limbx ;
818
846
limb_t hi ;
819
847
size_t i ;
@@ -831,6 +859,7 @@ static limb_t smul_n_shift_n(limb_t ret[], const limb_t a[], limb_t *f_,
831
859
const limb_t b [], limb_t * g_ ,
832
860
size_t n )
833
861
{
862
+ __builtin_assume (n != 0 );
834
863
limb_t a_ [n + 1 ], b_ [n + 1 ], f , g , neg , carry , hi ;
835
864
size_t i ;
836
865
@@ -872,6 +901,7 @@ static limb_t smul_n_shift_n(limb_t ret[], const limb_t a[], limb_t *f_,
872
901
static limb_t smul_2n (limb_t ret [], const limb_t u [], limb_t f ,
873
902
const limb_t v [], limb_t g , size_t n )
874
903
{
904
+ __builtin_assume (n != 0 );
875
905
limb_t u_ [n ], v_ [n ], neg , hi ;
876
906
877
907
/* |u|*|f_| */
@@ -895,6 +925,7 @@ static limb_t smul_2n(limb_t ret[], const limb_t u[], limb_t f,
895
925
static void ct_inverse_mod_n (limb_t ret [], const limb_t inp [],
896
926
const limb_t mod [], const limb_t modx [], size_t n )
897
927
{
928
+ __builtin_assume (n != 0 && n %2 == 0 );
898
929
llimb_t limbx ;
899
930
limb_t a [n ], b [n ], u [2 * n ], v [2 * n ], t [2 * n ];
900
931
limb_t a_ [2 ], b_ [2 ], sign , carry , top ;
@@ -949,6 +980,7 @@ CT_INVERSE_MOD_IMPL(384)
949
980
static limb_t legendre_loop_n (limb_t L , factors * fg , const limb_t a_ [2 ],
950
981
const limb_t b_ [2 ], size_t n )
951
982
{
983
+ __builtin_assume (n != 0 );
952
984
llimb_t limbx ;
953
985
limb_t f0 = 1 , g0 = 0 , f1 = 0 , g1 = 1 ;
954
986
limb_t a_lo , a_hi , b_lo , b_hi , t_lo , t_hi , odd , borrow , xorm ;
@@ -1010,6 +1042,7 @@ static limb_t legendre_loop_n(limb_t L, factors *fg, const limb_t a_[2],
1010
1042
1011
1043
static bool_t ct_is_sqr_mod_n (const limb_t inp [], const limb_t mod [], size_t n )
1012
1044
{
1045
+ __builtin_assume (n != 0 && n %2 == 0 );
1013
1046
limb_t a [n ], b [n ], t [n ];
1014
1047
limb_t a_ [2 ], b_ [2 ], neg , L = 0 ;
1015
1048
factors fg ;
@@ -1103,6 +1136,7 @@ limb_t div_3_limbs(const limb_t div_top[2], limb_t d_lo, limb_t d_hi)
1103
1136
static limb_t quot_rem_n (limb_t * div_rem , const limb_t * divisor ,
1104
1137
limb_t quotient , size_t n )
1105
1138
{
1139
+ __builtin_assume (n != 0 && n %2 == 0 );
1106
1140
llimb_t limbx ;
1107
1141
limb_t tmp [n + 1 ], carry , mask , borrow ;
1108
1142
size_t i ;
0 commit comments