Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

516 lines
16KB

  1. /// @ref gtc_bitfield
  2. /// @file glm/gtc/bitfield.inl
  3. #include "../simd/integer.h"
  4. namespace glm{
  5. namespace detail
  6. {
  7. template<typename PARAM, typename RET>
  8. GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y);
  9. template<typename PARAM, typename RET>
  10. GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z);
  11. template<typename PARAM, typename RET>
  12. GLM_FUNC_DECL RET bitfieldInterleave(PARAM x, PARAM y, PARAM z, PARAM w);
  13. template<>
  14. GLM_FUNC_QUALIFIER glm::uint16 bitfieldInterleave(glm::uint8 x, glm::uint8 y)
  15. {
  16. glm::uint16 REG1(x);
  17. glm::uint16 REG2(y);
  18. REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint16>(0x0F0F);
  19. REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint16>(0x0F0F);
  20. REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint16>(0x3333);
  21. REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint16>(0x3333);
  22. REG1 = ((REG1 << 1) | REG1) & static_cast<glm::uint16>(0x5555);
  23. REG2 = ((REG2 << 1) | REG2) & static_cast<glm::uint16>(0x5555);
  24. return REG1 | static_cast<glm::uint16>(REG2 << 1);
  25. }
  26. template<>
  27. GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint16 x, glm::uint16 y)
  28. {
  29. glm::uint32 REG1(x);
  30. glm::uint32 REG2(y);
  31. REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint32>(0x00FF00FF);
  32. REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint32>(0x00FF00FF);
  33. REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint32>(0x0F0F0F0F);
  34. REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint32>(0x0F0F0F0F);
  35. REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint32>(0x33333333);
  36. REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint32>(0x33333333);
  37. REG1 = ((REG1 << 1) | REG1) & static_cast<glm::uint32>(0x55555555);
  38. REG2 = ((REG2 << 1) | REG2) & static_cast<glm::uint32>(0x55555555);
  39. return REG1 | (REG2 << 1);
  40. }
  41. template<>
  42. GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y)
  43. {
  44. glm::uint64 REG1(x);
  45. glm::uint64 REG2(y);
  46. REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x0000FFFF0000FFFFull);
  47. REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x0000FFFF0000FFFFull);
  48. REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint64>(0x00FF00FF00FF00FFull);
  49. REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint64>(0x00FF00FF00FF00FFull);
  50. REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint64>(0x0F0F0F0F0F0F0F0Full);
  51. REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint64>(0x0F0F0F0F0F0F0F0Full);
  52. REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint64>(0x3333333333333333ull);
  53. REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint64>(0x3333333333333333ull);
  54. REG1 = ((REG1 << 1) | REG1) & static_cast<glm::uint64>(0x5555555555555555ull);
  55. REG2 = ((REG2 << 1) | REG2) & static_cast<glm::uint64>(0x5555555555555555ull);
  56. return REG1 | (REG2 << 1);
  57. }
  58. template<>
  59. GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z)
  60. {
  61. glm::uint32 REG1(x);
  62. glm::uint32 REG2(y);
  63. glm::uint32 REG3(z);
  64. REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint32>(0xFF0000FFu);
  65. REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint32>(0xFF0000FFu);
  66. REG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint32>(0xFF0000FFu);
  67. REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint32>(0x0F00F00Fu);
  68. REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint32>(0x0F00F00Fu);
  69. REG3 = ((REG3 << 8) | REG3) & static_cast<glm::uint32>(0x0F00F00Fu);
  70. REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint32>(0xC30C30C3u);
  71. REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint32>(0xC30C30C3u);
  72. REG3 = ((REG3 << 4) | REG3) & static_cast<glm::uint32>(0xC30C30C3u);
  73. REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint32>(0x49249249u);
  74. REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint32>(0x49249249u);
  75. REG3 = ((REG3 << 2) | REG3) & static_cast<glm::uint32>(0x49249249u);
  76. return REG1 | (REG2 << 1) | (REG3 << 2);
  77. }
  78. template<>
  79. GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z)
  80. {
  81. glm::uint64 REG1(x);
  82. glm::uint64 REG2(y);
  83. glm::uint64 REG3(z);
  84. REG1 = ((REG1 << 32) | REG1) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);
  85. REG2 = ((REG2 << 32) | REG2) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);
  86. REG3 = ((REG3 << 32) | REG3) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);
  87. REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);
  88. REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);
  89. REG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);
  90. REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);
  91. REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);
  92. REG3 = ((REG3 << 8) | REG3) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);
  93. REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);
  94. REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);
  95. REG3 = ((REG3 << 4) | REG3) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);
  96. REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint64>(0x9249249249249249ull);
  97. REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint64>(0x9249249249249249ull);
  98. REG3 = ((REG3 << 2) | REG3) & static_cast<glm::uint64>(0x9249249249249249ull);
  99. return REG1 | (REG2 << 1) | (REG3 << 2);
  100. }
  101. template<>
  102. GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint32 x, glm::uint32 y, glm::uint32 z)
  103. {
  104. glm::uint64 REG1(x);
  105. glm::uint64 REG2(y);
  106. glm::uint64 REG3(z);
  107. REG1 = ((REG1 << 32) | REG1) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);
  108. REG2 = ((REG2 << 32) | REG2) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);
  109. REG3 = ((REG3 << 32) | REG3) & static_cast<glm::uint64>(0xFFFF00000000FFFFull);
  110. REG1 = ((REG1 << 16) | REG1) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);
  111. REG2 = ((REG2 << 16) | REG2) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);
  112. REG3 = ((REG3 << 16) | REG3) & static_cast<glm::uint64>(0x00FF0000FF0000FFull);
  113. REG1 = ((REG1 << 8) | REG1) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);
  114. REG2 = ((REG2 << 8) | REG2) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);
  115. REG3 = ((REG3 << 8) | REG3) & static_cast<glm::uint64>(0xF00F00F00F00F00Full);
  116. REG1 = ((REG1 << 4) | REG1) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);
  117. REG2 = ((REG2 << 4) | REG2) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);
  118. REG3 = ((REG3 << 4) | REG3) & static_cast<glm::uint64>(0x30C30C30C30C30C3ull);
  119. REG1 = ((REG1 << 2) | REG1) & static_cast<glm::uint64>(0x9249249249249249ull);
  120. REG2 = ((REG2 << 2) | REG2) & static_cast<glm::uint64>(0x9249249249249249ull);
  121. REG3 = ((REG3 << 2) | REG3) & static_cast<glm::uint64>(0x9249249249249249ull);
  122. return REG1 | (REG2 << 1) | (REG3 << 2);
  123. }
  124. template<>
  125. GLM_FUNC_QUALIFIER glm::uint32 bitfieldInterleave(glm::uint8 x, glm::uint8 y, glm::uint8 z, glm::uint8 w)
  126. {
  127. glm::uint32 REG1(x);
  128. glm::uint32 REG2(y);
  129. glm::uint32 REG3(z);
  130. glm::uint32 REG4(w);
  131. REG1 = ((REG1 << 12) | REG1) & static_cast<glm::uint32>(0x000F000Fu);
  132. REG2 = ((REG2 << 12) | REG2) & static_cast<glm::uint32>(0x000F000Fu);
  133. REG3 = ((REG3 << 12) | REG3) & static_cast<glm::uint32>(0x000F000Fu);
  134. REG4 = ((REG4 << 12) | REG4) & static_cast<glm::uint32>(0x000F000Fu);
  135. REG1 = ((REG1 << 6) | REG1) & static_cast<glm::uint32>(0x03030303u);
  136. REG2 = ((REG2 << 6) | REG2) & static_cast<glm::uint32>(0x03030303u);
  137. REG3 = ((REG3 << 6) | REG3) & static_cast<glm::uint32>(0x03030303u);
  138. REG4 = ((REG4 << 6) | REG4) & static_cast<glm::uint32>(0x03030303u);
  139. REG1 = ((REG1 << 3) | REG1) & static_cast<glm::uint32>(0x11111111u);
  140. REG2 = ((REG2 << 3) | REG2) & static_cast<glm::uint32>(0x11111111u);
  141. REG3 = ((REG3 << 3) | REG3) & static_cast<glm::uint32>(0x11111111u);
  142. REG4 = ((REG4 << 3) | REG4) & static_cast<glm::uint32>(0x11111111u);
  143. return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3);
  144. }
  145. template<>
  146. GLM_FUNC_QUALIFIER glm::uint64 bitfieldInterleave(glm::uint16 x, glm::uint16 y, glm::uint16 z, glm::uint16 w)
  147. {
  148. glm::uint64 REG1(x);
  149. glm::uint64 REG2(y);
  150. glm::uint64 REG3(z);
  151. glm::uint64 REG4(w);
  152. REG1 = ((REG1 << 24) | REG1) & static_cast<glm::uint64>(0x000000FF000000FFull);
  153. REG2 = ((REG2 << 24) | REG2) & static_cast<glm::uint64>(0x000000FF000000FFull);
  154. REG3 = ((REG3 << 24) | REG3) & static_cast<glm::uint64>(0x000000FF000000FFull);
  155. REG4 = ((REG4 << 24) | REG4) & static_cast<glm::uint64>(0x000000FF000000FFull);
  156. REG1 = ((REG1 << 12) | REG1) & static_cast<glm::uint64>(0x000F000F000F000Full);
  157. REG2 = ((REG2 << 12) | REG2) & static_cast<glm::uint64>(0x000F000F000F000Full);
  158. REG3 = ((REG3 << 12) | REG3) & static_cast<glm::uint64>(0x000F000F000F000Full);
  159. REG4 = ((REG4 << 12) | REG4) & static_cast<glm::uint64>(0x000F000F000F000Full);
  160. REG1 = ((REG1 << 6) | REG1) & static_cast<glm::uint64>(0x0303030303030303ull);
  161. REG2 = ((REG2 << 6) | REG2) & static_cast<glm::uint64>(0x0303030303030303ull);
  162. REG3 = ((REG3 << 6) | REG3) & static_cast<glm::uint64>(0x0303030303030303ull);
  163. REG4 = ((REG4 << 6) | REG4) & static_cast<glm::uint64>(0x0303030303030303ull);
  164. REG1 = ((REG1 << 3) | REG1) & static_cast<glm::uint64>(0x1111111111111111ull);
  165. REG2 = ((REG2 << 3) | REG2) & static_cast<glm::uint64>(0x1111111111111111ull);
  166. REG3 = ((REG3 << 3) | REG3) & static_cast<glm::uint64>(0x1111111111111111ull);
  167. REG4 = ((REG4 << 3) | REG4) & static_cast<glm::uint64>(0x1111111111111111ull);
  168. return REG1 | (REG2 << 1) | (REG3 << 2) | (REG4 << 3);
  169. }
  170. }//namespace detail
  171. template<typename genIUType>
  172. GLM_FUNC_QUALIFIER genIUType mask(genIUType Bits)
  173. {
  174. GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'mask' accepts only integer values");
  175. return Bits >= sizeof(genIUType) * 8 ? ~static_cast<genIUType>(0) : (static_cast<genIUType>(1) << Bits) - static_cast<genIUType>(1);
  176. }
  177. template<length_t L, typename T, qualifier Q>
  178. GLM_FUNC_QUALIFIER vec<L, T, Q> mask(vec<L, T, Q> const& v)
  179. {
  180. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'mask' accepts only integer values");
  181. return detail::functor1<L, T, T, Q>::call(mask, v);
  182. }
  183. template<typename genIType>
  184. GLM_FUNC_QUALIFIER genIType bitfieldRotateRight(genIType In, int Shift)
  185. {
  186. GLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, "'bitfieldRotateRight' accepts only integer values");
  187. int const BitSize = static_cast<genIType>(sizeof(genIType) * 8);
  188. return (In << static_cast<genIType>(Shift)) | (In >> static_cast<genIType>(BitSize - Shift));
  189. }
  190. template<length_t L, typename T, qualifier Q>
  191. GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldRotateRight(vec<L, T, Q> const& In, int Shift)
  192. {
  193. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldRotateRight' accepts only integer values");
  194. int const BitSize = static_cast<int>(sizeof(T) * 8);
  195. return (In << static_cast<T>(Shift)) | (In >> static_cast<T>(BitSize - Shift));
  196. }
  197. template<typename genIType>
  198. GLM_FUNC_QUALIFIER genIType bitfieldRotateLeft(genIType In, int Shift)
  199. {
  200. GLM_STATIC_ASSERT(std::numeric_limits<genIType>::is_integer, "'bitfieldRotateLeft' accepts only integer values");
  201. int const BitSize = static_cast<genIType>(sizeof(genIType) * 8);
  202. return (In >> static_cast<genIType>(Shift)) | (In << static_cast<genIType>(BitSize - Shift));
  203. }
  204. template<length_t L, typename T, qualifier Q>
  205. GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldRotateLeft(vec<L, T, Q> const& In, int Shift)
  206. {
  207. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitfieldRotateLeft' accepts only integer values");
  208. int const BitSize = static_cast<int>(sizeof(T) * 8);
  209. return (In >> static_cast<T>(Shift)) | (In << static_cast<T>(BitSize - Shift));
  210. }
  211. template<typename genIUType>
  212. GLM_FUNC_QUALIFIER genIUType bitfieldFillOne(genIUType Value, int FirstBit, int BitCount)
  213. {
  214. return Value | static_cast<genIUType>(mask(BitCount) << FirstBit);
  215. }
  216. template<length_t L, typename T, qualifier Q>
  217. GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldFillOne(vec<L, T, Q> const& Value, int FirstBit, int BitCount)
  218. {
  219. return Value | static_cast<T>(mask(BitCount) << FirstBit);
  220. }
  221. template<typename genIUType>
  222. GLM_FUNC_QUALIFIER genIUType bitfieldFillZero(genIUType Value, int FirstBit, int BitCount)
  223. {
  224. return Value & static_cast<genIUType>(~(mask(BitCount) << FirstBit));
  225. }
  226. template<length_t L, typename T, qualifier Q>
  227. GLM_FUNC_QUALIFIER vec<L, T, Q> bitfieldFillZero(vec<L, T, Q> const& Value, int FirstBit, int BitCount)
  228. {
  229. return Value & static_cast<T>(~(mask(BitCount) << FirstBit));
  230. }
  231. GLM_FUNC_QUALIFIER int16 bitfieldInterleave(int8 x, int8 y)
  232. {
  233. union sign8
  234. {
  235. int8 i;
  236. uint8 u;
  237. } sign_x, sign_y;
  238. union sign16
  239. {
  240. int16 i;
  241. uint16 u;
  242. } result;
  243. sign_x.i = x;
  244. sign_y.i = y;
  245. result.u = bitfieldInterleave(sign_x.u, sign_y.u);
  246. return result.i;
  247. }
  248. GLM_FUNC_QUALIFIER uint16 bitfieldInterleave(uint8 x, uint8 y)
  249. {
  250. return detail::bitfieldInterleave<uint8, uint16>(x, y);
  251. }
  252. GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int16 x, int16 y)
  253. {
  254. union sign16
  255. {
  256. int16 i;
  257. uint16 u;
  258. } sign_x, sign_y;
  259. union sign32
  260. {
  261. int32 i;
  262. uint32 u;
  263. } result;
  264. sign_x.i = x;
  265. sign_y.i = y;
  266. result.u = bitfieldInterleave(sign_x.u, sign_y.u);
  267. return result.i;
  268. }
  269. GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint16 x, uint16 y)
  270. {
  271. return detail::bitfieldInterleave<uint16, uint32>(x, y);
  272. }
  273. GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y)
  274. {
  275. union sign32
  276. {
  277. int32 i;
  278. uint32 u;
  279. } sign_x, sign_y;
  280. union sign64
  281. {
  282. int64 i;
  283. uint64 u;
  284. } result;
  285. sign_x.i = x;
  286. sign_y.i = y;
  287. result.u = bitfieldInterleave(sign_x.u, sign_y.u);
  288. return result.i;
  289. }
  290. GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y)
  291. {
  292. return detail::bitfieldInterleave<uint32, uint64>(x, y);
  293. }
  294. GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z)
  295. {
  296. union sign8
  297. {
  298. int8 i;
  299. uint8 u;
  300. } sign_x, sign_y, sign_z;
  301. union sign32
  302. {
  303. int32 i;
  304. uint32 u;
  305. } result;
  306. sign_x.i = x;
  307. sign_y.i = y;
  308. sign_z.i = z;
  309. result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);
  310. return result.i;
  311. }
  312. GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z)
  313. {
  314. return detail::bitfieldInterleave<uint8, uint32>(x, y, z);
  315. }
  316. GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z)
  317. {
  318. union sign16
  319. {
  320. int16 i;
  321. uint16 u;
  322. } sign_x, sign_y, sign_z;
  323. union sign64
  324. {
  325. int64 i;
  326. uint64 u;
  327. } result;
  328. sign_x.i = x;
  329. sign_y.i = y;
  330. sign_z.i = z;
  331. result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);
  332. return result.i;
  333. }
  334. GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z)
  335. {
  336. return detail::bitfieldInterleave<uint32, uint64>(x, y, z);
  337. }
  338. GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int32 x, int32 y, int32 z)
  339. {
  340. union sign16
  341. {
  342. int32 i;
  343. uint32 u;
  344. } sign_x, sign_y, sign_z;
  345. union sign64
  346. {
  347. int64 i;
  348. uint64 u;
  349. } result;
  350. sign_x.i = x;
  351. sign_y.i = y;
  352. sign_z.i = z;
  353. result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u);
  354. return result.i;
  355. }
  356. GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint32 x, uint32 y, uint32 z)
  357. {
  358. return detail::bitfieldInterleave<uint32, uint64>(x, y, z);
  359. }
  360. GLM_FUNC_QUALIFIER int32 bitfieldInterleave(int8 x, int8 y, int8 z, int8 w)
  361. {
  362. union sign8
  363. {
  364. int8 i;
  365. uint8 u;
  366. } sign_x, sign_y, sign_z, sign_w;
  367. union sign32
  368. {
  369. int32 i;
  370. uint32 u;
  371. } result;
  372. sign_x.i = x;
  373. sign_y.i = y;
  374. sign_z.i = z;
  375. sign_w.i = w;
  376. result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u);
  377. return result.i;
  378. }
  379. GLM_FUNC_QUALIFIER uint32 bitfieldInterleave(uint8 x, uint8 y, uint8 z, uint8 w)
  380. {
  381. return detail::bitfieldInterleave<uint8, uint32>(x, y, z, w);
  382. }
  383. GLM_FUNC_QUALIFIER int64 bitfieldInterleave(int16 x, int16 y, int16 z, int16 w)
  384. {
  385. union sign16
  386. {
  387. int16 i;
  388. uint16 u;
  389. } sign_x, sign_y, sign_z, sign_w;
  390. union sign64
  391. {
  392. int64 i;
  393. uint64 u;
  394. } result;
  395. sign_x.i = x;
  396. sign_y.i = y;
  397. sign_z.i = z;
  398. sign_w.i = w;
  399. result.u = bitfieldInterleave(sign_x.u, sign_y.u, sign_z.u, sign_w.u);
  400. return result.i;
  401. }
  402. GLM_FUNC_QUALIFIER uint64 bitfieldInterleave(uint16 x, uint16 y, uint16 z, uint16 w)
  403. {
  404. return detail::bitfieldInterleave<uint16, uint64>(x, y, z, w);
  405. }
  406. }//namespace glm