</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\alert.cpp" />
- <ClCompile Include="..\..\src\scrypt-generic.c" />
- <ClCompile Include="..\..\src\scrypt-sse2.cpp" />
<ClCompile Include="..\..\src\stun.cpp" />
<ClCompile Include="..\..\src\txdb-leveldb.cpp" />
<ClCompile Include="..\..\src\version.cpp" />
<ClCompile Include="..\..\src\noui.cpp" />
<ClCompile Include="..\..\src\kernel.cpp" />
<ClCompile Include="..\..\src\pbkdf2.cpp" />
- <ClCompile Include="..\..\src\scrypt.cpp" />
+ <ClCompile Include="..\..\src\scrypt-intrin\scrypt-sse2.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\addrman.h" />
<ClCompile Include="..\..\src\pbkdf2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="..\..\src\scrypt.cpp">
+ <ClCompile Include="..\..\src\scrypt-intrin\scrypt-sse2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\txdb-leveldb.cpp">
<ClCompile Include="..\..\src\stun.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="..\..\src\scrypt-generic.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="..\..\src\scrypt-sse2.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\addrman.h">
# use: qmake "USE_ASM=1"
contains(USE_ASM, 1) {
- message(Using assembler scrypt core implementation)
- SOURCES += src/scrypt-arm.S src/scrypt-x86.S src/scrypt-x86_64.S
+ message(Using assembler scrypt implementation)
+ SOURCES += src/scrypt-asm/scrypt-arm.S src/scrypt-asm/scrypt-x86.S src/scrypt-asm/scrypt-x86_64.S src/scrypt-asm/asm-wrapper.cpp
} else {
# use: qmake "USE_SSE2=1"
contains(USE_SSE2, 1) {
message(Using SSE2 intrinsic scrypt implementation)
- SOURCES += src/scrypt-sse2.cpp
+ SOURCES += src/scrypt-intrin/scrypt-sse2.cpp
DEFINES += USE_SSE2
QMAKE_CXXFLAGS += -msse2
QMAKE_CFLAGS += -msse2
} else {
- message(Using generic scrypt core implementation)
+ message(Using generic scrypt implementation)
+ SOURCES += src/scrypt-generic.cpp
}
-
- # For now, generic module is required in both cases
- SOURCES += src/scrypt-generic.c
}
# regenerate src/build.h
src/qt/rpcconsole.cpp \
src/noui.cpp \
src/kernel.cpp \
- src/scrypt.cpp \
src/qt/multisigaddressentry.cpp \
src/qt/multisiginputentry.cpp \
src/qt/multisigdialog.cpp
obj/wallet.o \
obj/walletdb.o \
obj/noui.o \
- obj/kernel.o \
- obj/scrypt.o
+ obj/kernel.o
all: novacoind
endif
ifeq (${USE_ASM}, 1)
-OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o
+# Assembler implementation
+OBJS += scrypt-asm/obj/scrypt-arm.o scrypt-asm/obj/scrypt-x86.o scrypt-asm/obj/scrypt-x86_64.o scrypt-asm/obj/asm-wrapper.o
-obj/scrypt-x86.o: scrypt-x86.S
+scrypt-asm/obj/scrypt-x86.o: scrypt-asm/scrypt-x86.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-x86_64.o: scrypt-x86_64.S
+scrypt-asm/obj/scrypt-x86_64.o: scrypt-asm/scrypt-x86_64.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-arm.o: scrypt-arm.S
+scrypt-asm/obj/scrypt-arm.o: scrypt-asm/scrypt-arm.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-endif
-ifneq (${USE_ASM}, 1)
-OBJS += obj/scrypt-generic.o
-
-obj/scrypt-generic.o: scrypt-generic.c
- $(CC) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/asm-wrapper.o: scrypt-asm/asm-wrapper.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
ifeq (${USE_SSE2}, 1)
+# Intrinsic implementation
DEFS += -DUSE_SSE2
-OBJS += obj/scrypt-sse2.o
-obj/scrypt-sse2.o: scrypt-sse2.cpp
- $(CXX) -c $(CFLAGS) -MMD -o $@ $<
+OBJS += scrypt-intrin/obj/scrypt-sse2.o
+
+scrypt-intrin/obj/scrypt-sse2.o: scrypt-intrin/scrypt-sse2.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
+ifneq (${USE_ASM}, 1)
+# Generic implementation
+OBJS += obj/scrypt-generic.o
+
+obj/scrypt-generic.o: scrypt-generic.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+endif
endif
endif
-rm -f novacoind
-rm -f obj/*.o
-rm -f obj/*.P
+ -rm -f obj/*.d
+ -rm -f scrypt-asm/obj/*.o
+ -rm -f scrypt-asm/obj/*.P
+ -rm -f scrypt-asm/obj/*.d
+ -rm -f scrypt-intrin/obj/*.o
+ -rm -f scrypt-intrin/obj/*.P
+ -rm -f scrypt-intrin/obj/*.d
-rm -f obj/build.h
FORCE:
obj/wallet.o \
obj/walletdb.o \
obj/noui.o \
- obj/kernel.o \
- obj/scrypt.o
+ obj/kernel.o
all: novacoind.exe
endif
ifeq (${USE_ASM}, 1)
-OBJS += obj/scrypt-x86.o obj/scrypt-x86_64.o
+# Assembler implementation
+OBJS += scrypt-asm/obj/scrypt-arm.o scrypt-asm/obj/scrypt-x86.o scrypt-asm/obj/scrypt-x86_64.o scrypt-asm/obj/asm-wrapper.o
-obj/scrypt-x86.o: scrypt-x86.S
+scrypt-asm/obj/scrypt-x86.o: scrypt-asm/scrypt-x86.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-x86_64.o: scrypt-x86_64.S
+scrypt-asm/obj/scrypt-x86_64.o: scrypt-asm/scrypt-x86_64.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-endif
-ifneq (${USE_ASM}, 1)
-OBJS += obj/scrypt-generic.o
-
-obj/scrypt-generic.o: scrypt-generic.c
- $(CC) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/scrypt-arm.o: scrypt-asm/scrypt-arm.S
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/asm-wrapper.o: scrypt-asm/asm-wrapper.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
ifeq (${USE_SSE2}, 1)
+# Intrinsic implementation
DEFS += -DUSE_SSE2
-OBJS += obj/scrypt-sse2.o
+OBJS += scrypt-intrin/obj/scrypt-sse2.o
-obj/scrypt-sse2.o: scrypt-sse2.cpp $(HEADERS)
- $(CCX) -c $(CFLAGS) -MMD -o $@ $<
+scrypt-intrin/obj/scrypt-sse2.o: scrypt-intrin/scrypt-sse2.cpp $(HEADERS)
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
+ifneq (${USE_ASM}, 1)
+# Generic implementation
+OBJS += obj/scrypt-generic.o
+
+obj/scrypt-generic.o: scrypt-generic.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
endif
endif
+endif
+
obj/build.h: FORCE
$(STRIP) novacoind.exe
clean:
- -rm -f obj/*.o
-rm -f novacoind.exe
+ -rm -f obj/*.o
+ -rm -f obj/*.P
+ -rm -f obj/*.d
+ -rm -f scrypt-asm/obj/*.o
+ -rm -f scrypt-asm/obj/*.P
+ -rm -f scrypt-asm/obj/*.d
+ -rm -f scrypt-intrin/obj/*.o
+ -rm -f scrypt-intrin/obj/*.P
+ -rm -f scrypt-intrin/obj/*.d
-rm -f obj/build.h
cd leveldb && TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) clean && cd ..
obj/wallet.o \
obj/walletdb.o \
obj/noui.o \
- obj/kernel.o \
- obj/scrypt.o
+ obj/kernel.o
all: novacoind.exe
endif
ifdef USE_ASM
-OBJS += obj/scrypt-x86.o obj/scrypt-x86_64.o
+# Assembler implementation
+OBJS += scrypt-asm/obj/scrypt-arm.o scrypt-asm/obj/scrypt-x86.o scrypt-asm/obj/scrypt-x86_64.o scrypt-asm/obj/asm-wrapper.o
-obj/scrypt-x86.o: scrypt-x86.S
+scrypt-asm/obj/scrypt-x86.o: scrypt-asm/scrypt-x86.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-x86_64.o: scrypt-x86_64.S
+scrypt-asm/obj/scrypt-x86_64.o: scrypt-asm/scrypt-x86_64.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-else
-OBJS += obj/scrypt-generic.o
-obj/scrypt-generic.o: scrypt-generic.c
- $(CC) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/scrypt-arm.o: scrypt-asm/scrypt-arm.S
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/asm-wrapper.o: scrypt-asm/asm-wrapper.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
ifdef USE_SSE2
+# Intrinsic implementation
DEFS += -DUSE_SSE2
-OBJS += obj/scrypt-sse2.o
+OBJS += scrypt-intrin/obj/scrypt-sse2.o
-obj/scrypt-sse2.o: scrypt-sse2.cpp $(HEADERS)
- g++ -c $(CFLAGS) -MMD -o $@ $<
+scrypt-intrin/obj/scrypt-sse2.o: scrypt-intrin/scrypt-sse2.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
+# Generic implementation
+OBJS += obj/scrypt-generic.o
+
+obj/scrypt-generic.o: scrypt-generic.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
endif
endif
-
obj/%.o: %.cpp $(HEADERS)
g++ -c $(CFLAGS) -o $@ $<
obj/wallet.o \
obj/walletdb.o \
obj/noui.o \
- obj/kernel.o \
- obj/scrypt.o
+ obj/kernel.o
ifndef USE_UPNP
override USE_UPNP = -
endif
ifeq (${USE_ASM}, 1)
-OBJS += obj/scrypt-x86.o obj/scrypt-x86_64.o
+# Assembler implementation
+OBJS += scrypt-asm/obj/scrypt-arm.o scrypt-asm/obj/scrypt-x86.o scrypt-asm/obj/scrypt-x86_64.o scrypt-asm/obj/asm-wrapper.o
-obj/scrypt-x86.o: scrypt-x86.S
+scrypt-asm/obj/scrypt-x86.o: scrypt-asm/scrypt-x86.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-x86_64.o: scrypt-x86_64.S
+scrypt-asm/obj/scrypt-x86_64.o: scrypt-asm/scrypt-x86_64.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-endif
-ifneq (${USE_ASM}, 1)
-OBJS += obj/scrypt-generic.o
-obj/scrypt-generic.o: scrypt-generic.c
- $(CC) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/scrypt-arm.o: scrypt-asm/scrypt-arm.S
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-ifneq (${USE_SSE2}, 1) and eq (${USE_ASM}, 1)
+scrypt-asm/obj/asm-wrapper.o: scrypt-asm/asm-wrapper.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
+ifeq (${USE_SSE2}, 1)
+# Intrinsic implementation
DEFS += -DUSE_SSE2
-OBJS += obj/scrypt-sse2.o
+OBJS += scrypt-intrin/obj/scrypt-sse2.o
-obj/scrypt-sse2.o: scrypt-sse2.cpp
- $(CXX) -c $(CFLAGS) -MMD -o $@ $<
+scrypt-intrin/obj/scrypt-sse2.o: scrypt-intrin/scrypt-sse2.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
+ifneq (${USE_ASM}, 1)
+# Generic implementation
+OBJS += obj/scrypt-generic.o
+
+obj/scrypt-generic.o: scrypt-generic.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+endif
endif
endif
-rm -f novacoind
-rm -f obj/*.o
-rm -f obj/*.P
+ -rm -f obj/*.d
+ -rm -f scrypt-asm/obj/*.o
+ -rm -f scrypt-asm/obj/*.P
+ -rm -f scrypt-asm/obj/*.d
+ -rm -f scrypt-intrin/obj/*.o
+ -rm -f scrypt-intrin/obj/*.P
+ -rm -f scrypt-intrin/obj/*.d
-rm -f obj/build.h
FORCE:
obj/wallet.o \
obj/walletdb.o \
obj/noui.o \
- obj/kernel.o \
- obj/scrypt.o
+ obj/kernel.o
all: novacoind
endif
ifeq (${USE_ASM}, 1)
-OBJS += obj/scrypt-arm.o obj/scrypt-x86.o obj/scrypt-x86_64.o
+# Assembler implementation
+OBJS += scrypt-asm/obj/scrypt-arm.o scrypt-asm/obj/scrypt-x86.o scrypt-asm/obj/scrypt-x86_64.o scrypt-asm/obj/asm-wrapper.o
-obj/scrypt-x86.o: scrypt-x86.S
+scrypt-asm/obj/scrypt-x86.o: scrypt-asm/scrypt-x86.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-x86_64.o: scrypt-x86_64.S
+scrypt-asm/obj/scrypt-x86_64.o: scrypt-asm/scrypt-x86_64.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-obj/scrypt-arm.o: scrypt-arm.S
+scrypt-asm/obj/scrypt-arm.o: scrypt-asm/scrypt-arm.S
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
-endif
-ifneq (${USE_ASM}, 1)
-OBJS += obj/scrypt-generic.o
-
-obj/scrypt-generic.o: scrypt-generic.c
- $(CC) -c $(xCXXFLAGS) -MMD -o $@ $<
+scrypt-asm/obj/asm-wrapper.o: scrypt-asm/asm-wrapper.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
ifeq (${USE_SSE2}, 1)
+# Intrinsic implementation
DEFS += -DUSE_SSE2
-OBJS += obj/scrypt-sse2.o
+OBJS += scrypt-intrin/obj/scrypt-sse2.o
+
+scrypt-intrin/obj/scrypt-sse2.o: scrypt-intrin/scrypt-sse2.cpp
+ $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
+else
+# Generic implementation
+OBJS += obj/scrypt-generic.o
-obj/scrypt-sse2.o: scrypt-sse2.cpp
+obj/scrypt-generic.o: scrypt-generic.cpp
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
endif
endif
-rm -f novacoind
-rm -f obj/*.o
-rm -f obj/*.P
+ -rm -f obj/*.d
+ -rm -f scrypt-asm/obj/*.o
+ -rm -f scrypt-asm/obj/*.P
+ -rm -f scrypt-asm/obj/*.d
+ -rm -f scrypt-intrin/obj/*.o
+ -rm -f scrypt-intrin/obj/*.P
+ -rm -f scrypt-intrin/obj/*.d
-rm -f obj/build.h
FORCE:
--- /dev/null
+#include <stdlib.h>
+#include <openssl/evp.h>
+
+#include "scrypt.h"
+
+#include "util.h"
+#include "net.h"
+
+extern "C" void scrypt_core(uint32_t *X, uint32_t *V);
+
+/* cpu and memory intensive function to transform a 80 byte buffer into a 32 byte output
+ scratchpad size needs to be at least 63 + (128 * r * p) + (256 * r + 64) + (128 * r * N) bytes
+ r = 1, p = 1, N = 1024
+ */
+uint256 scrypt_blockhash(const uint8_t* input)
+{
+ uint8_t scratchpad[SCRYPT_BUFFER_SIZE];
+ uint32_t X[32];
+ uint256 result = 0;
+
+ uint32_t *V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63));
+
+ PKCS5_PBKDF2_HMAC((const char*)input, 80, input, 80, 1, EVP_sha256(), 128, (unsigned char *)X);
+ scrypt_core(X, V);
+ PKCS5_PBKDF2_HMAC((const char*)input, 80, (const unsigned char*)X, 128, 1, EVP_sha256(), 32, (unsigned char*)&result);
+
+ return result;
+}
--- /dev/null
+*
+!.gitignore
* online backup system.
*/
-#include <stdlib.h>
-#include <stdint.h>
#include <string.h>
+#include <openssl/evp.h>
+
+#include "scrypt.h"
#ifdef _MSC_VER
#define INLINE __inline
B[15] += x15;
}
-void scrypt_core(uint32_t *X, uint32_t *V)
+INLINE void scrypt_core(uint32_t *X, uint32_t *V)
{
uint16_t i, j, k;
xor_salsa8(&X[16], &X[0]);
}
}
+
+/* cpu and memory intensive function to transform a 80 byte buffer into a 32 byte output
+ scratchpad size needs to be at least 63 + (128 * r * p) + (256 * r + 64) + (128 * r * N) bytes
+ r = 1, p = 1, N = 1024
+ */
+uint256 scrypt_blockhash(const uint8_t* input)
+{
+ uint8_t scratchpad[SCRYPT_BUFFER_SIZE];
+ uint32_t X[32];
+ uint256 result = 0;
+
+ uint32_t *V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63));
+
+ PKCS5_PBKDF2_HMAC((const char*)input, 80, input, 80, 1, EVP_sha256(), 128, (unsigned char *)X);
+ scrypt_core(X, V);
+ PKCS5_PBKDF2_HMAC((const char*)input, 80, (const unsigned char*)X, 128, 1, EVP_sha256(), 32, (unsigned char*)&result);
+
+ return result;
+}
--- /dev/null
+*
+!.gitignore
B[3] = _mm_add_epi32(B[3], X3);
}
-uint256 scrypt_blockhash__sse2(const uint8_t* input)
+uint256 scrypt_blockhash(const uint8_t* input)
{
uint256 result = 0;
uint8_t scratchpad[SCRYPT_BUFFER_SIZE];
+++ /dev/null
-#include <stdlib.h>
-#include <openssl/evp.h>
-
-#include "scrypt.h"
-
-#include "util.h"
-#include "net.h"
-
-#ifdef USE_SSE2
-#ifdef _MSC_VER
-// MSVC 64bit is unable to use inline asm
-#include <intrin.h>
-#else
-// GCC Linux or i686-w64-mingw32
-#include <cpuid.h>
-#endif
-#endif
-
-extern "C" void scrypt_core(uint32_t *X, uint32_t *V);
-#ifdef USE_SSE2
-extern uint256 scrypt_blockhash__sse2(const uint8_t* input);
-#endif
-/* cpu and memory intensive function to transform a 80 byte buffer into a 32 byte output
- scratchpad size needs to be at least 63 + (128 * r * p) + (256 * r + 64) + (128 * r * N) bytes
- r = 1, p = 1, N = 1024
- */
-uint256 scrypt_blockhash_generic(const uint8_t* input)
-{
- uint8_t scratchpad[SCRYPT_BUFFER_SIZE];
- uint32_t X[32];
- uint256 result = 0;
-
- uint32_t *V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63));
-
- PKCS5_PBKDF2_HMAC((const char*)input, 80, input, 80, 1, EVP_sha256(), 128, (unsigned char *)X);
- scrypt_core(X, V);
- PKCS5_PBKDF2_HMAC((const char*)input, 80, (const unsigned char*)X, 128, 1, EVP_sha256(), 32, (unsigned char*)&result);
-
- return result;
-}
-
-// By default, set to generic scrypt function. This will prevent crash in case when scrypt_detect_sse2() wasn't called
-uint256 (*scrypt_blockhash_detected)(const uint8_t* input) = &scrypt_blockhash_generic;
-
-#ifdef USE_SSE2
-void scrypt_detect_sse2()
-{
- // 32bit x86 Linux or Windows, detect cpuid features
- unsigned int cpuid_edx=0;
-#if defined(_MSC_VER)
- // MSVC
- int x86cpuid[4];
- __cpuid(x86cpuid, 1);
- cpuid_edx = (unsigned int)x86cpuid[3];
-#else // _MSC_VER
- // Linux or i686-w64-mingw32 (gcc-4.6.3)
- unsigned int eax, ebx, ecx;
- __get_cpuid(1, &eax, &ebx, &ecx, &cpuid_edx);
-#endif // _MSC_VER
-
- if (cpuid_edx & 1<<26)
- {
- scrypt_blockhash_detected = &scrypt_blockhash__sse2;
- printf("scrypt: using scrypt-sse2 as detected.\n");
- }
- else
- {
- scrypt_blockhash_detected = &scrypt_blockhash_generic;
- printf("scrypt: using scrypt-generic, SSE2 unavailable.\n");
- }
-}
-#endif
-
-uint256 scrypt_blockhash(const uint8_t* input)
-{
- return scrypt_blockhash_detected(input);
-}
uint256 scrypt_blockhash(const uint8_t* input);
-#ifdef USE_SSE2
-void scrypt_detect_sse2();
-#endif
-
#endif // SCRYPT_MINE_H