]> Git Repo - VerusCoin.git/commitdiff
update
authorChris <[email protected]>
Sat, 2 Nov 2019 22:05:03 +0000 (22:05 +0000)
committerChris <[email protected]>
Sat, 2 Nov 2019 22:05:03 +0000 (22:05 +0000)
configure.ac
depends/packages/libcurl.mk
src/Makefile.am
src/crypto/haraka.c
src/crypto/haraka.h
src/crypto/haraka_portable.h
src/crypto/verus_clhash.cpp
src/crypto/verus_clhash.h
src/crypto/verus_clhash_portable.cpp
src/komodo_curve25519.h

index 149f5f4f43c341cf73c9625aa66a841afdca4bdb..f7c1e86aeea069a5240aff084af3ffb755d0a869 100644 (file)
@@ -242,6 +242,16 @@ AC_ARG_WITH([daemon],
   [build_bitcoind=$withval],
   [build_bitcoind=yes])
 
+GCC_TARGET=`$CC -dumpmachine 2>&1`
+case $GCC_TARGET in
+  arm*-*-*)
+    have_arm=true
+    ;;
+  aarch64*-*-*)
+    have_arm=true
+    ;;
+esac
+
 use_pkgconfig=yes
 case $host in
   *mingw*)
@@ -879,6 +889,7 @@ AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows])
 AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes])
 AM_CONDITIONAL([ENABLE_MINING],[test x$enable_mining = xyes])
 AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes])
+AM_CONDITIONAL([ARCH_ARM], [test x$have_arm = xtrue])
 AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
 AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
 AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes])
index 5c6c0d83f97edbb9df8b1386d2f7f09ac1cee239..46375f455b52dff09550ec07fd1bd7e7a109a3e5 100644 (file)
@@ -3,7 +3,7 @@ $(package)_version=7.66.0
 $(package)_download_path=https://curl.haxx.se/download
 $(package)_file_name=curl-$($(package)_version).tar.gz
 $(package)_sha256_hash=d0393da38ac74ffac67313072d7fe75b1fa1010eb5987f63f349b024a36b7ffb
-$(package)_config_opts_linux=--disable-shared --enable-static --prefix=$(host_prefix)
+$(package)_config_opts_linux=--disable-shared --enable-static --prefix=$(host_prefix) --host=$(HOST)
 $(package)_config_opts_mingw32=--enable-mingw --disable-shared --enable-static --prefix=$(host_prefix) --host=x86_64-w64-mingw32
 $(package)_config_opts_darwin=--disable-shared --enable-static --prefix=$(host_prefix)
 $(package)_cflags_darwin=-mmacosx-version-min=10.9
index db196d9977df60d60c3712bd3f8ff0b5843dd1ca..4d22f0615a39d6c03a8ef13740791d268b766436 100644 (file)
@@ -466,8 +466,14 @@ crypto_libbitcoin_crypto_a_SOURCES += \
 endif
 
 # Verus hash specific library - optimized
-crypto_libverus_crypto_a_CPPFLAGS = -O3 -Wint-conversion -march=x86-64 -mpclmul -msse4 -msse4.1 -msse4.2 -mssse3 -mavx -maes -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
-crypto_libverus_crypto_a_CXXFLAGS = -O3 -Wint-conversion -march=x86-64 -mpclmul -msse4 -msse4.1 -msse4.2 -mssse3 -mavx -maes -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
+if ARCH_ARM
+crypto_libverus_crypto_a_CPPFLAGS = -O3 -Wint-conversion -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
+crypto_libverus_crypto_a_CXXFLAGS = -O3 -Wint-conversion -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
+else
+crypto_libverus_crypto_a_CPPFLAGS = -O3 -Wint-conversion -mpclmul -msse4 -msse4.1 -msse4.2 -mssse3 -mavx -maes -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
+crypto_libverus_crypto_a_CXXFLAGS = -O3 -Wint-conversion -mpclmul -msse4 -msse4.1 -msse4.2 -mssse3 -mavx -maes -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
+endif
+
 crypto_libverus_crypto_a_SOURCES = \
   crypto/haraka.h \
   crypto/haraka.c \
@@ -475,8 +481,14 @@ crypto_libverus_crypto_a_SOURCES = \
   crypto/verus_clhash.cpp
 
 # Verus hash specific library - portable
+if ARCH_ARM
+crypto_libverus_portable_crypto_a_CPPFLAGS = -O3 -Wint-conversion -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
+crypto_libverus_portable_crypto_a_CXXFLAGS = -O3 -Wint-conversion -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
+else
 crypto_libverus_portable_crypto_a_CPPFLAGS = -O3 -Wint-conversion -march=x86-64 -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CPPFLAGS)
 crypto_libverus_portable_crypto_a_CXXFLAGS = -O3 -Wint-conversion -march=x86-64 -g -funroll-loops -fomit-frame-pointer -fPIC $(AM_CXXFLAGS)
+endif
+
 crypto_libverus_portable_crypto_a_SOURCES = \
   crypto/haraka_portable.h \
   crypto/haraka_portable.c \
index 90e399aaa6efadbd12c9e84c4ff37f21c7811e48..7a9f7e51e37f46d4b0865ce0ec12cfeb64c14554 100644 (file)
@@ -23,6 +23,17 @@ SOFTWARE.
 \r
 Optimized Implementations for Haraka256 and Haraka512\r
 */\r
+#if defined(__arm__)  || defined(__aarch64__)\r
+#include "crypto/SSE2NEON.h"\r
+__m128i _mm_aesenc_si128 (__m128i a, __m128i RoundKey)\r
+{   //TODO intrinsic version of ARM AESENC\r
+    uint8x16_t a1; memcpy(&a1,&a,16);\r
+       uint8x16_t b1; memcpy(&b1,&RoundKey,16);\r
+       uint8x16_t c; //FIXME NEEDS -maes compile flags in ARM  = vaesmcq_u8(vaeseq_u8(a1, (uint8x16_t){})) ^ b1;\r
+       __m128i d; memcpy(&d,&c,16);\r
+       return d;\r
+}      \r
+#endif\r
 \r
 #include <stdio.h>\r
 #include "crypto/haraka.h"\r
index 0311eb9e212d304c1de5b9de498933bbfa6ef66e..b080e6c74384812c1407084c1f268234f3f62464 100644 (file)
@@ -26,7 +26,11 @@ Optimized Implementations for Haraka256 and Haraka512
 #ifndef HARAKA_H_\r
 #define HARAKA_H_\r
 \r
+#if defined(__arm__)  || defined(__aarch64__)\r
+#include "crypto/SSE2NEON.h"\r
+#else // !WIN32\r
 #include "immintrin.h"\r
+#endif\r
 \r
 #define NUMROUNDS 5\r
 \r
index ed55be414cd7cfd238b7ec77791b49e994d679d4..31cfb35a1d23b1fa20721727d50f8ae0c6b9ecbc 100644 (file)
@@ -1,7 +1,11 @@
 #ifndef SPX_HARAKA_H\r
 #define SPX_HARAKA_H\r
 \r
+#if defined(__arm__) || defined(__aarch64__)\r
+#include "crypto/SSE2NEON.h"\r
+#else\r
 #include "immintrin.h"\r
+#endif\r
 \r
 #define NUMROUNDS 5\r
 \r
index b8efb11e3503f663bd5f55fa7c01cf7672518c4b..e182846490ab11ba97353791406b4226fe06e3e4 100644 (file)
 #include <assert.h>
 #include <string.h>
 
-#ifndef _WIN32
-#include <x86intrin.h>
-#else
+#ifdef _WIN32
+#pragma warning (disable : 4146)
 #include <intrin.h>
 #endif // !WIN32
+#endif
+int __cpuverusoptimized = 0x80;
+
+#if defined(__arm__)  || defined(__aarch64__)
+#include "crypto/SSE2NEON.h"
+#else
+#include <x86intrin.h>
+#endif
 
 #ifdef _WIN32
 #define posix_memalign(p, a, s) (((*(p)) = _aligned_malloc((s), (a))), *(p) ?0 :errno)
@@ -40,6 +47,102 @@ thread_local thread_specific_ptr verusclhasher_descr;
 // attempt to workaround horrible mingw/gcc destructor bug on Windows and Mac, which passes garbage in the this pointer
 // we use the opportunity of control here to clean up all of our tls variables. we could keep a list, but this is a safe,
 // functional hack
+
+#if defined(__arm__)  || defined(__aarch64__) //intrinsics not defined in SSE2NEON.h
+    static inline __attribute__((always_inline)) __m128i _mm_set_epi64x(uint64_t hi, uint64_t lo)
+       {
+       __m128i result;
+       ((uint64_t *)&result)[0] = lo;
+       ((uint64_t *)&result)[1] = hi;
+       return result;
+       }
+
+static inline __attribute__((always_inline))  __m128i _mm_mulhrs_epi16(__m128i _a, __m128i _b)
+{
+       int16_t result[8];
+       int16_t *a = (int16_t*)&_a, *b = (int16_t*)&_b;
+       for (int i = 0; i < 8; i++)
+       {
+               result[i] = (int16_t)((((int32_t)(a[i]) * (int32_t)(b[i])) + 0x4000) >> 15);
+       }
+
+       return *(__m128i *)result;
+}
+
+__m128i _mm_cvtsi64_si128(uint64_t lo)
+{
+       __m128i result;
+       ((uint64_t *)&result)[0] = lo;
+       ((uint64_t *)&result)[1] = 0;
+       return result;
+}
+__m128i _mm_aesenc_si128 (__m128i a, __m128i RoundKey)
+{
+    uint8x16_t a1; memcpy(&a1,&a,16);
+       uint8x16_t b1; memcpy(&b1,&RoundKey,16);
+       uint8x16_t c; //FIXME NEEDS -maes compile flags in ARM  = vaesmcq_u8(vaeseq_u8(a1, (uint8x16_t){})) ^ b1;
+       __m128i d; memcpy(&d,&c,16);
+       return d;
+}      
+__m128i _mm_clmulepi64_si128(const __m128i a, const __m128i b, int imm)
+{
+       __m128i result;
+     uint64x2_t a1 ; memcpy(&a1,&a,16);
+         uint64x2_t b1 ; memcpy(&b1,&b,16);
+ result = a; //FIXME NEEDS -maes compile flags in ARM (__m128i)vmull_p64(vgetq_lane_u64(a1, 1), vgetq_lane_u64(b1,0)); 
+
+       return result;
+
+}
+
+__m128i _mm_setr_epi8(u_char c0, u_char c1, u_char c2, u_char c3, u_char c4, u_char c5, u_char c6, u_char c7, u_char c8, u_char c9, u_char c10, u_char c11, u_char c12, u_char c13, u_char c14, u_char c15)
+{
+       __m128i result;
+       ((uint8_t *)&result)[0] = c0;
+       ((uint8_t *)&result)[1] = c1;
+       ((uint8_t *)&result)[2] = c2;
+       ((uint8_t *)&result)[3] = c3;
+       ((uint8_t *)&result)[4] = c4;
+       ((uint8_t *)&result)[5] = c5;
+       ((uint8_t *)&result)[6] = c6;
+       ((uint8_t *)&result)[7] = c7;
+       ((uint8_t *)&result)[8] = c8;
+       ((uint8_t *)&result)[9] = c9;
+       ((uint8_t *)&result)[10] = c10;
+       ((uint8_t *)&result)[11] = c11;
+       ((uint8_t *)&result)[12] = c12;
+       ((uint8_t *)&result)[13] = c13;
+       ((uint8_t *)&result)[14] = c14;
+       ((uint8_t *)&result)[15] = c15;
+               return result;
+}
+__m128i _mm_shuffle_epi8(__m128i a, __m128i b)
+{
+       __m128i result;
+       for (int i = 0; i < 16; i++)
+       {
+               if (((uint8_t *)&b)[i] & 0x80)
+               {
+                       ((uint8_t *)&result)[i] = 0;
+               }
+               else
+               {
+                       ((uint8_t *)&result)[i] = ((uint8_t *)&a)[((uint8_t *)&b)[i] & 0xf];
+               }
+       }
+       return result;
+}
+ int64_t _mm_cvtsi128_si64(__m128i a)
+{
+       return ((int64_t *)&a)[0];
+}
+__m128i _mm_loadl_epi64(__m128i *a)
+{
+       __m128i b = {0}; ((uint64_t*)&b)[0] = ((uint64_t*)a)[0];
+       return b;
+}
+#endif 
+
 thread_specific_ptr::~thread_specific_ptr() {
     if (verusclhasher_key.ptr)
     {
@@ -548,7 +651,7 @@ uint64_t verusclhash(void * random, const unsigned char buf[64], uint64_t keyMas
 void *alloc_aligned_buffer(uint64_t bufSize)
 {
     void *answer = NULL;
-    if (posix_memalign(&answer, sizeof(__m256i), bufSize))
+    if (posix_memalign(&answer, sizeof(__m128i) * 2, bufSize))
     {
         return NULL;
     }
index 570b87f9f66071733c5d50a1fae8772a01aa782f..8fe93f9ab448abf4f7a554e91af19edf3551c106 100644 (file)
 #include <stdint.h>
 #include <stddef.h>
 #include <assert.h>
+
 #ifdef _WIN32
 #undef __cpuid
 #include <intrin.h>
+#endif
+
+#if defined(__arm__)  || defined(__aarch64__)
+#include "crypto/SSE2NEON.h"
 #else
+#include <cpuid.h>
 #include <x86intrin.h>
 #endif // !WIN32
 
@@ -93,10 +99,12 @@ extern int __cpuverusoptimized;
 
 inline bool IsCPUVerusOptimized()
 {
+    #if defined(__arm__)  || defined(__aarch64__)
+       __cpuverusoptimized = false;
+    #else
     if (__cpuverusoptimized & 0x80)
     {
         unsigned int eax,ebx,ecx,edx;
-
         if (!__get_cpuid(1,&eax,&ebx,&ecx,&edx))
         {
             __cpuverusoptimized = false;
@@ -106,6 +114,7 @@ inline bool IsCPUVerusOptimized()
             __cpuverusoptimized = ((ecx & (bit_AVX | bit_AES | bit_PCLMUL)) == (bit_AVX | bit_AES | bit_PCLMUL));
         }
     }
+    #endif
     return __cpuverusoptimized;
 };
 
index 9a7b48da9d5561460b6148680acb697e8a38a643..f409b0d06197b94f3681271b007b6a66f2899497 100644 (file)
 #include <sys/types.h>
 #endif// APPLE
 
-#ifdef _WIN32
+#ifdef __linux__ 
+
+#ifdef __i386__ || __X86_64__
+#include <x86intrin.h>
+#elif defined(__arm__)  || defined(__aarch64__)
+#include "crypto/SSE2NEON.h"
+#endif 
+
+#elif _WIN32
 #pragma warning (disable : 4146)
 #include <intrin.h>
-#else
-#include <x86intrin.h>
-#endif //WIN32
+#endif
 
 void clmul64(uint64_t a, uint64_t b, uint64_t* r)
 {
index 5478ff84dbc03a338fea7aff1c3b0f9ead697bc7..9e503bbd634b5fe1a4e746aec1f6b1fb1b597468 100644 (file)
@@ -81,7 +81,7 @@ bits320 fexpand(bits256 basepoint)
     return(out);
 }
 
-#if __amd64__
+ #if defined(__amd64)  || defined(__aarch64__)
 // donna: special gcc mode for 128-bit integers. It's implemented on 64-bit platforms only as far as I know.
 typedef unsigned uint128_t __attribute__((mode(TI)));
 
This page took 0.038306 seconds and 4 git commands to generate.