diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2018-08-22 22:14:52 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2018-08-22 22:14:52 +0800 |
commit | 906256ff5783cdfb2d37fbbeae2a965f5f7aec01 (patch) | |
tree | 74fac7d72911893e295eaedcb3a70425297e6d22 | |
parent | 9c97273845db2b101f1fbffc94080d99822ac706 (diff) | |
download | tangerine-mcl-906256ff5783cdfb2d37fbbeae2a965f5f7aec01.tar.gz tangerine-mcl-906256ff5783cdfb2d37fbbeae2a965f5f7aec01.tar.zst tangerine-mcl-906256ff5783cdfb2d37fbbeae2a965f5f7aec01.zip |
fix twice FpGenerator::init
-rw-r--r-- | include/mcl/op.hpp | 1 | ||||
-rw-r--r-- | src/fp_generator.hpp | 42 | ||||
-rw-r--r-- | test/fp_generator_test.cpp | 4 |
3 files changed, 29 insertions, 18 deletions
diff --git a/include/mcl/op.hpp b/include/mcl/op.hpp index 7aff131..64104e6 100644 --- a/include/mcl/op.hpp +++ b/include/mcl/op.hpp @@ -265,7 +265,6 @@ struct Op { memset(R2, 0, sizeof(R2)); memset(R3, 0, sizeof(R3)); #ifdef MCL_USE_XBYAK - fg = 0; invTbl.clear(); #endif fp_addA_ = 0; diff --git a/src/fp_generator.hpp b/src/fp_generator.hpp index 0396c33..65d35f1 100644 --- a/src/fp_generator.hpp +++ b/src/fp_generator.hpp @@ -218,7 +218,10 @@ struct Code : Xbyak::CodeGenerator { Label fpDbl_modL_; Label fp_mulL_; - Code(uint8_t *mem, size_t codeSize) + /* + @param op [in] ; use op.p, op.N, op.isFullBit + */ + Code(size_t codeSize, uint8_t *mem, Op& op) : CodeGenerator(codeSize, mem) #ifdef XBYAK64_WIN , gp0(rcx) @@ -253,12 +256,7 @@ struct Code : Xbyak::CodeGenerator { { useMulx_ = cpu_.has(Xbyak::util::Cpu::tBMI2); useAdx_ = cpu_.has(Xbyak::util::Cpu::tADX); - } - /* - @param op [in] ; use op.p, op.N, op.isFullBit - */ - void init(Op& op) - { + op_ = &op; p_ = op.p; rp_ = fp::getMontgomeryCoeff(p_[0]); @@ -267,8 +265,6 @@ struct Code : Xbyak::CodeGenerator { isFullBit_ = op.isFullBit; // printf("p=%p, pn_=%d, isFullBit_=%d\n", p_, pn_, isFullBit_); - setSize(0); // reset code - align(16); op.fp_add = getCurr<void4u>(); op.fp_addA_ = getCurr<void3u>(); gen_fp_add(); @@ -3055,24 +3051,40 @@ struct FpGenerator { static const size_t codeSize = 4096 * 8; static const size_t pageSize = 4096; uint8_t *mem; - Code code; + Code *code; FpGenerator() : mem((uint8_t*)cybozu::AlignedMalloc(codeSize, pageSize)) - , code(mem, codeSize) + , code(0) { } void init(Op& op) { - code.init(op); - if (!Xbyak::CodeArray::protect(mem, codeSize, Xbyak::CodeArray::PROTECT_RE)) { - throw cybozu::Exception("err protect read/exec"); + if (code) { + setRW(); + delete code; } + code = new Code(codeSize, mem, op); + setRE(); } ~FpGenerator() { - Xbyak::CodeArray::protect(mem, codeSize, Xbyak::CodeArray::PROTECT_RW); + setRW(); + delete code; cybozu::AlignedFree(mem); } +private: + FpGenerator(const FpGenerator&); + void operator==(const FpGenerator&); + void setRW() + { + Xbyak::CodeArray::protect(mem, codeSize, Xbyak::CodeArray::PROTECT_RW); + } + void setRE() + { + if (!Xbyak::CodeArray::protect(mem, codeSize, Xbyak::CodeArray::PROTECT_RE)) { + throw cybozu::Exception("err protect read/exec"); + } + } }; } } // mcl::fp diff --git a/test/fp_generator_test.cpp b/test/fp_generator_test.cpp index 384e78b..5c41aa7 100644 --- a/test/fp_generator_test.cpp +++ b/test/fp_generator_test.cpp @@ -152,7 +152,7 @@ void testMulI(const mcl::fp::FpGenerator& fg, int pn) mpz_class my; mcl::gmp::set(my, y); mx *= my; - uint64_t d = fg.code.mulUnit_(z, x, y); + uint64_t d = fg.code->mulUnit_(z, x, y); z[pn] = d; mcl::gmp::setArray(my, z, pn + 1); CYBOZU_TEST_EQUAL(mx, my); @@ -162,7 +162,7 @@ void testMulI(const mcl::fp::FpGenerator& fg, int pn) uint64_t z[MAX_N + 1]; rg.read(x, pn); uint64_t y = rg.get64(); - CYBOZU_BENCH_C("mulUnit", 10000000, fg.code.mulUnit_, z, x, y); + CYBOZU_BENCH_C("mulUnit", 10000000, fg.code->mulUnit_, z, x, y); } } |