diff --git a/include/mcl/fp.hpp b/include/mcl/fp.hpp index 72534f5..e8664c9 100644 --- a/include/mcl/fp.hpp +++ b/include/mcl/fp.hpp @@ -84,41 +84,41 @@ public: mcl::fp::setOp(op_, p, bitLen); #if 1 #ifdef USE_MONT_FP - if (bitLen <= 128) { op_ = fp::MontFp::init(p); } + if (bitLen <= 128) { fp::MontFp::init(op_, p); } #if CYBOZU_OS_BIT == 32 - else if (bitLen <= 160) { static fp::MontFp f; op_ = f.init(p); } + else if (bitLen <= 160) { static fp::MontFp f; f.init(op_, p); } #endif - else if (bitLen <= 192) { static fp::MontFp f; op_ = f.init(p); } + else if (bitLen <= 192) { static fp::MontFp f; f.init(op_, p); } #if CYBOZU_OS_BIT == 32 - else if (bitLen <= 224) { static fp::MontFp f; op_ = f.init(p); } + else if (bitLen <= 224) { static fp::MontFp f; f.init(op_, p); } #endif - else if (bitLen <= 256) { static fp::MontFp f; op_ = f.init(p); } - else if (bitLen <= 384) { static fp::MontFp f; op_ = f.init(p); } - else if (bitLen <= 448) { static fp::MontFp f; op_ = f.init(p); } + else if (bitLen <= 256) { static fp::MontFp f; f.init(op_, p); } + else if (bitLen <= 384) { static fp::MontFp f; f.init(op_, p); } + else if (bitLen <= 448) { static fp::MontFp f; f.init(op_, p); } #if CYBOZU_OS_BIT == 32 - else if (bitLen <= 544) { static fp::MontFp f; op_ = f.init(p); } + else if (bitLen <= 544) { static fp::MontFp f; f.init(op_, p); } #else - else if (bitLen <= 576) { static fp::MontFp f; op_ = f.init(p); } + else if (bitLen <= 576) { static fp::MontFp f; f.init(op_, p); } #endif - else { static fp::MontFp f; op_ = f.init(p); } + else { static fp::MontFp f; f.init(op_, p); } #else - if (bitLen <= 128) { op_ = fp::FixedFp::init(p); } + if (bitLen <= 128) { fp::FixedFp::init(op_, p); } #if CYBOZU_OS_BIT == 32 - else if (bitLen <= 160) { static fp::FixedFp f; op_ = f.init(p); } + else if (bitLen <= 160) { static fp::FixedFp f; f.init(op_, p); } #endif - else if (bitLen <= 192) { static fp::FixedFp f; op_ = f.init(p); } + else if (bitLen <= 192) { static fp::FixedFp f; f.init(op_, p); } #if CYBOZU_OS_BIT == 32 - else if (bitLen <= 224) { static fp::FixedFp f; op_ = f.init(p); } + else if (bitLen <= 224) { static fp::FixedFp f; f.init(op_, p); } #endif - else if (bitLen <= 256) { static fp::FixedFp f; op_ = f.init(p); } - else if (bitLen <= 384) { static fp::FixedFp f; op_ = f.init(p); } - else if (bitLen <= 448) { static fp::FixedFp f; op_ = f.init(p); } + else if (bitLen <= 256) { static fp::FixedFp f; f.init(op_, p); } + else if (bitLen <= 384) { static fp::FixedFp f; f.init(op_, p); } + else if (bitLen <= 448) { static fp::FixedFp f; f.init(op_, p); } #if CYBOZU_OS_BIT == 32 - else if (bitLen <= 544) { static fp::FixedFp f; op_ = f.init(p); } + else if (bitLen <= 544) { static fp::FixedFp f; f.init(op_, p); } #else - else if (bitLen <= 576) { static fp::FixedFp f; op_ = f.init(p); } + else if (bitLen <= 576) { static fp::FixedFp f; f.init(op_, p); } #endif - else { static fp::FixedFp f; op_ = f.init(p); } + else { static fp::FixedFp f; f.init(op_, p); } #endif assert(op_.N <= maxUnitN); #endif @@ -410,6 +410,17 @@ public: y.getBlock(yb); return fp::local::compareArray(xb.p, yb.p, xb.n); } + /* + wrapper function for generic p + add(z, x, y) + case 1: op_.add(z.v_, x.v_, y.v_) written by Xbyak with fixed p + case 2: addG(z.v_, x.v_, y.v_) + op_.addG(z, x, y, p) written by GMP/LLVM with generic p + */ + static inline void addG(Unit *z, const Unit *x, const Unit *y) + { + op_.addG(z, x, y, op_.p); + } private: static inline void inFromStr(mpz_class& x, bool *isMinus, const std::string& str, int base) { diff --git a/include/mcl/fp_base.hpp b/include/mcl/fp_base.hpp index 10fed99..d0fc7f6 100644 --- a/include/mcl/fp_base.hpp +++ b/include/mcl/fp_base.hpp @@ -39,7 +39,6 @@ typedef void (*void2op)(Unit*, const Unit*); typedef void (*void3op)(Unit*, const Unit*, const Unit*); typedef void (*void4op)(Unit*, const Unit*, const Unit*, const Unit*); typedef int (*int2op)(Unit*, const Unit*); -typedef void (*void4Iop)(Unit*, const Unit*, const Unit*, const Unit*, Unit); } } // mcl::fp @@ -149,6 +148,12 @@ struct Op { // for Montgomery void2op toMont; void2op fromMont; + // for generic p + void3op negG; + void3op invG; + void4op addG; + void4op subG; + void4op mulG; mcl::SquareRoot sq; Op() : p(0), N(0), isZero(0), clear(0), neg(0), inv(0) @@ -326,10 +331,9 @@ struct FixedFp { } sub(y, p_, x); } - static inline Op init(const Unit *p) + static inline void init(Op& op, const Unit *p) { setModulo(p); - Op op; op.N = N; op.isZero = &isZero; op.clear = &clear; @@ -342,6 +346,7 @@ struct FixedFp { if (bitN <= 128) { op.add = &add128; op.sub = &sub128; + op.addG = mcl_fp_add128S; } else #if CYBOZU_OS_BIT == 32 if (bitN <= 160) { @@ -393,7 +398,6 @@ struct FixedFp { } op.mp = mp_; op.p = &p_[0]; - return op; } }; @@ -486,11 +490,10 @@ struct MontFp { { mul_(y, x, one_); } - static inline Op init(const Unit *p) + static inline void init(Op& op, const Unit *p) { puts("use MontFp2"); setModulo(p); - Op op; op.N = N; op.isZero = &isZero; op.clear = &clear; @@ -511,7 +514,6 @@ puts("use MontFp2"); // addNc = Xbyak::CastTo(fg_.addNc_); // subNc = Xbyak::CastTo(fg_.subNc_); initInvTbl(invTbl_); - return op; } }; template mpz_class MontFp::mp_;