u64_test.c 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. *******************************************************************************
  3. \file u64_test.c
  4. \brief Tests for operations on 64-bit words
  5. \project bee2/test
  6. \created 2017.01.11
  7. \version 2019.07.08
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/u64.h>
  13. /*
  14. *******************************************************************************
  15. Тестирование
  16. *******************************************************************************
  17. */
  18. bool_t u64Test()
  19. {
  20. #ifdef U64_SUPPORT
  21. u64 w = 0x0102030405060708;
  22. u64 a[2] = {0x0102030405060708, 0x0807060504030201};
  23. octet b[16];
  24. // rot
  25. if (u64RotHi(w, 1) != 0x020406080A0C0E10 ||
  26. u64RotHi(w, 4) != 0x1020304050607080 ||
  27. u64RotHi(w, 8) != 0x0203040506070801 ||
  28. u64RotLo(u64RotHi(w, 7), 7) != w ||
  29. u64RotLo(u64RotHi(w, 19), 19) != w ||
  30. u64RotLo(u64RotHi(w, 43), 43) != w)
  31. return FALSE;
  32. // reverse
  33. if (u64Rev(w) != a[1] || u64Rev(a[1]) != w)
  34. return FALSE;
  35. u64Rev2(a, 2), u64Rev2(a, 2);
  36. if (a[0] != w || a[1] != u64Rev(w))
  37. return FALSE;
  38. // weight / parity
  39. if (u64Weight(0) != 0 || u64Parity(0) || !u64Parity(1) ||
  40. u64Weight(0xA001) != 3 || !u64Parity(0xA001) ||
  41. u64Weight(0xFFFF) != 16 || u64Parity(0xFFFF) ||
  42. u64Weight(0xF000A001) != 7 || !u64Parity(0xF000A001) ||
  43. u64Weight(0x0E00A001) != 6 || u64Parity(0x0E00A001) ||
  44. u64Weight(0xFFFFFFFF) != 32 || u64Parity(0xFFFFFFFF) ||
  45. u64Weight(0xAA0180EEF000A001) != 19 ||
  46. !u64Parity(0xAA0180EEF000A001) ||
  47. u64Weight(0x730085060E00A001) != 16 ||
  48. u64Parity(0x730085060E00A001) ||
  49. u64Weight(0xFFFFFFFFFFFFFFFF) != 64 ||
  50. u64Parity(0xFFFFFFFFFFFFFFFF))
  51. return FALSE;
  52. // CTZ / CLZ
  53. if (SAFE(u64CTZ)(0) != 64 || FAST(u64CTZ)(0) != 64 ||
  54. SAFE(u64CLZ)(0) != 64 || FAST(u64CLZ)(0) != 64 ||
  55. SAFE(u64CTZ)(1) != 0 || FAST(u64CTZ)(1) != 0 ||
  56. SAFE(u64CLZ)(1) != 63 || FAST(u64CLZ)(1) != 63 ||
  57. SAFE(u64CTZ)(0xFFF8) != 3 || FAST(u64CTZ)(0xFFF8) != 3 ||
  58. SAFE(u64CLZ)(0xFFF8) != 48 || FAST(u64CLZ)(0xFFF8) != 48 ||
  59. SAFE(u64CTZ)(0x7FFFE000) != 13 || FAST(u64CTZ)(0x7FFFE000) != 13 ||
  60. SAFE(u64CLZ)(0x7FFFE000) != 33 || FAST(u64CLZ)(0x7FFFE000) != 33 ||
  61. SAFE(u64CTZ)(0x0000003FFDDF8000) != 15 ||
  62. FAST(u64CTZ)(0x0000003FFDDF8000) != 15 ||
  63. SAFE(u64CLZ)(0x0000003FFDDF8000) != 26 ||
  64. FAST(u64CLZ)(0x0000003FFDDF8000) != 26)
  65. return FALSE;
  66. // shuffle
  67. if (u64Deshuffle(0) != 0 || u64Deshuffle(1) != 1 ||
  68. u64Deshuffle(2) != 0x0000000100000000 ||
  69. u64Deshuffle(0xAAAAAAAAAAAAAAAA) != 0xFFFFFFFF00000000 ||
  70. u64Shuffle(u64Deshuffle(0xFEDCBA9876543210)) != 0xFEDCBA9876543210 ||
  71. u64Deshuffle(u64Shuffle(0x9876543210FEDCBA)) != 0x9876543210FEDCBA)
  72. return FALSE;
  73. // negInv
  74. if (u64NegInv(1) != U64_MAX ||
  75. u64NegInv(5) != 3689348814741910323 ||
  76. u64NegInv(3689348814741910323) != 5)
  77. return FALSE;
  78. // from / to
  79. u64To(b, 15, a), u64From(a, b, 15);
  80. if (a[0] != w || a[1] != 0x0007060504030201)
  81. return FALSE;
  82. // shuffle (константы crypto/bash-f)
  83. w = 0x3BF5080AC8BA94B1;
  84. w = u64Deshuffle(w);
  85. if ((u32)w != 0x5F008465 || (u32)(w >> 32) != 0x7C23AF8C)
  86. return FALSE;
  87. #endif
  88. // все нормально
  89. return TRUE;
  90. }