diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2016-12-25 10:49:38 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2016-12-25 10:49:38 +0800 |
commit | 9277a4c9dd58d6b8cc4c32b71969d67ba26b8851 (patch) | |
tree | 40a393c104bfe8d657fb94676c7cdac027931676 | |
parent | be9d0ef5c902cd55ba5075a290cb41e73ee02bbc (diff) | |
download | tangerine-mcl-9277a4c9dd58d6b8cc4c32b71969d67ba26b8851.tar.gz tangerine-mcl-9277a4c9dd58d6b8cc4c32b71969d67ba26b8851.tar.zst tangerine-mcl-9277a4c9dd58d6b8cc4c32b71969d67ba26b8851.zip |
unify Sub and SubNF
-rw-r--r-- | src/fp.cpp | 4 | ||||
-rw-r--r-- | src/low_func.hpp | 19 | ||||
-rw-r--r-- | src/low_func_llvm.hpp | 4 |
3 files changed, 9 insertions, 18 deletions
@@ -185,10 +185,10 @@ void setOp2(Op& op) op.fp_neg = Neg<N, Tag>::f; if (op.isFullBit) { op.fp_add = Add<N, true, Tag>::f; - op.fp_sub = Sub<N, Tag>::f; + op.fp_sub = Sub<N, true, Tag>::f; } else { op.fp_add = Add<N, false, Tag>::f; - op.fp_sub = SubNF<N, Tag>::f; + op.fp_sub = Sub<N, false, Tag>::f; } if (op.isMont) { op.fp_mul = Mont<N, Tag>::f; diff --git a/src/low_func.hpp b/src/low_func.hpp index e342ae1..a4a3ac9 100644 --- a/src/low_func.hpp +++ b/src/low_func.hpp @@ -370,7 +370,7 @@ struct Add { } Unit tmp[N]; if (SubPre<N, Tag>::f(tmp, z, p) == 0) { - memcpy(z, tmp, sizeof(tmp)); + copyC<N>(z, tmp); } } else { AddPre<N, Tag>::f(z, x, y); @@ -383,7 +383,7 @@ struct Add { } Unit tmp[N - 1]; if (SubPre<N - 1, Tag>::f(tmp, z, p) == 0) { - memcpy(z, tmp, sizeof(tmp)); + copyC<N - 1>(z, tmp); z[N - 1] = 0; } } @@ -395,7 +395,7 @@ template<size_t N, bool isFullBit, class Tag> const void4u Add<N, isFullBit, Tag>::f = Add<N, isFullBit, Tag>::func; // z[N] <- (x[N] - y[N]) % p[N] -template<size_t N, class Tag = Gtag> +template<size_t N, bool isFullBit, class Tag = Gtag> struct Sub { static inline void func(Unit *z, const Unit *x, const Unit *y, const Unit *p) { @@ -406,17 +406,8 @@ struct Sub { static const void4u f; }; -template<size_t N, class Tag> -const void4u Sub<N, Tag>::f = Sub<N, Tag>::func; - -/* Sub for not full bit prime */ -template<size_t N, class Tag = Gtag> -struct SubNF { - static const void4u f; -}; - -template<size_t N, class Tag> -const void4u SubNF<N, Tag>::f = Sub<N, Tag>::f; +template<size_t N, bool isFullBit, class Tag> +const void4u Sub<N, isFullBit, Tag>::f = Sub<N, isFullBit, Tag>::func; // z[N * 2] <- (x[N * 2] + y[N * 2]) mod p[N] << (N * UnitBitSize) template<size_t N, class Tag = Gtag> diff --git a/src/low_func_llvm.hpp b/src/low_func_llvm.hpp index c15ee68..4798cbe 100644 --- a/src/low_func_llvm.hpp +++ b/src/low_func_llvm.hpp @@ -33,8 +33,8 @@ MCL_DEF_MUL(n) \ template<>const void2uI MulUnitPre<n, Ltag>::f = &mcl_fp_mulUnitPre ## n ## L; \ template<>const void4u Add<n, true, Ltag>::f = &mcl_fp_add ## n ## L; \ template<>const void4u Add<n, false, Ltag>::f = &mcl_fp_addNF ## n ## L; \ -template<>const void4u Sub<n, Ltag>::f = &mcl_fp_sub ## n ## L; \ -template<>const void4u SubNF<n, Ltag>::f = &mcl_fp_subNF ## n ## L; \ +template<>const void4u Sub<n, true, Ltag>::f = &mcl_fp_sub ## n ## L; \ +template<>const void4u Sub<n, false, Ltag>::f = &mcl_fp_subNF ## n ## L; \ template<>const void4u Mont<n, Ltag>::f = &mcl_fp_mont ## n ## L; \ template<>const void3u MontRed<n, Ltag>::f = &mcl_fp_montRed ## n ## L; \ template<>const void4u DblAdd<n, Ltag>::f = &mcl_fpDbl_add ## n ## L; \ |