2018-12-07 17:16:50 -08:00
|
|
|
#pragma once
|
|
|
|
#define _ZEUS_SIMD_INCLUDED
|
2018-12-07 21:23:50 -08:00
|
|
|
namespace zeus::_simd {
|
|
|
|
using namespace std;
|
|
|
|
}
|
2018-12-07 17:16:50 -08:00
|
|
|
#include "parallelism_v2_simd.hpp"
|
|
|
|
#if _M_IX86_FP >= 1 || _M_X64
|
|
|
|
#define __SSE__ 1
|
|
|
|
#endif
|
|
|
|
#if __AVX__
|
|
|
|
#include "simd_avx.hpp"
|
|
|
|
#elif __SSE__
|
|
|
|
#include "simd_sse.hpp"
|
|
|
|
#else
|
|
|
|
namespace simd_abi {
|
2018-12-07 21:23:50 -08:00
|
|
|
template <typename T>
|
|
|
|
struct zeus_native {};
|
|
|
|
template <>
|
|
|
|
struct zeus_native<float> {
|
|
|
|
using type = fixed_size<4>;
|
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct zeus_native<double> {
|
|
|
|
using type = fixed_size<4>;
|
|
|
|
};
|
|
|
|
} // namespace simd_abi
|
2018-12-07 17:16:50 -08:00
|
|
|
#endif
|
|
|
|
namespace zeus {
|
2018-12-07 21:23:50 -08:00
|
|
|
template <typename T>
|
|
|
|
using simd = _simd::simd<T, typename _simd::simd_abi::zeus_native<T>::type>;
|
|
|
|
template <typename T>
|
2018-12-07 17:16:50 -08:00
|
|
|
using simd_values = _simd::simd_data<simd<T>>;
|
|
|
|
using simd_floats = simd_values<float>;
|
|
|
|
using simd_doubles = simd_values<double>;
|
2018-12-07 21:23:50 -08:00
|
|
|
} // namespace zeus
|