varying.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "../sys/platform.h"
  5. namespace embree
  6. {
  7. /* Varying numeric types */
  8. template<int N>
  9. struct vfloat_impl
  10. {
  11. union { float f[N]; int i[N]; };
  12. __forceinline const float& operator [](size_t index) const { assert(index < N); return f[index]; }
  13. __forceinline float& operator [](size_t index) { assert(index < N); return f[index]; }
  14. };
  15. template<int N>
  16. struct vdouble_impl
  17. {
  18. union { double f[N]; long long i[N]; };
  19. __forceinline const double& operator [](size_t index) const { assert(index < N); return f[index]; }
  20. __forceinline double& operator [](size_t index) { assert(index < N); return f[index]; }
  21. };
  22. template<int N>
  23. struct vint_impl
  24. {
  25. int i[N];
  26. __forceinline const int& operator [](size_t index) const { assert(index < N); return i[index]; }
  27. __forceinline int& operator [](size_t index) { assert(index < N); return i[index]; }
  28. };
  29. template<int N>
  30. struct vuint_impl
  31. {
  32. unsigned int i[N];
  33. __forceinline const unsigned int& operator [](size_t index) const { assert(index < N); return i[index]; }
  34. __forceinline unsigned int& operator [](size_t index) { assert(index < N); return i[index]; }
  35. };
  36. template<int N>
  37. struct vllong_impl
  38. {
  39. long long i[N];
  40. __forceinline const long long& operator [](size_t index) const { assert(index < N); return i[index]; }
  41. __forceinline long long& operator [](size_t index) { assert(index < N); return i[index]; }
  42. };
  43. /* Varying bool types */
  44. template<int N> struct vboolf_impl { int i[N]; }; // for float/int
  45. template<int N> struct vboold_impl { long long i[N]; }; // for double/long long
  46. /* Varying size constants */
  47. #if defined(__AVX512VL__) // SKX
  48. const int VSIZEX = 8; // default size
  49. const int VSIZEL = 16; // large size
  50. #elif defined(__AVX__)
  51. const int VSIZEX = 8;
  52. const int VSIZEL = 8;
  53. #else
  54. const int VSIZEX = 4;
  55. const int VSIZEL = 4;
  56. #endif
  57. template<int N>
  58. struct vtypes {
  59. using vbool = vboolf_impl<N>;
  60. using vboolf = vboolf_impl<N>;
  61. using vboold = vboold_impl<N>;
  62. using vint = vint_impl<N>;
  63. using vuint = vuint_impl<N>;
  64. using vllong = vllong_impl<N>;
  65. using vfloat = vfloat_impl<N>;
  66. using vdouble = vdouble_impl<N>;
  67. };
  68. template<>
  69. struct vtypes<1> {
  70. using vbool = bool;
  71. using vboolf = bool;
  72. using vboold = bool;
  73. using vint = int;
  74. using vuint = unsigned int;
  75. using vllong = long long;
  76. using vfloat = float;
  77. using vdouble = double;
  78. };
  79. /* Aliases to default types */
  80. template<int N> using vbool = typename vtypes<N>::vbool;
  81. template<int N> using vboolf = typename vtypes<N>::vboolf;
  82. template<int N> using vboold = typename vtypes<N>::vboold;
  83. template<int N> using vint = typename vtypes<N>::vint;
  84. template<int N> using vuint = typename vtypes<N>::vuint;
  85. template<int N> using vllong = typename vtypes<N>::vllong;
  86. template<int N> using vreal = typename vtypes<N>::vfloat;
  87. template<int N> using vfloat = typename vtypes<N>::vfloat;
  88. template<int N> using vdouble = typename vtypes<N>::vdouble;
  89. /* 4-wide shortcuts */
  90. typedef vfloat<4> vfloat4;
  91. typedef vdouble<4> vdouble4;
  92. typedef vreal<4> vreal4;
  93. typedef vint<4> vint4;
  94. typedef vuint<4> vuint4;
  95. typedef vllong<4> vllong4;
  96. typedef vbool<4> vbool4;
  97. typedef vboolf<4> vboolf4;
  98. typedef vboold<4> vboold4;
  99. /* 8-wide shortcuts */
  100. typedef vfloat<8> vfloat8;
  101. typedef vdouble<8> vdouble8;
  102. typedef vreal<8> vreal8;
  103. typedef vint<8> vint8;
  104. typedef vuint<8> vuint8;
  105. typedef vllong<8> vllong8;
  106. typedef vbool<8> vbool8;
  107. typedef vboolf<8> vboolf8;
  108. typedef vboold<8> vboold8;
  109. /* 16-wide shortcuts */
  110. typedef vfloat<16> vfloat16;
  111. typedef vdouble<16> vdouble16;
  112. typedef vreal<16> vreal16;
  113. typedef vint<16> vint16;
  114. typedef vuint<16> vuint16;
  115. typedef vllong<16> vllong16;
  116. typedef vbool<16> vbool16;
  117. typedef vboolf<16> vboolf16;
  118. typedef vboold<16> vboold16;
  119. /* Default shortcuts */
  120. typedef vfloat<VSIZEX> vfloatx;
  121. typedef vdouble<VSIZEX> vdoublex;
  122. typedef vreal<VSIZEX> vrealx;
  123. typedef vint<VSIZEX> vintx;
  124. typedef vuint<VSIZEX> vuintx;
  125. typedef vllong<VSIZEX> vllongx;
  126. typedef vbool<VSIZEX> vboolx;
  127. typedef vboolf<VSIZEX> vboolfx;
  128. typedef vboold<VSIZEX> vbooldx;
  129. }