reduce memory access in Fp2::mul

update-fork
MITSUNARI Shigeo 4 years ago
parent b566c3a6e7
commit fd26ac6644
  1. 28
      src/fp_generator.hpp

@ -734,6 +734,7 @@ private:
gen_raw_fp_sub_2(pz + pn_ * 8, px + pn_ * 8, py + pn_ * 8, t, true); gen_raw_fp_sub_2(pz + pn_ * 8, px + pn_ * 8, py + pn_ * 8, t, true);
return func; return func;
} }
// require t.size() >= pn_ * 2
void gen_raw_fp_sub_2(const RegExp& pz, const RegExp& px, const RegExp& py, const Pack& t, bool withCarry) void gen_raw_fp_sub_2(const RegExp& pz, const RegExp& px, const RegExp& py, const Pack& t, bool withCarry)
{ {
Pack t1 = t.sub(0, pn_); Pack t1 = t.sub(0, pn_);
@ -3742,16 +3743,25 @@ private:
call(mulPreL); call(mulPreL);
} }
gen_raw_sub(d1, d1, d0, rax, pn_ * 2); {
gen_raw_sub(d1, d1, d2, rax, pn_ * 2); Pack t = sf.t;
if (pn_ == 4) {
t = t.sub(0, pn_ * 2);
} else if (pn_ == 6) {
t.append(gp0);
t.append(gp2);
}
assert(t.size() == pn_ * 2);
gen_raw_sub(d0, d0, d2, rax, pn_); load_rm(t, (RegExp)d1);
if (pn_ == 4) { sub_rm(t, (RegExp)d0); // d1 -= d0
gen_raw_fp_sub((RegExp)d0 + pn_ * 8, (RegExp)d0 + pn_ * 8, (RegExp)d2 + pn_ * 8, Pack(gt0, gt1, gt2, gt3, gt4, gt5, gt6, gt7), true); sub_rm(t, (RegExp)d2); // d1 -= d2
} else { store_mr((RegExp)d1, t);
lea(gp0, ptr[(RegExp)d0 + pn_ * 8]);
lea(gp2, ptr[(RegExp)d2 + pn_ * 8]); gen_raw_sub(d0, d0, d2, rax, pn_);
gen_raw_fp_sub6(gp0, gp0, gp2, 0, sf.t.sub(0, 6), true); const RegExp& d0H = (RegExp)d0 + pn_ * 8;
const RegExp& d2H = (RegExp)d2 + pn_ * 8;
gen_raw_fp_sub_2(d0H, d0H, d2H, t, true);
} }
mov(gp0, ptr [z]); mov(gp0, ptr [z]);

Loading…
Cancel
Save