aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2018-08-22 22:14:52 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2018-08-22 22:14:52 +0800
commit906256ff5783cdfb2d37fbbeae2a965f5f7aec01 (patch)
tree74fac7d72911893e295eaedcb3a70425297e6d22
parent9c97273845db2b101f1fbffc94080d99822ac706 (diff)
downloadtangerine-mcl-906256ff5783cdfb2d37fbbeae2a965f5f7aec01.tar.gz
tangerine-mcl-906256ff5783cdfb2d37fbbeae2a965f5f7aec01.tar.zst
tangerine-mcl-906256ff5783cdfb2d37fbbeae2a965f5f7aec01.zip
fix twice FpGenerator::init
-rw-r--r--include/mcl/op.hpp1
-rw-r--r--src/fp_generator.hpp42
-rw-r--r--test/fp_generator_test.cpp4
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);
}
}