aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2019-04-17 15:10:23 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2019-04-24 16:12:10 +0800
commit3adee27f18a8a8ff56d2f78edbdb1e1e8bcca4f4 (patch)
treeba87860769c99cbe00f85cdfe3b4b56673565803
parentd02cc65749a634748c1f9f015c6e64ca3ed504e2 (diff)
downloadtangerine-mcl-3adee27f18a8a8ff56d2f78edbdb1e1e8bcca4f4.tar.gz
tangerine-mcl-3adee27f18a8a8ff56d2f78edbdb1e1e8bcca4f4.tar.zst
tangerine-mcl-3adee27f18a8a8ff56d2f78edbdb1e1e8bcca4f4.zip
MCL_LLVM_BMI2=0 disables bmi2
-rw-r--r--src/fp.cpp2
-rw-r--r--src/low_func.hpp10
-rw-r--r--src/low_func_llvm.hpp2
3 files changed, 12 insertions, 2 deletions
diff --git a/src/fp.cpp b/src/fp.cpp
index df72d6d..bb7fbcd 100644
--- a/src/fp.cpp
+++ b/src/fp.cpp
@@ -251,7 +251,7 @@ void setOp(Op& op, Mode mode)
setOp2<N, Gtag, true, false>(op);
#ifdef MCL_USE_LLVM
if (mode != fp::FP_GMP && mode != fp::FP_GMP_MONT) {
-#if defined(MCL_USE_XBYAK) && CYBOZU_HOST == CYBOZU_HOST_INTEL
+#if MCL_LLVM_BMI2 == 1
const bool gmpIsFasterThanLLVM = false;//(N == 8 && MCL_SIZEOF_UNIT == 8);
Xbyak::util::Cpu cpu;
if (cpu.has(Xbyak::util::Cpu::tBMI2)) {
diff --git a/src/low_func.hpp b/src/low_func.hpp
index 57c63cf..89a748e 100644
--- a/src/low_func.hpp
+++ b/src/low_func.hpp
@@ -15,17 +15,27 @@
#pragma warning(disable : 4127)
#endif
+#ifndef MCL_LLVM_BMI2
+ #if (CYBOZU_HOST == CYBOZU_HOST_INTEL) && defined(MCL_USE_XBYAK) && !defined(MCL_USE_VINT)
+ #define MCL_LLVM_BMI2 1
+ #endif
+#endif
+
namespace mcl { namespace fp {
struct Gtag; // GMP
struct Ltag; // LLVM
+#if MCL_LLVM_BMI2 == 1
struct LBMI2tag; // LLVM with Intel BMI2 instruction
+#endif
struct Atag; // asm
template<class Tag> struct TagToStr { };
template<> struct TagToStr<Gtag> { static const char *f() { return "Gtag"; } };
template<> struct TagToStr<Ltag> { static const char *f() { return "Ltag"; } };
+#if MCL_LLVM_BMI2 == 1
template<> struct TagToStr<LBMI2tag> { static const char *f() { return "LBMI2tag"; } };
+#endif
template<> struct TagToStr<Atag> { static const char *f() { return "Atag"; } };
template<size_t N>
diff --git a/src/low_func_llvm.hpp b/src/low_func_llvm.hpp
index 8a44c22..a9e8a98 100644
--- a/src/low_func_llvm.hpp
+++ b/src/low_func_llvm.hpp
@@ -41,7 +41,7 @@ template<>const void3u MontRed<n, tag>::f = &mcl_fp_montRed ## n ## suf; \
template<>const void4u DblAdd<n, tag>::f = &mcl_fpDbl_add ## n ## suf; \
template<>const void4u DblSub<n, tag>::f = &mcl_fpDbl_sub ## n ## suf; \
-#if (CYBOZU_HOST == CYBOZU_HOST_INTEL) && !defined(MCL_USE_VINT)
+#if MCL_LLVM_BMI2 == 1
#define MCL_DEF_LLVM_FUNC(n) \
MCL_DEF_LLVM_FUNC2(n, Ltag, L) \
MCL_DEF_LLVM_FUNC2(n, LBMI2tag, Lbmi2)