aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2016-12-24 16:27:42 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2016-12-24 16:27:42 +0800
commit61e17077258567e4695ae37f39d9323b2bf3686a (patch)
treee484cc5a22fb18dc25b4305ef1acc05ac1c6963d
parent2dbb4d1f85dc4bfb3b9efec47760b253712b15a1 (diff)
downloaddexon-mcl-61e17077258567e4695ae37f39d9323b2bf3686a.tar.gz
dexon-mcl-61e17077258567e4695ae37f39d9323b2bf3686a.tar.zst
dexon-mcl-61e17077258567e4695ae37f39d9323b2bf3686a.zip
add mcl_fp_subNF for not full bit prime
-rw-r--r--src/gen.cpp54
1 files changed, 35 insertions, 19 deletions
diff --git a/src/gen.cpp b/src/gen.cpp
index 0320e32..cc7d958 100644
--- a/src/gen.cpp
+++ b/src/gen.cpp
@@ -443,35 +443,50 @@ struct Code : public mcl::Generator {
ret(Void);
endFunc();
}
- void gen_mcl_fp_sub()
+ void gen_mcl_fp_sub(bool isFullBit = true)
{
resetGlobalIdx();
Operand pz(IntPtr, unit);
Operand px(IntPtr, unit);
Operand py(IntPtr, unit);
Operand pp(IntPtr, unit);
- std::string name = "mcl_fp_sub" + cybozu::itoa(N) + "L";
+ std::string name = "mcl_fp_sub";
+ if (!isFullBit) {
+ name += "NF";
+ }
+ name += cybozu::itoa(N) + "L";
mcl_fp_subM[N] = Function(name, Void, pz, px, py, pp);
verifyAndSetPrivate(mcl_fp_subM[N]);
beginFunc(mcl_fp_subM[N]);
Operand x = loadN(px, N);
Operand y = loadN(py, N);
- x = zext(x, bit + unit);
- y = zext(y, bit + unit);
- Operand vc = sub(x, y);
- Operand v = trunc(vc, bit);
- Operand c = lshr(vc, bit);
- c = trunc(c, 1);
- storeN(v, pz);
- Label carry("carry");
- Label nocarry("nocarry");
- br(c, carry, nocarry);
- putLabel(nocarry);
- ret(Void);
- putLabel(carry);
- Operand p = loadN(pp, N);
- Operand t = add(v, p);
- storeN(t, pz);
+ if (isFullBit) {
+ x = zext(x, bit + unit);
+ y = zext(y, bit + unit);
+ Operand vc = sub(x, y);
+ Operand v, c;
+ v = trunc(vc, bit);
+ c = lshr(vc, bit);
+ c = trunc(c, 1);
+ storeN(v, pz);
+ Label carry("carry");
+ Label nocarry("nocarry");
+ br(c, carry, nocarry);
+ putLabel(nocarry);
+ ret(Void);
+ putLabel(carry);
+ Operand p = loadN(pp, N);
+ Operand t = add(v, p);
+ storeN(t, pz);
+ } else {
+ Operand v = sub(x, y);
+ Operand c;
+ c = trunc(lshr(v, bit - 1), 1);
+ Operand p = loadN(pp, N);
+ c = select(c, p, makeImm(bit, 0));
+ Operand t = add(v, c);
+ storeN(t, pz);
+ }
ret(Void);
endFunc();
}
@@ -800,7 +815,8 @@ struct Code : public mcl::Generator {
void gen_addsub()
{
gen_mcl_fp_add();
- gen_mcl_fp_sub();
+ gen_mcl_fp_sub(true);
+ gen_mcl_fp_sub(false);
gen_mcl_fpDbl_add();
gen_mcl_fpDbl_sub();
}