mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-04-23 17:36:37 +02:00
[cpu] remove avx detect and code blocks, try to switch to __builtin
Signed-off-by: r4sas <r4sas@i2pmail.org>
This commit is contained in:
parent
794fe41aa2
commit
1389b85028
9 changed files with 20 additions and 68 deletions
|
@ -280,8 +280,6 @@ verify = true
|
||||||
[cpuext]
|
[cpuext]
|
||||||
## Use CPU AES-NI instructions set when work with cryptography when available (default: true)
|
## Use CPU AES-NI instructions set when work with cryptography when available (default: true)
|
||||||
# aesni = true
|
# aesni = true
|
||||||
## Use CPU AVX instructions set when work with cryptography when available (default: true)
|
|
||||||
# avx = true
|
|
||||||
## Force usage of CPU instructions set, even if they not found (default: false)
|
## Force usage of CPU instructions set, even if they not found (default: false)
|
||||||
## DO NOT TOUCH that option if you really don't know what are you doing!
|
## DO NOT TOUCH that option if you really don't know what are you doing!
|
||||||
# force = false
|
# force = false
|
||||||
|
|
|
@ -150,12 +150,11 @@ namespace util
|
||||||
|
|
||||||
bool precomputation; i2p::config::GetOption("precomputation.elgamal", precomputation);
|
bool precomputation; i2p::config::GetOption("precomputation.elgamal", precomputation);
|
||||||
bool aesni; i2p::config::GetOption("cpuext.aesni", aesni);
|
bool aesni; i2p::config::GetOption("cpuext.aesni", aesni);
|
||||||
bool avx; i2p::config::GetOption("cpuext.avx", avx);
|
|
||||||
bool forceCpuExt; i2p::config::GetOption("cpuext.force", forceCpuExt);
|
bool forceCpuExt; i2p::config::GetOption("cpuext.force", forceCpuExt);
|
||||||
bool ssu; i2p::config::GetOption("ssu", ssu);
|
bool ssu; i2p::config::GetOption("ssu", ssu);
|
||||||
if (!ssu && i2p::config::IsDefault ("precomputation.elgamal"))
|
if (!ssu && i2p::config::IsDefault ("precomputation.elgamal"))
|
||||||
precomputation = false; // we don't elgamal table if no ssu, unless it's specified explicitly
|
precomputation = false; // we don't elgamal table if no ssu, unless it's specified explicitly
|
||||||
i2p::crypto::InitCrypto (precomputation, aesni, avx, forceCpuExt);
|
i2p::crypto::InitCrypto (precomputation, aesni, forceCpuExt);
|
||||||
|
|
||||||
i2p::transport::InitAddressFromIface (); // get address4/6 from interfaces
|
i2p::transport::InitAddressFromIface (); // get address4/6 from interfaces
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2020, The PurpleI2P Project
|
* Copyright (c) 2013-2023, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
|
@ -7,52 +7,26 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "CPU.h"
|
#include "CPU.h"
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
|
||||||
#include <cpuid.h>
|
|
||||||
#endif
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
|
||||||
#ifndef bit_AES
|
|
||||||
#define bit_AES (1 << 25)
|
|
||||||
#endif
|
|
||||||
#ifndef bit_AVX
|
|
||||||
#define bit_AVX (1 << 28)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
{
|
{
|
||||||
namespace cpu
|
namespace cpu
|
||||||
{
|
{
|
||||||
bool aesni = false;
|
bool aesni = false;
|
||||||
bool avx = false;
|
|
||||||
|
|
||||||
void Detect(bool AesSwitch, bool AvxSwitch, bool force)
|
void Detect(bool AesSwitch, bool force)
|
||||||
{
|
{
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
__builtin_cpu_init ();
|
||||||
int info[4];
|
|
||||||
__cpuid(0, info[0], info[1], info[2], info[3]);
|
|
||||||
if (info[0] >= 0x00000001) {
|
|
||||||
__cpuid(0x00000001, info[0], info[1], info[2], info[3]);
|
|
||||||
#if defined (_WIN32) && (WINVER == 0x0501) // WinXP
|
#if defined (_WIN32) && (WINVER == 0x0501) // WinXP
|
||||||
if (AesSwitch && force) { // only if forced
|
if (AesSwitch && force) { // only if forced
|
||||||
#else
|
#else
|
||||||
if ((info[2] & bit_AES && AesSwitch) || (AesSwitch && force)) {
|
if ((__builtin_cpu_supports ("aes") && AesSwitch) || (AesSwitch && force)) {
|
||||||
#endif
|
#endif
|
||||||
aesni = true;
|
aesni = true;
|
||||||
}
|
|
||||||
#if defined (_WIN32) && (WINVER == 0x0501) // WinXP
|
|
||||||
if (AvxSwitch && force) { // only if forced
|
|
||||||
#else
|
|
||||||
if ((info[2] & bit_AVX && AvxSwitch) || (AvxSwitch && force)) {
|
|
||||||
#endif
|
|
||||||
avx = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif // defined(__x86_64__) || defined(__i386__)
|
|
||||||
|
|
||||||
LogPrint(eLogInfo, "AESNI ", (aesni ? "enabled" : "disabled"));
|
LogPrint(eLogInfo, "AESNI ", (aesni ? "enabled" : "disabled"));
|
||||||
LogPrint(eLogInfo, "AVX ", (avx ? "enabled" : "disabled"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2020, The PurpleI2P Project
|
* Copyright (c) 2013-2023, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
|
@ -14,9 +14,8 @@ namespace i2p
|
||||||
namespace cpu
|
namespace cpu
|
||||||
{
|
{
|
||||||
extern bool aesni;
|
extern bool aesni;
|
||||||
extern bool avx;
|
|
||||||
|
|
||||||
void Detect(bool AesSwitch, bool AvxSwitch, bool force);
|
void Detect(bool AesSwitch, bool force);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ namespace config {
|
||||||
options_description cpuext("CPU encryption extensions options");
|
options_description cpuext("CPU encryption extensions options");
|
||||||
cpuext.add_options()
|
cpuext.add_options()
|
||||||
("cpuext.aesni", bool_switch()->default_value(true), "Use auto detection for AESNI CPU extensions. If false, AESNI will be not used")
|
("cpuext.aesni", bool_switch()->default_value(true), "Use auto detection for AESNI CPU extensions. If false, AESNI will be not used")
|
||||||
("cpuext.avx", bool_switch()->default_value(true), "Use auto detection for AVX CPU extensions. If false, AVX will be not used")
|
("cpuext.avx", bool_switch()->default_value(false), "Deprecated option")
|
||||||
("cpuext.force", bool_switch()->default_value(false), "Force usage of CPU extensions. Useful when cpuinfo is not available on virtual machines")
|
("cpuext.force", bool_switch()->default_value(false), "Force usage of CPU extensions. Useful when cpuinfo is not available on virtual machines")
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -1285,9 +1285,9 @@ namespace crypto
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
void InitCrypto (bool precomputation, bool aesni, bool avx, bool force)
|
void InitCrypto (bool precomputation, bool aesni, bool force)
|
||||||
{
|
{
|
||||||
i2p::cpu::Detect (aesni, avx, force);
|
i2p::cpu::Detect (aesni, force);
|
||||||
#if LEGACY_OPENSSL
|
#if LEGACY_OPENSSL
|
||||||
SSL_library_init ();
|
SSL_library_init ();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -307,7 +307,7 @@ namespace crypto
|
||||||
void InitNoiseIKState (NoiseSymmetricState& state, const uint8_t * pub); // Noise_IK (ratchets)
|
void InitNoiseIKState (NoiseSymmetricState& state, const uint8_t * pub); // Noise_IK (ratchets)
|
||||||
|
|
||||||
// init and terminate
|
// init and terminate
|
||||||
void InitCrypto (bool precomputation, bool aesni, bool avx, bool force);
|
void InitCrypto (bool precomputation, bool aesni, bool force);
|
||||||
void TerminateCrypto ();
|
void TerminateCrypto ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -803,29 +803,12 @@ namespace data
|
||||||
XORMetric operator^(const IdentHash& key1, const IdentHash& key2)
|
XORMetric operator^(const IdentHash& key1, const IdentHash& key2)
|
||||||
{
|
{
|
||||||
XORMetric m;
|
XORMetric m;
|
||||||
#if (defined(__x86_64__) || defined(__i386__)) && defined(__AVX__) // not all X86 targets supports AVX (like old Pentium, see #1600)
|
|
||||||
if(i2p::cpu::avx)
|
const uint64_t * hash1 = key1.GetLL (), * hash2 = key2.GetLL ();
|
||||||
{
|
m.metric_ll[0] = hash1[0] ^ hash2[0];
|
||||||
__asm__
|
m.metric_ll[1] = hash1[1] ^ hash2[1];
|
||||||
(
|
m.metric_ll[2] = hash1[2] ^ hash2[2];
|
||||||
"vmovups %1, %%ymm0 \n"
|
m.metric_ll[3] = hash1[3] ^ hash2[3];
|
||||||
"vmovups %2, %%ymm1 \n"
|
|
||||||
"vxorps %%ymm0, %%ymm1, %%ymm1 \n"
|
|
||||||
"vmovups %%ymm1, %0 \n"
|
|
||||||
: "=m"(*m.metric)
|
|
||||||
: "m"(*key1), "m"(*key2)
|
|
||||||
: "memory", "%xmm0", "%xmm1" // should be replaced by %ymm0/1 once supported by compiler
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
const uint64_t * hash1 = key1.GetLL (), * hash2 = key2.GetLL ();
|
|
||||||
m.metric_ll[0] = hash1[0] ^ hash2[0];
|
|
||||||
m.metric_ll[1] = hash1[1] ^ hash2[1];
|
|
||||||
m.metric_ll[2] = hash1[2] ^ hash2[2];
|
|
||||||
m.metric_ll[3] = hash1[3] ^ hash2[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,8 @@ namespace api
|
||||||
|
|
||||||
bool precomputation; i2p::config::GetOption("precomputation.elgamal", precomputation);
|
bool precomputation; i2p::config::GetOption("precomputation.elgamal", precomputation);
|
||||||
bool aesni; i2p::config::GetOption("cpuext.aesni", aesni);
|
bool aesni; i2p::config::GetOption("cpuext.aesni", aesni);
|
||||||
bool avx; i2p::config::GetOption("cpuext.avx", avx);
|
|
||||||
bool forceCpuExt; i2p::config::GetOption("cpuext.force", forceCpuExt);
|
bool forceCpuExt; i2p::config::GetOption("cpuext.force", forceCpuExt);
|
||||||
i2p::crypto::InitCrypto (precomputation, aesni, avx, forceCpuExt);
|
i2p::crypto::InitCrypto (precomputation, aesni, forceCpuExt);
|
||||||
|
|
||||||
int netID; i2p::config::GetOption("netid", netID);
|
int netID; i2p::config::GetOption("netid", netID);
|
||||||
i2p::context.SetNetID (netID);
|
i2p::context.SetNetID (netID);
|
||||||
|
|
Loading…
Add table
Reference in a new issue