pass op to init

dev
MITSUNARI Shigeo 10 years ago
parent 5bd38be7a1
commit 9a0b70eca2
  1. 51
      include/mcl/fp.hpp
  2. 16
      include/mcl/fp_base.hpp

@ -84,41 +84,41 @@ public:
mcl::fp::setOp(op_, p, bitLen);
#if 1
#ifdef USE_MONT_FP
if (bitLen <= 128) { op_ = fp::MontFp<tag, 128>::init(p); }
if (bitLen <= 128) { fp::MontFp<tag, 128>::init(op_, p); }
#if CYBOZU_OS_BIT == 32
else if (bitLen <= 160) { static fp::MontFp<tag, 160> f; op_ = f.init(p); }
else if (bitLen <= 160) { static fp::MontFp<tag, 160> f; f.init(op_, p); }
#endif
else if (bitLen <= 192) { static fp::MontFp<tag, 192> f; op_ = f.init(p); }
else if (bitLen <= 192) { static fp::MontFp<tag, 192> f; f.init(op_, p); }
#if CYBOZU_OS_BIT == 32
else if (bitLen <= 224) { static fp::MontFp<tag, 224> f; op_ = f.init(p); }
else if (bitLen <= 224) { static fp::MontFp<tag, 224> f; f.init(op_, p); }
#endif
else if (bitLen <= 256) { static fp::MontFp<tag, 256> f; op_ = f.init(p); }
else if (bitLen <= 384) { static fp::MontFp<tag, 384> f; op_ = f.init(p); }
else if (bitLen <= 448) { static fp::MontFp<tag, 448> f; op_ = f.init(p); }
else if (bitLen <= 256) { static fp::MontFp<tag, 256> f; f.init(op_, p); }
else if (bitLen <= 384) { static fp::MontFp<tag, 384> f; f.init(op_, p); }
else if (bitLen <= 448) { static fp::MontFp<tag, 448> f; f.init(op_, p); }
#if CYBOZU_OS_BIT == 32
else if (bitLen <= 544) { static fp::MontFp<tag, 544> f; op_ = f.init(p); }
else if (bitLen <= 544) { static fp::MontFp<tag, 544> f; f.init(op_, p); }
#else
else if (bitLen <= 576) { static fp::MontFp<tag, 576> f; op_ = f.init(p); }
else if (bitLen <= 576) { static fp::MontFp<tag, 576> f; f.init(op_, p); }
#endif
else { static fp::MontFp<tag, maxBitN> f; op_ = f.init(p); }
else { static fp::MontFp<tag, maxBitN> f; f.init(op_, p); }
#else
if (bitLen <= 128) { op_ = fp::FixedFp<tag, 128>::init(p); }
if (bitLen <= 128) { fp::FixedFp<tag, 128>::init(op_, p); }
#if CYBOZU_OS_BIT == 32
else if (bitLen <= 160) { static fp::FixedFp<tag, 160> f; op_ = f.init(p); }
else if (bitLen <= 160) { static fp::FixedFp<tag, 160> f; f.init(op_, p); }
#endif
else if (bitLen <= 192) { static fp::FixedFp<tag, 192> f; op_ = f.init(p); }
else if (bitLen <= 192) { static fp::FixedFp<tag, 192> f; f.init(op_, p); }
#if CYBOZU_OS_BIT == 32
else if (bitLen <= 224) { static fp::FixedFp<tag, 224> f; op_ = f.init(p); }
else if (bitLen <= 224) { static fp::FixedFp<tag, 224> f; f.init(op_, p); }
#endif
else if (bitLen <= 256) { static fp::FixedFp<tag, 256> f; op_ = f.init(p); }
else if (bitLen <= 384) { static fp::FixedFp<tag, 384> f; op_ = f.init(p); }
else if (bitLen <= 448) { static fp::FixedFp<tag, 448> f; op_ = f.init(p); }
else if (bitLen <= 256) { static fp::FixedFp<tag, 256> f; f.init(op_, p); }
else if (bitLen <= 384) { static fp::FixedFp<tag, 384> f; f.init(op_, p); }
else if (bitLen <= 448) { static fp::FixedFp<tag, 448> f; f.init(op_, p); }
#if CYBOZU_OS_BIT == 32
else if (bitLen <= 544) { static fp::FixedFp<tag, 544> f; op_ = f.init(p); }
else if (bitLen <= 544) { static fp::FixedFp<tag, 544> f; f.init(op_, p); }
#else
else if (bitLen <= 576) { static fp::FixedFp<tag, 576> f; op_ = f.init(p); }
else if (bitLen <= 576) { static fp::FixedFp<tag, 576> f; f.init(op_, p); }
#endif
else { static fp::FixedFp<tag, maxBitN> f; op_ = f.init(p); }
else { static fp::FixedFp<tag, maxBitN> 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)
{

@ -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<bool3op>(fg_.addNc_);
// subNc = Xbyak::CastTo<bool3op>(fg_.subNc_);
initInvTbl(invTbl_);
return op;
}
};
template<class tag, size_t bitN> mpz_class MontFp<tag, bitN>::mp_;

Loading…
Cancel
Save