astcenc_mathlib.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // SPDX-License-Identifier: Apache-2.0
  2. // ----------------------------------------------------------------------------
  3. // Copyright 2011-2021 Arm Limited
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License"); you may not
  6. // use this file except in compliance with the License. You may obtain a copy
  7. // of the License at:
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. // License for the specific language governing permissions and limitations
  15. // under the License.
  16. // ----------------------------------------------------------------------------
  17. #include "astcenc_mathlib.h"
  18. /**
  19. * @brief 64-bit rotate left.
  20. *
  21. * @param val The value to rotate.
  22. * @param count The rotation, in bits.
  23. */
  24. static inline uint64_t rotl(uint64_t val, int count)
  25. {
  26. return (val << count) | (val >> (64 - count));
  27. }
  28. /* See header for documentation. */
  29. void astc::rand_init(uint64_t state[2])
  30. {
  31. state[0] = 0xfaf9e171cea1ec6bULL;
  32. state[1] = 0xf1b318cc06af5d71ULL;
  33. }
  34. /* See header for documentation. */
  35. uint64_t astc::rand(uint64_t state[2])
  36. {
  37. uint64_t s0 = state[0];
  38. uint64_t s1 = state[1];
  39. uint64_t res = s0 + s1;
  40. s1 ^= s0;
  41. state[0] = rotl(s0, 24) ^ s1 ^ (s1 << 16);
  42. state[1] = rotl(s1, 37);
  43. return res;
  44. }