-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeatureSupportARM.cpp
More file actions
60 lines (54 loc) · 1.11 KB
/
featureSupportARM.cpp
File metadata and controls
60 lines (54 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#if defined(__arm__) || defined(_M_ARM) || defined(__aarch64__)
#include "featureSupport.h"
#include <unistd.h>
#include <sys/auxv.h>
#include <fcntl.h>
#include <iostream>
unsigned int getAuxv()
{
Elf32_auxv_t auxv;
int cpufile = open("/proc/self/auxv", O_RDONLY);
if (cpufile >= 0)
{
const size_t size_auxv_t = sizeof(auxv);
while ((size_t)read(cpufile, &auxv, size_auxv_t) == size_auxv_t)
{
if (auxv.a_type == AT_HWCAP)
{
return auxv.a_un.a_val;
}
}
}
}
bool hasNeonSupport()
{
#if defined(__arm__) || defined(_M_ARM)
return getAuxv() & HWCAP_ARM_NEON;
#elif defined(__aarch64__)
return true;
#endif
}
bool hasF16cSupport()
{
#if defined(__arm__) || defined(_M_ARM)
return getAuxv() & HWCAP_ARM_HALF;
#elif defined(__aarch64__)
return true;
#endif
}
bool checkFeatureSupport()
{
bool hasEnoughSupport = true;
if (hasF16cSupport() == false)
{
std::cerr << "Processor has no fp16 support" << std::endl;
hasEnoughSupport = false;
}
if (hasNeonSupport() == false)
{
std::cerr << "Processor has no NEON support" << std::endl;
hasEnoughSupport = false;
}
return hasEnoughSupport;
}
#endif