| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  | // Copyright 2009-2021 Intel Corporation
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | // SPDX-License-Identifier: Apache-2.0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "../sys/platform.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace embree | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* Varying numeric types */ | 
					
						
							|  |  |  |   template<int N> | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   struct vfloat_impl | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     union { float f[N]; int i[N]; }; | 
					
						
							|  |  |  |     __forceinline const float& operator [](size_t index) const { assert(index < N); return f[index]; } | 
					
						
							|  |  |  |     __forceinline       float& operator [](size_t index)       { assert(index < N); return f[index]; } | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2024-02-24 12:40:55 +01:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   template<int N> | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   struct vdouble_impl | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     union { double f[N]; long long i[N]; }; | 
					
						
							|  |  |  |     __forceinline const double& operator [](size_t index) const { assert(index < N); return f[index]; } | 
					
						
							|  |  |  |     __forceinline       double& operator [](size_t index)       { assert(index < N); return f[index]; } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<int N> | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   struct vint_impl | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     int i[N]; | 
					
						
							|  |  |  |     __forceinline const int& operator [](size_t index) const { assert(index < N); return i[index]; } | 
					
						
							|  |  |  |     __forceinline       int& operator [](size_t index)       { assert(index < N); return i[index]; } | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2024-02-24 12:40:55 +01:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   template<int N> | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   struct vuint_impl | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     unsigned int i[N]; | 
					
						
							|  |  |  |     __forceinline const unsigned int& operator [](size_t index) const { assert(index < N); return i[index]; } | 
					
						
							|  |  |  |     __forceinline       unsigned int& operator [](size_t index)       { assert(index < N); return i[index]; } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<int N> | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   struct vllong_impl | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     long long i[N]; | 
					
						
							|  |  |  |     __forceinline const long long& operator [](size_t index) const { assert(index < N); return i[index]; } | 
					
						
							|  |  |  |     __forceinline       long long& operator [](size_t index)       { assert(index < N); return i[index]; } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Varying bool types */ | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   template<int N> struct vboolf_impl { int       i[N]; }; // for float/int
 | 
					
						
							|  |  |  |   template<int N> struct vboold_impl { long long i[N]; }; // for double/long long
 | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   /* Varying size constants */ | 
					
						
							|  |  |  | #if defined(__AVX512VL__) // SKX
 | 
					
						
							|  |  |  |   const int VSIZEX = 8;  // default size
 | 
					
						
							|  |  |  |   const int VSIZEL = 16; // large size
 | 
					
						
							|  |  |  | #elif defined(__AVX__)
 | 
					
						
							|  |  |  |   const int VSIZEX = 8; | 
					
						
							|  |  |  |   const int VSIZEL = 8; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   const int VSIZEX = 4; | 
					
						
							|  |  |  |   const int VSIZEL = 4; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   template<int N> | 
					
						
							|  |  |  |   struct vtypes { | 
					
						
							|  |  |  |     using vbool = vboolf_impl<N>; | 
					
						
							|  |  |  |     using vboolf = vboolf_impl<N>; | 
					
						
							|  |  |  |     using vboold = vboold_impl<N>; | 
					
						
							|  |  |  |     using vint = vint_impl<N>; | 
					
						
							|  |  |  |     using vuint = vuint_impl<N>; | 
					
						
							|  |  |  |     using vllong = vllong_impl<N>; | 
					
						
							|  |  |  |     using vfloat = vfloat_impl<N>; | 
					
						
							|  |  |  |     using vdouble = vdouble_impl<N>; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template<> | 
					
						
							|  |  |  |   struct vtypes<1> { | 
					
						
							|  |  |  |     using vbool = bool; | 
					
						
							|  |  |  |     using vboolf = bool; | 
					
						
							|  |  |  |     using vboold = bool; | 
					
						
							|  |  |  |     using vint = int; | 
					
						
							|  |  |  |     using vuint = unsigned int; | 
					
						
							|  |  |  |     using vllong = long long; | 
					
						
							|  |  |  |     using vfloat = float; | 
					
						
							|  |  |  |     using vdouble = double; | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |   /* Aliases to default types */ | 
					
						
							|  |  |  |   template<int N> using vbool = typename vtypes<N>::vbool; | 
					
						
							|  |  |  |   template<int N> using vboolf = typename vtypes<N>::vboolf; | 
					
						
							|  |  |  |   template<int N> using vboold = typename vtypes<N>::vboold; | 
					
						
							|  |  |  |   template<int N> using vint = typename vtypes<N>::vint; | 
					
						
							|  |  |  |   template<int N> using vuint = typename vtypes<N>::vuint; | 
					
						
							|  |  |  |   template<int N> using vllong = typename vtypes<N>::vllong; | 
					
						
							|  |  |  |   template<int N> using vreal = typename vtypes<N>::vfloat; | 
					
						
							|  |  |  |   template<int N> using vfloat = typename vtypes<N>::vfloat; | 
					
						
							|  |  |  |   template<int N> using vdouble = typename vtypes<N>::vdouble; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |   /* 4-wide shortcuts */ | 
					
						
							|  |  |  |   typedef vfloat<4>  vfloat4; | 
					
						
							|  |  |  |   typedef vdouble<4> vdouble4; | 
					
						
							|  |  |  |   typedef vreal<4>   vreal4; | 
					
						
							|  |  |  |   typedef vint<4>    vint4; | 
					
						
							|  |  |  |   typedef vuint<4>  vuint4; | 
					
						
							|  |  |  |   typedef vllong<4>  vllong4; | 
					
						
							|  |  |  |   typedef vbool<4>   vbool4; | 
					
						
							|  |  |  |   typedef vboolf<4>  vboolf4; | 
					
						
							|  |  |  |   typedef vboold<4>  vboold4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* 8-wide shortcuts */ | 
					
						
							|  |  |  |   typedef vfloat<8>  vfloat8; | 
					
						
							|  |  |  |   typedef vdouble<8> vdouble8; | 
					
						
							|  |  |  |   typedef vreal<8>   vreal8; | 
					
						
							|  |  |  |   typedef vint<8>    vint8; | 
					
						
							|  |  |  |   typedef vuint<8>    vuint8; | 
					
						
							|  |  |  |   typedef vllong<8>  vllong8; | 
					
						
							|  |  |  |   typedef vbool<8>   vbool8; | 
					
						
							|  |  |  |   typedef vboolf<8>  vboolf8; | 
					
						
							|  |  |  |   typedef vboold<8>  vboold8; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* 16-wide shortcuts */ | 
					
						
							|  |  |  |   typedef vfloat<16>  vfloat16; | 
					
						
							|  |  |  |   typedef vdouble<16> vdouble16; | 
					
						
							|  |  |  |   typedef vreal<16>   vreal16; | 
					
						
							|  |  |  |   typedef vint<16>    vint16; | 
					
						
							|  |  |  |   typedef vuint<16>   vuint16; | 
					
						
							|  |  |  |   typedef vllong<16>  vllong16; | 
					
						
							|  |  |  |   typedef vbool<16>   vbool16; | 
					
						
							|  |  |  |   typedef vboolf<16>  vboolf16; | 
					
						
							|  |  |  |   typedef vboold<16>  vboold16; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Default shortcuts */ | 
					
						
							|  |  |  |   typedef vfloat<VSIZEX>  vfloatx; | 
					
						
							|  |  |  |   typedef vdouble<VSIZEX> vdoublex; | 
					
						
							|  |  |  |   typedef vreal<VSIZEX>   vrealx; | 
					
						
							|  |  |  |   typedef vint<VSIZEX>    vintx; | 
					
						
							|  |  |  |   typedef vuint<VSIZEX>   vuintx; | 
					
						
							|  |  |  |   typedef vllong<VSIZEX>  vllongx; | 
					
						
							|  |  |  |   typedef vbool<VSIZEX>   vboolx; | 
					
						
							|  |  |  |   typedef vboolf<VSIZEX>  vboolfx; | 
					
						
							|  |  |  |   typedef vboold<VSIZEX>  vbooldx; | 
					
						
							|  |  |  | } |