static void fp4_mul_unr(dv2_t e, dv2_t f, fp2_t a, fp2_t b, fp2_t c, fp2_t d) { fp2_t t0, t1; dv2_t u0, u1; fp2_null(t0); fp2_null(t1); dv2_null(u0); dv2_null(u1); TRY { fp2_new(t0); fp2_new(t1); dv2_new(u0); dv2_new(u1); #ifdef FP_SPACE fp2_mulc_low(u0, a, c); fp2_mulc_low(u1, b, d); fp2_addn_low(t0, c, d); fp2_addn_low(t1, a, b); #else fp2_muln_low(u0, a, c); fp2_muln_low(u1, b, d); fp2_addm_low(t0, c, d); fp2_addm_low(t1, a, b); #endif fp2_muln_low(f, t1, t0); fp2_subc_low(f, f, u0); fp2_subc_low(f, f, u1); fp2_norh_low(e, u1); fp2_addc_low(e, e, u0); } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { fp2_free(t0); dv2_free(t1); dv2_free(u0); dv2_free(u1); } }
inline static void fp6_mul_dxs_unr_lazyr(dv6_t c, fp6_t a, fp6_t b) { dv2_t u0, u1, u2, u3; fp2_t t0, t1; dv2_null(u0); dv2_null(u1); dv2_null(u2); dv2_null(u3); fp2_null(t0); fp2_null(t1); TRY { dv2_new(u0); dv2_new(u1); dv2_new(u2); dv2_new(u3); fp2_new(t0); fp2_new(t1); #ifdef RLC_FP_ROOM fp2_mulc_low(u0, a[0], b[0]); fp2_mulc_low(u1, a[1], b[1]); fp2_addn_low(t0, a[0], a[1]); fp2_addn_low(t1, b[0], b[1]); /* c_1 = (a_0 + a_1)(b_0 + b_1) - a_0b_0 - a_1b_1 */ fp2_muln_low(u2, t0, t1); fp2_subc_low(u2, u2, u0); fp2_subc_low(c[1], u2, u1); /* c_0 = a_0b_0 + E a_2b_1 */ fp2_mulc_low(u2, a[2], b[1]); fp2_norh_low(c[0], u2); fp2_addc_low(c[0], u0, c[0]); /* c_2 = a_0b_2 + a_1b_1 */ fp2_mulc_low(u2, a[2], b[0]); fp2_addc_low(c[2], u1, u2); #else fp2_muln_low(u0, a[0], b[0]); fp2_muln_low(u1, a[1], b[1]); fp2_addm_low(t0, a[0], a[1]); fp2_addm_low(t1, b[0], b[1]); /* c_1 = (a_0 + a_1)(b_0 + b_1) - a_0b_0 - a_1b_1 */ fp2_muln_low(u2, t0, t1); fp2_subc_low(u2, u2, u0); fp2_subc_low(c[1], u2, u1); /* c_0 = a_0b_0 + E a_2b_1 */ fp2_muln_low(u2, a[2], b[1]); fp2_nord_low(c[0], u2); fp2_addc_low(c[0], u0, c[0]); /* c_2 = a_0b_2 + a_1b_1 */ fp2_muln_low(u2, a[2], b[0]); fp2_addc_low(c[2], u1, u2); #endif #ifdef RLC_FP_ROOM #else #endif } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { dv2_free(u0); dv2_free(u1); dv2_free(u2); dv2_free(u3); fp2_free(t0); fp2_free(t1); } }