@@ -80,18 +80,23 @@ POINTS_TO_AFFINE_IMPL(blst_p2, POINTonE2, 384x, fp2)
80
80
81
81
#define SCRATCH_SZ (ptype ) (sizeof(ptype)==sizeof(POINTonE1) ? 8192 : 4096)
82
82
83
+ /* The intermediate infinity points are encoded as [0, 0, 1]. */
84
+
83
85
#define PRECOMPUTE_WBITS_IMPL (prefix , ptype , bits , field , one ) \
84
86
static void ptype##_precompute_row_wbits(ptype row[], size_t wbits, \
85
87
const ptype##_affine *point) \
86
88
{ \
87
89
size_t i, j, n = (size_t)1 << (wbits-1); \
90
+ bool_t inf = vec_is_zero(point, sizeof(*point)); \
88
91
/* row[-1] is implicit infinity */ \
89
92
vec_copy (& row [0 ], point , sizeof (* point )); /* row[0]=p*1 */ \
90
93
vec_copy (& row [0 ].Z , one , sizeof (row [0 ].Z )); \
91
94
ptype ##_double (& row [1 ], & row [0 ]); /* row[1]=p*(1+1) */ \
95
+ vec_select (& row [1 ].Z , one , & row [1 ].Z , sizeof (row [1 ].Z ), inf ); \
92
96
for (i = 2 , j = 1 ; i < n ; i += 2 , j ++ ) \
93
97
ptype ##_add_affine (& row [i ], & row [i - 1 ], point ), /* row[2]=p*(2+1) */ \
94
- ptype ##_double (& row [i + 1 ], & row [j ]); /* row[3]=p*(2+2) */ \
98
+ ptype ##_double (& row [i + 1 ], & row [j ]), /* row[3]=p*(2+2) */ \
99
+ vec_select (& row [i + 1 ].Z , one , & row [i + 1 ].Z , sizeof (row [i + 1 ].Z ), inf ); \
95
100
} /* row[4] ... */ \
96
101
\
97
102
static void ptype ##s_to_affine_row_wbits (ptype##_affine dst[], ptype src[], \
0 commit comments