add win32 (msvc) support
This commit is contained in:
54
core/sys/windows/bitop.c
Normal file
54
core/sys/windows/bitop.c
Normal file
@@ -0,0 +1,54 @@
|
||||
#include <blue/core/bitop.h>
|
||||
#include <intrin.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define CPU_FEATURE_YES 1
|
||||
#define CPU_FEATURE_NO -1
|
||||
#define CPU_FEATURE_UNKNOWN 0
|
||||
|
||||
static int cpu_supports_popcnt = CPU_FEATURE_UNKNOWN;
|
||||
|
||||
static int check_popcnt_support()
|
||||
{
|
||||
int d[4];
|
||||
__cpuid(d, 0x00000001);
|
||||
|
||||
return (d[2] & 0x800000) ? CPU_FEATURE_YES : CPU_FEATURE_NO;
|
||||
}
|
||||
|
||||
int b_popcountl(long v)
|
||||
{
|
||||
if (cpu_supports_popcnt == CPU_FEATURE_UNKNOWN) {
|
||||
cpu_supports_popcnt = check_popcnt_support();
|
||||
}
|
||||
|
||||
if (cpu_supports_popcnt == CPU_FEATURE_YES) {
|
||||
return __popcnt64(v);
|
||||
}
|
||||
|
||||
assert(0 && "CPU does not support popcount!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int b_ctzl(long v)
|
||||
{
|
||||
unsigned long trailing_zero = 0;
|
||||
|
||||
if (_BitScanForward64(&trailing_zero, v)) {
|
||||
return trailing_zero;
|
||||
} else {
|
||||
return 64;
|
||||
}
|
||||
}
|
||||
|
||||
int b_clzl(long v)
|
||||
{
|
||||
unsigned long leading_zero = 0;
|
||||
|
||||
if (_BitScanReverse64(&leading_zero, v)) {
|
||||
return 64 - leading_zero;
|
||||
} else {
|
||||
// Same remarks as above
|
||||
return 64;
|
||||
}
|
||||
}
|
||||
30
core/sys/windows/random.c
Normal file
30
core/sys/windows/random.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#include <wincrypt.h>
|
||||
|
||||
uint64_t z__b_platform_random_seed_secure(void)
|
||||
{
|
||||
BOOL status;
|
||||
HCRYPTPROV hCryptProv;
|
||||
status = CryptAcquireContext(
|
||||
&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
|
||||
|
||||
if (status == FALSE) {
|
||||
return (uint64_t)-1;
|
||||
}
|
||||
|
||||
uint64_t v = 0;
|
||||
status = CryptGenRandom(hCryptProv, sizeof v, (BYTE *)&v);
|
||||
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return status == TRUE ? v : (uint64_t)-1;
|
||||
}
|
||||
|
||||
uint64_t z__b_platform_random_seed(void)
|
||||
{
|
||||
return z__b_platform_random_seed_secure();
|
||||
}
|
||||
Reference in New Issue
Block a user