Argon 0.1.0
Loading...
Searching...
No Matches
features.h
Go to the documentation of this file.
1#pragma once
2#include <stdbool.h>
3
6
7namespace argon {
8enum class Platform {
9 NEON,
10 MVE,
11 SIMDe,
12};
13}
14
15#ifdef __ARM_NEON
16namespace argon {
17constexpr Platform platform = Platform::NEON;
18}
19#define ARGON_PLATFORM_NEON true
20#define ARGON_HAS_FLOAT true
21
22#if (__ARM_ARCH >= 8)
23
24#if (__arm__) // A32
25
26#define ARGON_HAS_HALF_FLOAT true
27#define ARGON_HAS_SINGLE_FLOAT true
28#define ARGON_HAS_DOUBLE_FLOAT false
29
30#elif (__aarch64__) // A64
31
32#define ARGON_HAS_HALF_FLOAT true
33#define ARGON_HAS_SINGLE_FLOAT true
34#define ARGON_HAS_DOUBLE_FLOAT true
35
36#endif
37
38#else
39
40#define ARGON_HAS_HALF_FLOAT (__ARM_NEON_FP & 2)
41#define ARGON_HAS_SINGLE_FLOAT (__ARM_NEON_FP & 4)
42#define ARGON_HAS_DOUBLE_FLOAT (__ARM_NEON_FP & 8)
43
44#endif
45
46#elifdef __ARM_FEATURE_MVE
47namespace argon {
48constexpr Platform platform = Platform::MVE;
49}
50#define ARGON_PLATFORM_MVE true
51
52#if (__ARM_FEATURE_MVE & 2)
53#define ARGON_HAS_FLOAT true
54#define ARGON_HAS_HALF_FLOAT true
55#define ARGON_HAS_SINGLE_FLOAT true
56#else
57#define ARGON_HAS_FLOAT false
58#define ARGON_HAS_HALF_FLOAT false
59#define ARGON_HAS_SINGLE_FLOAT false
60#endif
61
62#else
63namespace argon {
64constexpr Platform platform = Platform::SIMDe;
65}
66#define ARGON_PLATFORM_SIMDE true
67#define ARGON_HAS_FLOAT true
68#define ARGON_HAS_HALF_FLOAT false
69#define ARGON_HAS_SINGLE_FLOAT true
70#define ARGON_HAS_DOUBLE_FLOAT false
71#endif
72
73#ifndef ARGON_USE_COMPILER_EXTENSIONS
74#if !defined(_MSC_VER) || defined(__clang__)
75#define ARGON_USE_COMPILER_EXTENSIONS 1
76#else
77#define ARGON_USE_COMPILER_EXTENSIONS 0
78#endif
79#endif
80
81/*
82#define XSTR(x) STR(x)
83#define STR(x) #x
84#pragma message "DWORD: " XSTR(ARGON_HAS_DWORD)
85#pragma message "SINGLE_FLOAT: " XSTR(ARGON_HAS_SINGLE_FLOAT)
86#pragma message "HALF_FLOAT: " XSTR(ARGON_HAS_HALF_FLOAT)
87#pragma message "DOUBLE_FLOAT: " XSTR(ARGON_HAS_DOUBLE_FLOAT)
88#pragma message "__ARM_NEON: " XSTR(__ARM_NEON)
89#pragma message "__ARM_NEON_FP: " XSTR(__ARM_NEON_FP)
90#pragma message "__ARM_FP: " XSTR(__ARM_FP)
91*/