#pragma once
#include "emath.h"
#include "vec3.h"
namespace embree
{
template<typename T> struct Vec4
{ … };
template<typename T> __forceinline Vec4<T> operator +( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> operator -( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> abs ( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> rcp ( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> rsqrt ( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> sqrt ( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> operator +( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> operator -( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> operator *( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> operator *( const T& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> operator *( const Vec4<T>& a, const T& b ) { … }
template<typename T> __forceinline Vec4<T> operator /( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> operator /( const Vec4<T>& a, const T& b ) { … }
template<typename T> __forceinline Vec4<T> operator /( const T& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> min(const Vec4<T>& a, const Vec4<T>& b) { … }
template<typename T> __forceinline Vec4<T> max(const Vec4<T>& a, const Vec4<T>& b) { … }
template<typename T> __forceinline Vec4<T> madd ( const Vec4<T>& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> msub ( const Vec4<T>& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> nmadd ( const Vec4<T>& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> nmsub ( const Vec4<T>& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> madd ( const T& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> msub ( const T& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> nmadd ( const T& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T> nmsub ( const T& a, const Vec4<T>& b, const Vec4<T>& c) { … }
template<typename T> __forceinline Vec4<T>& operator +=( Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T>& operator -=( Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T>& operator *=( Vec4<T>& a, const T& b ) { … }
template<typename T> __forceinline Vec4<T>& operator /=( Vec4<T>& a, const T& b ) { … }
template<typename T> __forceinline T reduce_add( const Vec4<T>& a ) { … }
template<typename T> __forceinline T reduce_mul( const Vec4<T>& a ) { … }
template<typename T> __forceinline T reduce_min( const Vec4<T>& a ) { … }
template<typename T> __forceinline T reduce_max( const Vec4<T>& a ) { … }
template<typename T> __forceinline bool operator ==( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline bool operator !=( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline bool operator < ( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> shift_right_1( const Vec4<T>& a ) { … }
template<typename T> __forceinline T dot ( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline T length ( const Vec4<T>& a ) { … }
template<typename T> __forceinline Vec4<T> normalize( const Vec4<T>& a ) { … }
template<typename T> __forceinline T distance ( const Vec4<T>& a, const Vec4<T>& b ) { … }
template<typename T> __forceinline Vec4<T> select ( bool s, const Vec4<T>& t, const Vec4<T>& f ) { … }
template<typename T> __forceinline Vec4<T> select ( const Vec4<bool>& s, const Vec4<T>& t, const Vec4<T>& f ) { … }
template<typename T> __forceinline Vec4<T> select ( const typename T::Bool& s, const Vec4<T>& t, const Vec4<T>& f ) { … }
template<typename T>
__forceinline Vec4<T> lerp(const Vec4<T>& v0, const Vec4<T>& v1, const T& t) { … }
template<typename T> __forceinline embree_ostream operator<<(embree_ostream cout, const Vec4<T>& a) { … }
Vec4b;
Vec4uc;
Vec4i;
Vec4f;
}
#include "vec3ba.h"
#include "vec3ia.h"
#include "vec3fa.h"
#if defined(__SSE__) || defined(__ARM_NEON)
#include "../simd/sse.h"
#endif
#if defined __AVX__
#include "../simd/avx.h"
#endif
#if defined __AVX512F__
#include "../simd/avx512.h"
#endif
namespace embree
{
template<> __forceinline Vec4<float>::Vec4( const Vec3fx& a ) { … }
#if !defined(__SYCL_DEVICE_ONLY__)
#if defined(__AVX__)
template<> __forceinline Vec4<vfloat4>::Vec4( const Vec3fx& a ) {
x = a.x; y = a.y; z = a.z; w = a.w;
}
#elif defined(__SSE__) || defined(__ARM_NEON)
template<> __forceinline Vec4<vfloat4>::Vec4( const Vec3fx& a ) { … }
#endif
#if defined(__AVX__)
template<> __forceinline Vec4<vfloat8>::Vec4( const Vec3fx& a ) {
x = a.x; y = a.y; z = a.z; w = a.w;
}
#endif
#if defined(__AVX512F__)
template<> __forceinline Vec4<vfloat16>::Vec4( const Vec3fx& a ) : x(a.x), y(a.y), z(a.z), w(a.w) {}
#endif
#else
#if defined(__SSE__)
template<> __forceinline Vec4<vfloat4>::Vec4(const Vec3fx& a) {
x = a.x; y = a.y; z = a.z; w = a.w;
}
#endif
#if defined(__AVX__)
template<> __forceinline Vec4<vfloat8>::Vec4(const Vec3fx& a) {
x = a.x; y = a.y; z = a.z; w = a.w;
}
#endif
#if defined(__AVX512F__)
template<> __forceinline Vec4<vfloat16>::Vec4(const Vec3fx& a) {
x = a.x; y = a.y; z = a.z; w = a.w;
}
#endif
#endif
}