add Fp2::mul_xi for bls12

dev
MITSUNARI Shigeo 6 years ago
parent 2f68f703e4
commit d23b47e9d6
  1. 81
      src/fp_generator.hpp

@ -3579,16 +3579,6 @@ private:
gen_raw_fp_sub(sf.p[0], sf.p[1], sf.p[2], sf.t, false); gen_raw_fp_sub(sf.p[0], sf.p[1], sf.p[2], sf.t, false);
gen_raw_fp_sub(sf.p[0] + FpByte_, sf.p[1] + FpByte_, sf.p[2] + FpByte_, sf.t, false); gen_raw_fp_sub(sf.p[0] + FpByte_, sf.p[1] + FpByte_, sf.p[2] + FpByte_, sf.t, false);
} }
void2u gen_fp2_mul_xi()
{
align(16);
void2u func = getCurr<void2u>();
if (pn_ == 4 && !isFullBit_) {
gen_fp2_mul_xi4();
return func;
}
return 0;
}
/* /*
for only xi_a = 1 for only xi_a = 1
y.a = a - b y.a = a - b
@ -3597,14 +3587,17 @@ private:
void gen_fp2_mul_xi4() void gen_fp2_mul_xi4()
{ {
assert(!isFullBit_); assert(!isFullBit_);
#if 0 StackFrame sf(this, 2, 11 | UseRDX);
StackFrame sf(this, 2, 10 | UseRDX | UseRCX); const Reg64& py = sf.p[0];
const Reg64& px = sf.p[1];
Pack a = sf.t.sub(0, 4); Pack a = sf.t.sub(0, 4);
Pack b = sf.t.sub(4, 4); Pack b = sf.t.sub(4, 4);
Pack t(rdx, rcx, sf.t[8], sf.t[9]); Pack t = sf.t.sub(8);
load_rm(a, sf.p[1]); t.append(rdx);
load_rm(b, sf.p[1] + FpByte_); assert(t.size() == 4);
for (int i = 0; i < 4; i++) { load_rm(a, px);
load_rm(b, px + FpByte_);
for (int i = 0; i < pn_; i++) {
mov(t[i], a[i]); mov(t[i], a[i]);
if (i == 0) { if (i == 0) {
add(t[i], b[i]); add(t[i], b[i]);
@ -3613,30 +3606,56 @@ private:
} }
} }
sub_rr(a, b); sub_rr(a, b);
mov(rax, (size_t)p_); mov(rax, pL_);
load_rm(b, rax); load_rm(b, rax);
sbb(rax, rax); sbb(rax, rax);
for (int i = 0; i < 4; i++) { for (int i = 0; i < pn_; i++) {
and_(b[i], rax); and_(b[i], rax);
} }
add_rr(a, b); add_rr(a, b);
store_mr(sf.p[0], a); store_mr(py, a);
mov(rax, (size_t)p_); mov(rax, pL_);
mov_rr(a, t); mov_rr(a, t);
sub_rm(t, rax); sub_rm(t, rax);
for (int i = 0; i < 4; i++) { cmovc_rr(t, a);
cmovc(t[i], a[i]); store_mr(py + FpByte_, t);
} }
store_mr(sf.p[0] + FpByte_, t); void gen_fp2_mul_xi6()
#else {
StackFrame sf(this, 2, 8, 8 * 4); assert(!isFullBit_);
gen_raw_fp_add(rsp, sf.p[1], sf.p[1] + FpByte_, sf.t, false); StackFrame sf(this, 2, 12);
gen_raw_fp_sub(sf.p[0], sf.p[1], sf.p[1] + FpByte_, sf.t, false); const Reg64& py = sf.p[0];
for (int i = 0; i < 4; i++) { const Reg64& px = sf.p[1];
mov(rax, ptr [rsp + i * 8]); Pack a = sf.t.sub(0, 6);
mov(ptr[sf.p[0] + FpByte_ + i * 8], rax); Pack b = sf.t.sub(6);
load_rm(a, px);
mov_rr(b, a);
add_rm(b, px + FpByte_);
sub_rm(a, px + FpByte_);
mov(rax, pL_);
jnc("@f");
add_rm(a, rax);
L("@@");
store_mr(py, a);
mov_rr(a, b);
sub_rm(b, rax);
cmovc_rr(b, a);
store_mr(py + FpByte_, b);
} }
#endif void2u gen_fp2_mul_xi()
{
if (isFullBit_) return 0;
align(16);
void2u func = getCurr<void2u>();
if (pn_ == 4) {
gen_fp2_mul_xi4();
return func;
}
if (pn_ == 6) {
gen_fp2_mul_xi6();
return func;
}
return 0;
} }
void2u gen_fp2_neg() void2u gen_fp2_neg()
{ {

Loading…
Cancel
Save