uint32_t.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. /*
  2. * Copyright 2010-2017 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #ifndef BX_UINT32_T_H_HEADER_GUARD
  6. #define BX_UINT32_T_H_HEADER_GUARD
  7. #include "bx.h"
  8. #if BX_COMPILER_MSVC
  9. # if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT
  10. # include <intrin.h>
  11. # pragma intrinsic(_BitScanForward)
  12. # pragma intrinsic(_BitScanReverse)
  13. # if BX_ARCH_64BIT
  14. # pragma intrinsic(_BitScanForward64)
  15. # pragma intrinsic(_BitScanReverse64)
  16. # endif // BX_ARCH_64BIT
  17. # endif // BX_PLATFORM_WINDOWS
  18. #endif // BX_COMPILER_MSVC
  19. #define BX_HALF_FLOAT_ZERO UINT16_C(0)
  20. #define BX_HALF_FLOAT_HALF UINT16_C(0x3800)
  21. #define BX_HALF_FLOAT_ONE UINT16_C(0x3c00)
  22. #define BX_HALF_FLOAT_TWO UINT16_C(0x4000)
  23. namespace bx
  24. {
  25. ///
  26. uint32_t uint32_li(uint32_t _a);
  27. ///
  28. uint32_t uint32_dec(uint32_t _a);
  29. ///
  30. uint32_t uint32_inc(uint32_t _a);
  31. ///
  32. uint32_t uint32_not(uint32_t _a);
  33. ///
  34. uint32_t uint32_neg(uint32_t _a);
  35. ///
  36. uint32_t uint32_ext(uint32_t _a);
  37. ///
  38. uint32_t uint32_and(uint32_t _a, uint32_t _b);
  39. ///
  40. uint32_t uint32_andc(uint32_t _a, uint32_t _b);
  41. ///
  42. uint32_t uint32_xor(uint32_t _a, uint32_t _b);
  43. ///
  44. uint32_t uint32_xorl(uint32_t _a, uint32_t _b);
  45. ///
  46. uint32_t uint32_or(uint32_t _a, uint32_t _b);
  47. ///
  48. uint32_t uint32_orc(uint32_t _a, uint32_t _b);
  49. ///
  50. uint32_t uint32_sll(uint32_t _a, int _sa);
  51. ///
  52. uint32_t uint32_srl(uint32_t _a, int _sa);
  53. ///
  54. uint32_t uint32_sra(uint32_t _a, int _sa);
  55. ///
  56. uint32_t uint32_rol(uint32_t _a, int _sa);
  57. ///
  58. uint32_t uint32_ror(uint32_t _a, int _sa);
  59. ///
  60. uint32_t uint32_add(uint32_t _a, uint32_t _b);
  61. ///
  62. uint32_t uint32_sub(uint32_t _a, uint32_t _b);
  63. ///
  64. uint32_t uint32_mul(uint32_t _a, uint32_t _b);
  65. ///
  66. uint32_t uint32_div(uint32_t _a, uint32_t _b);
  67. ///
  68. uint32_t uint32_mod(uint32_t _a, uint32_t _b);
  69. ///
  70. uint32_t uint32_cmpeq(uint32_t _a, uint32_t _b);
  71. ///
  72. uint32_t uint32_cmpneq(uint32_t _a, uint32_t _b);
  73. ///
  74. uint32_t uint32_cmplt(uint32_t _a, uint32_t _b);
  75. ///
  76. uint32_t uint32_cmple(uint32_t _a, uint32_t _b);
  77. ///
  78. uint32_t uint32_cmpgt(uint32_t _a, uint32_t _b);
  79. ///
  80. uint32_t uint32_cmpge(uint32_t _a, uint32_t _b);
  81. ///
  82. uint32_t uint32_setnz(uint32_t _a);
  83. ///
  84. uint32_t uint32_satadd(uint32_t _a, uint32_t _b);
  85. ///
  86. uint32_t uint32_satsub(uint32_t _a, uint32_t _b);
  87. ///
  88. uint32_t uint32_satmul(uint32_t _a, uint32_t _b);
  89. ///
  90. uint32_t uint32_sels(uint32_t test, uint32_t _a, uint32_t _b);
  91. ///
  92. uint32_t uint32_selb(uint32_t _mask, uint32_t _a, uint32_t _b);
  93. ///
  94. uint32_t uint32_imin(uint32_t _a, uint32_t _b);
  95. ///
  96. uint32_t uint32_imax(uint32_t _a, uint32_t _b);
  97. ///
  98. uint32_t uint32_min(uint32_t _a, uint32_t _b);
  99. ///
  100. uint32_t uint32_min(uint32_t _a, uint32_t _b, uint32_t _c);
  101. ///
  102. uint32_t uint32_max(uint32_t _a, uint32_t _b);
  103. ///
  104. uint32_t uint32_max(uint32_t _a, uint32_t _b, uint32_t _c);
  105. ///
  106. uint32_t uint32_clamp(uint32_t _a, uint32_t _min, uint32_t _max);
  107. ///
  108. uint32_t uint32_iclamp(uint32_t _a, uint32_t _min, uint32_t _max);
  109. ///
  110. uint32_t uint32_incwrap(uint32_t _val, uint32_t _min, uint32_t _max);
  111. ///
  112. uint32_t uint32_decwrap(uint32_t _val, uint32_t _min, uint32_t _max);
  113. ///
  114. uint32_t uint32_cntbits_ref(uint32_t _val);
  115. /// Count number of bits set.
  116. ///
  117. uint32_t uint32_cntbits(uint32_t _val);
  118. ///
  119. uint32_t uint32_cntlz_ref(uint32_t _val);
  120. /// Count number of leading zeros.
  121. ///
  122. uint32_t uint32_cntlz(uint32_t _val);
  123. ///
  124. uint32_t uint32_cnttz_ref(uint32_t _val);
  125. ///
  126. uint32_t uint32_cnttz(uint32_t _val);
  127. // shuffle:
  128. // ---- ---- ---- ---- fedc ba98 7654 3210
  129. // to:
  130. // -f-e -d-c -b-a -9-8 -7-6 -5-4 -3-2 -1-0
  131. uint32_t uint32_part1by1(uint32_t _a);
  132. // shuffle:
  133. // ---- ---- ---- ---- ---- --98 7654 3210
  134. // to:
  135. // ---- 9--8 --7- -6-- 5--4 --3- -2-- 1--0
  136. ///
  137. uint32_t uint32_part1by2(uint32_t _a);
  138. ///
  139. uint32_t uint32_testpow2(uint32_t _a);
  140. ///
  141. uint32_t uint32_nextpow2(uint32_t _a);
  142. ///
  143. uint16_t halfFromFloat(float _a);
  144. ///
  145. float halfToFloat(uint16_t _a);
  146. ///
  147. uint16_t uint16_min(uint16_t _a, uint16_t _b);
  148. ///
  149. uint16_t uint16_max(uint16_t _a, uint16_t _b);
  150. ///
  151. int64_t int64_min(int64_t _a, int64_t _b);
  152. ///
  153. int64_t int64_max(int64_t _a, int64_t _b);
  154. ///
  155. int64_t int64_clamp(int64_t _a, int64_t _min, int64_t _max);
  156. ///
  157. uint32_t uint64_cntbits_ref(uint64_t _val);
  158. /// Count number of bits set.
  159. ///
  160. uint32_t uint64_cntbits(uint64_t _val);
  161. ///
  162. uint32_t uint64_cntlz_ref(uint64_t _val);
  163. /// Count number of leading zeros.
  164. ///
  165. uint32_t uint64_cntlz(uint64_t _val);
  166. ///
  167. uint32_t uint64_cnttz_ref(uint64_t _val);
  168. ///
  169. uint32_t uint64_cnttz(uint64_t _val);
  170. ///
  171. uint64_t uint64_sll(uint64_t _a, int _sa);
  172. ///
  173. uint64_t uint64_srl(uint64_t _a, int _sa);
  174. ///
  175. uint64_t uint64_sra(uint64_t _a, int _sa);
  176. ///
  177. uint64_t uint64_rol(uint64_t _a, int _sa);
  178. ///
  179. uint64_t uint64_ror(uint64_t _a, int _sa);
  180. ///
  181. uint64_t uint64_add(uint64_t _a, uint64_t _b);
  182. ///
  183. uint64_t uint64_sub(uint64_t _a, uint64_t _b);
  184. ///
  185. uint64_t uint64_mul(uint64_t _a, uint64_t _b);
  186. /// Greatest common divisor.
  187. ///
  188. uint32_t uint32_gcd(uint32_t _a, uint32_t _b);
  189. /// Least common multiple.
  190. ///
  191. uint32_t uint32_lcm(uint32_t _a, uint32_t _b);
  192. /// Align to arbitrary stride.
  193. ///
  194. uint32_t strideAlign(uint32_t _offset, uint32_t _stride);
  195. /// Align to arbitrary stride and 16-bytes.
  196. ///
  197. uint32_t strideAlign16(uint32_t _offset, uint32_t _stride);
  198. /// Align to arbitrary stride and 256-bytes.
  199. ///
  200. uint32_t strideAlign256(uint32_t _offset, uint32_t _stride);
  201. } // namespace bx
  202. #include "inline/uint32_t.inl"
  203. #endif // BX_UINT32_T_H_HEADER_GUARD