FastSIMD.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #pragma once
  2. #include "FastSIMD_Config.h"
  3. namespace FastSIMD
  4. {
  5. typedef uint32_t Level_BitFlags;
  6. enum eLevel : Level_BitFlags
  7. {
  8. Level_Null = 0, // Uninitilised
  9. Level_Scalar = 1 << 0, // 80386 instruction set (Not SIMD)
  10. Level_SSE = 1 << 1, // SSE (XMM) supported by CPU (not testing for O.S. support)
  11. Level_SSE2 = 1 << 2, // SSE2
  12. Level_SSE3 = 1 << 3, // SSE3
  13. Level_SSSE3 = 1 << 4, // Supplementary SSE3 (SSSE3)
  14. Level_SSE41 = 1 << 5, // SSE4.1
  15. Level_SSE42 = 1 << 6, // SSE4.2
  16. Level_AVX = 1 << 7, // AVX supported by CPU and operating system
  17. Level_AVX2 = 1 << 8, // AVX2
  18. Level_AVX512 = 1 << 9, // AVX512, AVX512DQ supported by CPU and operating system
  19. Level_NEON = 1 << 16, // ARM NEON
  20. };
  21. const Level_BitFlags COMPILED_SIMD_LEVELS =
  22. (FASTSIMD_COMPILE_SCALAR ? Level_Scalar : 0) |
  23. (FASTSIMD_COMPILE_SSE ? Level_SSE : 0) |
  24. (FASTSIMD_COMPILE_SSE2 ? Level_SSE2 : 0) |
  25. (FASTSIMD_COMPILE_SSE3 ? Level_SSE3 : 0) |
  26. (FASTSIMD_COMPILE_SSSE3 ? Level_SSSE3 : 0) |
  27. (FASTSIMD_COMPILE_SSE41 ? Level_SSE41 : 0) |
  28. (FASTSIMD_COMPILE_SSE42 ? Level_SSE42 : 0) |
  29. (FASTSIMD_COMPILE_AVX ? Level_AVX : 0) |
  30. (FASTSIMD_COMPILE_AVX2 ? Level_AVX2 : 0) |
  31. (FASTSIMD_COMPILE_AVX512 ? Level_AVX512 : 0) |
  32. (FASTSIMD_COMPILE_NEON ? Level_NEON : 0) ;
  33. typedef void* (*MemoryAllocator)( size_t size, size_t align );
  34. FASTSIMD_API eLevel CPUMaxSIMDLevel();
  35. template<typename T>
  36. T* New( eLevel maxSIMDLevel = Level_Null, MemoryAllocator allocator = nullptr );
  37. template<typename T, eLevel SIMD_LEVEL>
  38. T* ClassFactory( MemoryAllocator allocator = nullptr );
  39. #define FASTSIMD_LEVEL_SUPPORT( ... ) \
  40. static const FastSIMD::Level_BitFlags Supported_SIMD_Levels = __VA_ARGS__
  41. }