Added MSVC support for Argon2.
This commit is contained in:
parent
3022f19eda
commit
fe832f510e
13 changed files with 132 additions and 87 deletions
25
src/3rdparty/argon2/CMakeLists.txt
vendored
25
src/3rdparty/argon2/CMakeLists.txt
vendored
|
@ -40,7 +40,23 @@ set_property(TARGET argon2 APPEND PROPERTY
|
||||||
)
|
)
|
||||||
|
|
||||||
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
if (CMAKE_C_COMPILER_ID MATCHES MSVC)
|
||||||
|
function(add_feature_impl FEATURE MSVC_FLAG DEF)
|
||||||
|
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
||||||
|
target_link_libraries(argon2-${FEATURE} PRIVATE argon2-internal)
|
||||||
|
set_target_properties(argon2-${FEATURE} PROPERTIES POSITION_INDEPENDENT_CODE True)
|
||||||
|
|
||||||
|
target_compile_options(argon2-${FEATURE} PRIVATE ${MSVC_FLAG})
|
||||||
|
target_compile_definitions(argon2-${FEATURE} PRIVATE ${DEF})
|
||||||
|
target_link_libraries(argon2 PUBLIC argon2-${FEATURE})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
add_feature_impl(sse2 "" HAVE_SSE2)
|
||||||
|
add_feature_impl(ssse3 ""/arch:SSSE3"" HAVE_SSSE3)
|
||||||
|
add_feature_impl(xop "" HAVE_XOP)
|
||||||
|
add_feature_impl(avx2 "/arch:AVX2" HAVE_AVX2)
|
||||||
|
add_feature_impl(avx512f "/arch:AVX512F" HAVE_AVX512F)
|
||||||
|
|
||||||
|
target_sources(argon2 PRIVATE arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c)
|
||||||
elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
function(add_feature_impl FEATURE GCC_FLAG DEF)
|
function(add_feature_impl FEATURE GCC_FLAG DEF)
|
||||||
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
add_library(argon2-${FEATURE} STATIC arch/x86_64/lib/argon2-${FEATURE}.c)
|
||||||
|
@ -81,12 +97,7 @@ elseif (NOT XMRIG_ARM AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
add_feature_impl(avx2 -mavx2 HAVE_AVX2)
|
add_feature_impl(avx2 -mavx2 HAVE_AVX2)
|
||||||
add_feature_impl(avx512f -mavx512f HAVE_AVX512F)
|
add_feature_impl(avx512f -mavx512f HAVE_AVX512F)
|
||||||
|
|
||||||
target_sources(argon2 PRIVATE
|
target_sources(argon2 PRIVATE arch/x86_64/lib/argon2-arch.c arch/x86_64/lib/cpu-flags.c)
|
||||||
arch/x86_64/lib/argon2-arch.c
|
|
||||||
arch/x86_64/lib/cpu-flags.c
|
|
||||||
)
|
|
||||||
else()
|
else()
|
||||||
target_sources(argon2 PRIVATE
|
target_sources(argon2 PRIVATE arch/generic/lib/argon2-arch.c)
|
||||||
arch/generic/lib/argon2-arch.c
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
#ifdef HAVE_AVX2
|
#ifdef HAVE_AVX2
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <x86intrin.h>
|
#ifdef __GNUC__
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
#include "cpu-flags.h"
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,11 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <x86intrin.h>
|
#ifdef __GNUC__
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
#include "cpu-flags.h"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
#include "argon2-sse2.h"
|
#include "argon2-sse2.h"
|
||||||
|
|
||||||
#ifdef HAVE_SSE2
|
#ifdef HAVE_SSE2
|
||||||
#include <x86intrin.h>
|
#ifdef __GNUC__
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
#include "cpu-flags.h"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
#ifdef HAVE_SSSE3
|
#ifdef HAVE_SSSE3
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <x86intrin.h>
|
#ifdef __GNUC__
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
#include "cpu-flags.h"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <x86intrin.h>
|
#ifdef __GNUC__
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
#ifdef HAVE_XOP
|
#ifdef HAVE_XOP
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <x86intrin.h>
|
#ifdef __GNUC__
|
||||||
|
# include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
#include "cpu-flags.h"
|
||||||
|
|
||||||
|
|
114
src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c
vendored
114
src/3rdparty/argon2/arch/x86_64/lib/cpu-flags.c
vendored
|
@ -1,6 +1,49 @@
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
#include "cpu-flags.h"
|
#include "cpu-flags.h"
|
||||||
|
|
||||||
#include <cpuid.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# include <intrin.h>
|
||||||
|
#else
|
||||||
|
# include <cpuid.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef bit_OSXSAVE
|
||||||
|
# define bit_OSXSAVE (1 << 27)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef bit_SSE2
|
||||||
|
# define bit_SSE2 (1 << 26)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef bit_SSSE3
|
||||||
|
# define bit_SSSE3 (1 << 9)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef bit_AVX2
|
||||||
|
# define bit_AVX2 (1 << 5)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef bit_AVX512F
|
||||||
|
# define bit_AVX512F (1 << 16)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef bit_XOP
|
||||||
|
# define bit_XOP (1 << 11)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PROCESSOR_INFO (1)
|
||||||
|
#define EXTENDED_FEATURES (7)
|
||||||
|
|
||||||
|
#define EAX_Reg (0)
|
||||||
|
#define EBX_Reg (1)
|
||||||
|
#define ECX_Reg (2)
|
||||||
|
#define EDX_Reg (3)
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
X86_64_FEATURE_SSE2 = (1 << 0),
|
X86_64_FEATURE_SSE2 = (1 << 0),
|
||||||
|
@ -12,56 +55,51 @@ enum {
|
||||||
|
|
||||||
static unsigned int cpu_flags;
|
static unsigned int cpu_flags;
|
||||||
|
|
||||||
static unsigned int get_cpuid(int ext, unsigned int level, unsigned int *ebx,
|
|
||||||
unsigned int *ecx, unsigned int *edx)
|
static inline void cpuid(uint32_t level, int32_t output[4])
|
||||||
{
|
{
|
||||||
unsigned int eax;
|
# ifdef _MSC_VER
|
||||||
__cpuid(ext ? (0x80000000 | level) : level,
|
__cpuid(output, (int) level);
|
||||||
eax, *ebx, *ecx, *edx);
|
# else
|
||||||
return eax;
|
__cpuid_count(level, 0, output[0], output[1], output[2], output[3]);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int get_cpuid_count(int ext, unsigned int level,
|
|
||||||
unsigned int count, unsigned int *ebx,
|
static bool has_feature(uint32_t level, uint32_t reg, int32_t bit)
|
||||||
unsigned int *ecx, unsigned int *edx)
|
|
||||||
{
|
{
|
||||||
unsigned int eax;
|
int32_t cpu_info[4] = { 0 };
|
||||||
__cpuid_count(ext ? (0x80000000 | level) : level,
|
cpuid(level, cpu_info);
|
||||||
count, eax, *ebx, *ecx, *edx);
|
|
||||||
return 1;
|
return (cpu_info[reg] & bit) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cpu_flags_get(void)
|
void cpu_flags_get(void)
|
||||||
{
|
{
|
||||||
unsigned int ebx, ecx, edx;
|
if (has_feature(PROCESSOR_INFO, EDX_Reg, bit_SSE2)) {
|
||||||
unsigned int level, level_ext;
|
cpu_flags |= X86_64_FEATURE_SSE2;
|
||||||
|
}
|
||||||
|
|
||||||
cpu_flags = 0;
|
if (has_feature(PROCESSOR_INFO, ECX_Reg, bit_SSSE3)) {
|
||||||
level = get_cpuid(0, 0, &ebx, &ecx, &edx);
|
cpu_flags |= X86_64_FEATURE_SSSE3;
|
||||||
level_ext = get_cpuid(1, 0, &ebx, &ecx, &edx);
|
}
|
||||||
|
|
||||||
if (level >= 1 && get_cpuid(0, 1, &ebx, &ecx, &edx)) {
|
if (!has_feature(PROCESSOR_INFO, ECX_Reg, bit_OSXSAVE)) {
|
||||||
if (edx & (1 << 26)) {
|
return;
|
||||||
cpu_flags |= X86_64_FEATURE_SSE2;
|
|
||||||
}
|
|
||||||
if (ecx & (1 << 9)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (level >= 7 && get_cpuid_count(0, 7, 0, &ebx, &ecx, &edx)) {
|
|
||||||
if (ebx & (1 << 5)) {
|
if (has_feature(EXTENDED_FEATURES, EBX_Reg, bit_AVX2)) {
|
||||||
cpu_flags |= X86_64_FEATURE_AVX2;
|
cpu_flags |= X86_64_FEATURE_AVX2;
|
||||||
}
|
|
||||||
if (ebx & (1 << 16)) {
|
|
||||||
cpu_flags |= X86_64_FEATURE_AVX512F;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (level_ext >= 1 && get_cpuid(1, 1, &ebx, &ecx, &edx)) {
|
|
||||||
if (ecx & (1 << 11)) {
|
if (has_feature(EXTENDED_FEATURES, EBX_Reg, bit_AVX512F)) {
|
||||||
cpu_flags |= X86_64_FEATURE_XOP;
|
cpu_flags |= X86_64_FEATURE_AVX512F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (has_feature(0x80000001, ECX_Reg, bit_XOP)) {
|
||||||
|
cpu_flags |= X86_64_FEATURE_XOP;
|
||||||
}
|
}
|
||||||
/* FIXME: check also OS support! */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_flags_have_sse2(void)
|
int cpu_flags_have_sse2(void)
|
||||||
|
|
2
src/3rdparty/argon2/include/argon2.h
vendored
2
src/3rdparty/argon2/include/argon2.h
vendored
|
@ -430,7 +430,7 @@ ARGON2_PUBLIC size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost,
|
||||||
* @param prefix What to print before each line; NULL is equivalent to empty
|
* @param prefix What to print before each line; NULL is equivalent to empty
|
||||||
* string
|
* string
|
||||||
*/
|
*/
|
||||||
ARGON2_PUBLIC void argon2_select_impl(FILE *out, const char *prefix);
|
ARGON2_PUBLIC void argon2_select_impl();
|
||||||
ARGON2_PUBLIC const char *argon2_get_impl_name();
|
ARGON2_PUBLIC const char *argon2_get_impl_name();
|
||||||
ARGON2_PUBLIC int argon2_select_impl_by_name(const char *name);
|
ARGON2_PUBLIC int argon2_select_impl_by_name(const char *name);
|
||||||
|
|
||||||
|
|
35
src/3rdparty/argon2/lib/impl-select.c
vendored
35
src/3rdparty/argon2/lib/impl-select.c
vendored
|
@ -5,14 +5,7 @@
|
||||||
|
|
||||||
#include "argon2.h"
|
#include "argon2.h"
|
||||||
|
|
||||||
#define log_maybe(file, ...) \
|
#define BENCH_SAMPLES 1024
|
||||||
do { \
|
|
||||||
if (file) { \
|
|
||||||
fprintf(file, __VA_ARGS__); \
|
|
||||||
} \
|
|
||||||
} while((void)0, 0)
|
|
||||||
|
|
||||||
#define BENCH_SAMPLES 512
|
|
||||||
#define BENCH_MEM_BLOCKS 512
|
#define BENCH_MEM_BLOCKS 512
|
||||||
|
|
||||||
static argon2_impl selected_argon_impl = {
|
static argon2_impl selected_argon_impl = {
|
||||||
|
@ -60,32 +53,24 @@ static uint64_t benchmark_impl(const argon2_impl *impl) {
|
||||||
return bench;
|
return bench;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void select_impl(FILE *out, const char *prefix)
|
void argon2_select_impl()
|
||||||
{
|
{
|
||||||
argon2_impl_list impls;
|
argon2_impl_list impls;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
const argon2_impl *best_impl = NULL;
|
const argon2_impl *best_impl = NULL;
|
||||||
uint64_t best_bench = UINT_MAX;
|
uint64_t best_bench = UINT_MAX;
|
||||||
|
|
||||||
log_maybe(out, "%sSelecting best fill_segment implementation...\n", prefix);
|
|
||||||
|
|
||||||
argon2_get_impl_list(&impls);
|
argon2_get_impl_list(&impls);
|
||||||
|
|
||||||
for (i = 0; i < impls.count; i++) {
|
for (i = 0; i < impls.count; i++) {
|
||||||
const argon2_impl *impl = &impls.entries[i];
|
const argon2_impl *impl = &impls.entries[i];
|
||||||
uint64_t bench;
|
uint64_t bench;
|
||||||
|
|
||||||
log_maybe(out, "%s%s: Checking availability... ", prefix, impl->name);
|
|
||||||
if (impl->check != NULL && !impl->check()) {
|
if (impl->check != NULL && !impl->check()) {
|
||||||
log_maybe(out, "FAILED!\n");
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
log_maybe(out, "OK!\n");
|
|
||||||
|
|
||||||
log_maybe(out, "%s%s: Benchmarking...\n", prefix, impl->name);
|
|
||||||
bench = benchmark_impl(impl);
|
bench = benchmark_impl(impl);
|
||||||
log_maybe(out, "%s%s: Benchmark result: %llu\n", prefix, impl->name,
|
|
||||||
(unsigned long long)bench);
|
|
||||||
|
|
||||||
if (bench < best_bench) {
|
if (bench < best_bench) {
|
||||||
best_bench = bench;
|
best_bench = bench;
|
||||||
|
@ -94,15 +79,7 @@ static void select_impl(FILE *out, const char *prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (best_impl != NULL) {
|
if (best_impl != NULL) {
|
||||||
log_maybe(out,
|
|
||||||
"%sBest implementation: '%s' (bench %llu)\n", prefix,
|
|
||||||
best_impl->name, (unsigned long long)best_bench);
|
|
||||||
|
|
||||||
selected_argon_impl = *best_impl;
|
selected_argon_impl = *best_impl;
|
||||||
} else {
|
|
||||||
log_maybe(out,
|
|
||||||
"%sNo optimized implementation available, using default!\n",
|
|
||||||
prefix);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,14 +88,6 @@ void fill_segment(const argon2_instance_t *instance, argon2_position_t position)
|
||||||
selected_argon_impl.fill_segment(instance, position);
|
selected_argon_impl.fill_segment(instance, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void argon2_select_impl(FILE *out, const char *prefix)
|
|
||||||
{
|
|
||||||
if (prefix == NULL) {
|
|
||||||
prefix = "";
|
|
||||||
}
|
|
||||||
select_impl(out, prefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *argon2_get_impl_name()
|
const char *argon2_get_impl_name()
|
||||||
{
|
{
|
||||||
return selected_argon_impl.name;
|
return selected_argon_impl.name;
|
||||||
|
|
|
@ -333,6 +333,10 @@ rapidjson::Value xmrig::CpuBackend::toJSON(rapidjson::Document &doc) const
|
||||||
out.AddMember("asm", false, allocator);
|
out.AddMember("asm", false, allocator);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef XMRIG_ALGO_ARGON2
|
||||||
|
out.AddMember("argon2-impl", argon2::Impl::name().toJSON(), allocator);
|
||||||
|
# endif
|
||||||
|
|
||||||
const auto pages = hugePages();
|
const auto pages = hugePages();
|
||||||
|
|
||||||
rapidjson::Value hugepages(rapidjson::kArrayType);
|
rapidjson::Value hugepages(rapidjson::kArrayType);
|
||||||
|
|
|
@ -52,7 +52,6 @@
|
||||||
|
|
||||||
#define VENDOR_ID (0)
|
#define VENDOR_ID (0)
|
||||||
#define PROCESSOR_INFO (1)
|
#define PROCESSOR_INFO (1)
|
||||||
#define CACHE_TLB_DESCRIPTOR (2)
|
|
||||||
#define EXTENDED_FEATURES (7)
|
#define EXTENDED_FEATURES (7)
|
||||||
#define PROCESSOR_BRAND_STRING_1 (0x80000002)
|
#define PROCESSOR_BRAND_STRING_1 (0x80000002)
|
||||||
#define PROCESSOR_BRAND_STRING_2 (0x80000003)
|
#define PROCESSOR_BRAND_STRING_2 (0x80000003)
|
||||||
|
|
|
@ -43,7 +43,7 @@ bool xmrig::argon2::Impl::select(const String &nameHint)
|
||||||
{
|
{
|
||||||
if (!selected) {
|
if (!selected) {
|
||||||
if (nameHint.isEmpty() || argon2_select_impl_by_name(nameHint) == 0) {
|
if (nameHint.isEmpty() || argon2_select_impl_by_name(nameHint) == 0) {
|
||||||
argon2_select_impl(nullptr, nullptr);
|
argon2_select_impl();
|
||||||
}
|
}
|
||||||
|
|
||||||
selected = true;
|
selected = true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue