aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2016-12-25 10:49:38 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2016-12-25 10:49:38 +0800
commit9277a4c9dd58d6b8cc4c32b71969d67ba26b8851 (patch)
tree40a393c104bfe8d657fb94676c7cdac027931676
parentbe9d0ef5c902cd55ba5075a290cb41e73ee02bbc (diff)
downloadtangerine-mcl-9277a4c9dd58d6b8cc4c32b71969d67ba26b8851.tar.gz
tangerine-mcl-9277a4c9dd58d6b8cc4c32b71969d67ba26b8851.tar.zst
tangerine-mcl-9277a4c9dd58d6b8cc4c32b71969d67ba26b8851.zip
unify Sub and SubNF
-rw-r--r--src/fp.cpp4
-rw-r--r--src/low_func.hpp19
-rw-r--r--src/low_func_llvm.hpp4
3 files changed, 9 insertions, 18 deletions
diff --git a/src/fp.cpp b/src/fp.cpp
index 974e41e..42299c9 100644
--- a/src/fp.cpp
+++ b/src/fp.cpp
@@ -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; \