58 static void hash_tree(
const void *data,
size_t length,
char *
hash) {
59 if ((length & 31) != 0) {
60 throw ios_base::failure(
"Invalid input length for tree_hash");
64 static void cn_slow_hash_0(
const void *data,
size_t length,
char *
hash) {
67 static void cn_slow_hash_1(
const void *data,
size_t length,
char *
hash) {
70 static void cn_slow_hash_2(
const void *data,
size_t length,
char *
hash) {
73 static void cn_slow_hash_4(
const void *data,
size_t,
char *
hash) {
80 extern "C" typedef void hash_f(
const void *,
size_t,
char *);
87 {
"slow-1", cn_slow_hash_1}, {
"slow-2", cn_slow_hash_2}, {
"slow-4", cn_slow_hash_4}};
92 int main(
int argc,
char *argv[]) {
99 chash expected, actual;
103 if ((argc == 2) && (strcmp(argv[1],
"variant2_int_sqrt") == 0)) {
107 const int round_modes[3] = { FE_DOWNWARD, FE_TONEAREST, FE_UPWARD };
108 for (
int i = 0; i < 3; ++i) {
109 std::fesetround(round_modes[i]);
112 cerr <<
"FPU round mode was set to ";
113 switch (round_modes[i]) {
115 cerr <<
"FE_DOWNWARD";
118 cerr <<
"FE_TONEAREST";
133 cerr <<
"Wrong number of arguments" << endl;
136 for (hf =
hashes;; hf++) {
138 cerr <<
"Unknown function" << endl;
141 if (argv[1] == hf->
name) {
146 input.open(argv[2], ios_base::in);
149 input.exceptions(ios_base::badbit);
150 get(input, expected);
151 if (input.rdstate() & ios_base::eofbit) {
154 input.exceptions(ios_base::badbit | ios_base::failbit | ios_base::eofbit);
155 input.clear(input.rdstate());
157 if (f == cn_slow_hash_4) {
159 d.
data = data.data();
162 f(&d, 0, (
char *) &actual);
164 f(data.data(), data.size(), (
char *) &actual);
166 if (expected != actual) {
168 cerr <<
"Hash mismatch on test " << test << endl <<
"Input: ";
169 if (data.size() == 0) {
172 for (i = 0; i < data.size(); i++) {
173 cerr << setbase(16) << setw(2) << setfill('0') << int(static_cast<unsigned char>(data[i]));
176 cerr << endl <<
"Expected hash: ";
177 for (i = 0; i < 32; i++) {
178 cerr << setbase(16) << setw(2) << setfill('0') << int(reinterpret_cast<unsigned char *>(&expected)[i]);
180 cerr << endl <<
"Actual hash: ";
181 for (i = 0; i < 32; i++) {
182 cerr << setbase(16) << setw(2) << setfill('0') << int(reinterpret_cast<unsigned char *>(&actual)[i]);
188 return error ? 1 : 0;
192 #if defined(__x86_64__) || (defined(_MSC_VER) && defined(_WIN64)) 194 #include <emmintrin.h> 196 #if defined(_MSC_VER) || defined(__MINGW32__) 199 #include <wmmintrin.h> 204 static inline bool test_variant2_int_sqrt_sse(
const uint64_t sqrt_input,
const uint64_t correct_result)
206 #if defined(__x86_64__) || (defined(_MSC_VER) && defined(_WIN64)) 210 if (sqrt_result != correct_result) {
211 cerr <<
"Integer sqrt (SSE2 version) returned incorrect result for N = " << sqrt_input << endl;
212 cerr <<
"Expected result: " << correct_result << endl;
213 cerr <<
"Returned result: " << sqrt_result << endl;
221 static inline bool test_variant2_int_sqrt_fp64(
const uint64_t sqrt_input,
const uint64_t correct_result)
223 #if defined DBL_MANT_DIG && (DBL_MANT_DIG >= 50) 227 if (sqrt_result != correct_result) {
228 cerr <<
"Integer sqrt (FP64 version) returned incorrect result for N = " << sqrt_input << endl;
229 cerr <<
"Expected result: " << correct_result << endl;
230 cerr <<
"Returned result: " << sqrt_result << endl;
242 if (sqrt_result != correct_result) {
243 cerr <<
"Integer sqrt (reference version) returned incorrect result for N = " << sqrt_input << endl;
244 cerr <<
"Expected result: " << correct_result << endl;
245 cerr <<
"Returned result: " << sqrt_result << endl;
254 if (!test_variant2_int_sqrt_sse(sqrt_input, correct_result)) {
257 if (!test_variant2_int_sqrt_fp64(sqrt_input, correct_result)) {
276 for (
uint64_t i = 1; i <= 3558067407UL; ++i) {
291 n1 = i0 * i0 + (i << 32) - 1;
305 n1 = i0 * i0 + i0 + (i << 32);
333 for (
uint64_t i = 1; i <= 3558067407UL; i += 83) {
337 n1 = i0 * i0 + (i << 32) - 1;
340 n1 = i0 * i0 + i0 + (i << 32);
int main(int argc, char *argv[])
void hash_extra_jh(const void *data, size_t length, char *hash)
#define VARIANT2_INTEGER_MATH_SQRT_FIXUP(r)
struct hash_func hashes[]
void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed, uint64_t height)
void hash_extra_skein(const void *data, size_t length, char *hash)
void cn_fast_hash(const void *data, size_t length, char *hash)
unsigned __int64 uint64_t
int test_variant2_int_sqrt_ref()
void tree_hash(const char(*hashes)[HASH_SIZE], size_t count, char *root_hash)
int test_variant2_int_sqrt()
void hash_extra_blake(const void *data, size_t length, char *hash)
DISABLE_VS_WARNINGS(4244 4345 4503) using namespace crypto
#define VARIANT2_INTEGER_MATH_SQRT_STEP_FP64()
#define VARIANT2_INTEGER_MATH_SQRT_STEP_SSE2()
#define VARIANT2_INTEGER_MATH_SQRT_STEP_REF()
#define CATCH_ENTRY_L0(lacation, return_val)
error
Tracks LMDB error codes.
POP_WARNINGS typedef void hash_f(const void *, size_t, char *)
void hash_extra_groestl(const void *data, size_t length, char *hash)