ruapu_rua() returns all supported features (#52)
This commit is contained in:
parent
884debca87
commit
8d3ffb0e60
@ -20,6 +20,14 @@ int main()
|
|||||||
// now, tell me if this cpu has avx2
|
// now, tell me if this cpu has avx2
|
||||||
int has_avx2 = ruapu_supports("avx2");
|
int has_avx2 = ruapu_supports("avx2");
|
||||||
|
|
||||||
|
// loop all supported features
|
||||||
|
const char* const* supported = ruapu_rua();
|
||||||
|
while (*supported)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s\n", *supported);
|
||||||
|
supported++;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
7
main.c
7
main.c
@ -113,5 +113,12 @@ int main()
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char* const* supported = ruapu_rua();
|
||||||
|
while (*supported)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s\n", *supported);
|
||||||
|
supported++;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
41
ruapu.h
41
ruapu.h
@ -15,6 +15,8 @@ void ruapu_init();
|
|||||||
|
|
||||||
int ruapu_supports(const char* isa);
|
int ruapu_supports(const char* isa);
|
||||||
|
|
||||||
|
const char* const* ruapu_rua();
|
||||||
|
|
||||||
#ifdef RUAPU_IMPLEMENTATION
|
#ifdef RUAPU_IMPLEMENTATION
|
||||||
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
@ -261,10 +263,9 @@ struct ruapu_isa_entry
|
|||||||
{
|
{
|
||||||
const char* isa;
|
const char* isa;
|
||||||
ruapu_some_inst inst;
|
ruapu_some_inst inst;
|
||||||
int capable;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RUAPU_ISAENTRY(isa) { #isa, (ruapu_some_inst)ruapu_some_##isa, 0 },
|
#define RUAPU_ISAENTRY(isa) { #isa, (ruapu_some_inst)ruapu_some_##isa },
|
||||||
|
|
||||||
struct ruapu_isa_entry g_ruapu_isa_map[] = {
|
struct ruapu_isa_entry g_ruapu_isa_map[] = {
|
||||||
|
|
||||||
@ -370,26 +371,42 @@ RUAPU_ISAENTRY(orvdx64)
|
|||||||
|
|
||||||
#undef RUAPU_ISAENTRY
|
#undef RUAPU_ISAENTRY
|
||||||
|
|
||||||
|
const char* g_ruapu_isa_supported[sizeof(g_ruapu_isa_map) / sizeof(g_ruapu_isa_map[0]) + 1] = { 0 };
|
||||||
|
|
||||||
#if defined __openrisc__
|
#if defined __openrisc__
|
||||||
static void ruapu_detect_openrisc_isa()
|
static void ruapu_detect_openrisc_isa()
|
||||||
{
|
{
|
||||||
uint32_t value;
|
uint32_t value;
|
||||||
uint16_t addr = U(0x0000);
|
uint16_t addr = U(0x0000);
|
||||||
asm volatile ("l.mfspr %0, r0, %1" : "=r" (value) : "K" (addr));
|
asm volatile ("l.mfspr %0, r0, %1" : "=r" (value) : "K" (addr));
|
||||||
|
size_t j = 0;
|
||||||
for (size_t i = 0; i < sizeof(g_ruapu_isa_map) / sizeof(g_ruapu_isa_map[0]); i++)
|
for (size_t i = 0; i < sizeof(g_ruapu_isa_map) / sizeof(g_ruapu_isa_map[0]); i++)
|
||||||
{
|
{
|
||||||
g_ruapu_isa_map[0].capable = ((value) >> (5 + i)) & 0x1;
|
int capable = ((value) >> (5 + i)) & 0x1;
|
||||||
|
if (capable)
|
||||||
|
{
|
||||||
|
g_ruapu_isa_supported[j] = g_ruapu_isa_map[i].isa;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
g_ruapu_isa_supported[j] = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ruapu_init()
|
void ruapu_init()
|
||||||
{
|
{
|
||||||
#if defined _WIN32 || defined __ANDROID__ || defined __linux__ || defined __APPLE__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
|
#if defined _WIN32 || defined __ANDROID__ || defined __linux__ || defined __APPLE__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
|
||||||
|
size_t j = 0;
|
||||||
for (size_t i = 0; i < sizeof(g_ruapu_isa_map) / sizeof(g_ruapu_isa_map[0]); i++)
|
for (size_t i = 0; i < sizeof(g_ruapu_isa_map) / sizeof(g_ruapu_isa_map[0]); i++)
|
||||||
{
|
{
|
||||||
g_ruapu_isa_map[i].capable = ruapu_detect_isa(g_ruapu_isa_map[i].inst);
|
int capable = ruapu_detect_isa(g_ruapu_isa_map[i].inst);
|
||||||
|
if (capable)
|
||||||
|
{
|
||||||
|
g_ruapu_isa_supported[j] = g_ruapu_isa_map[i].isa;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
g_ruapu_isa_supported[j] = 0;
|
||||||
#elif defined __openrisc__
|
#elif defined __openrisc__
|
||||||
ruapu_detect_openrisc_isa();
|
ruapu_detect_openrisc_isa();
|
||||||
#else
|
#else
|
||||||
@ -402,17 +419,23 @@ void ruapu_init()
|
|||||||
|
|
||||||
int ruapu_supports(const char* isa)
|
int ruapu_supports(const char* isa)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < sizeof(g_ruapu_isa_map) / sizeof(g_ruapu_isa_map[0]); i++)
|
const char* const* isa_supported = g_ruapu_isa_supported;
|
||||||
|
while (*isa_supported)
|
||||||
{
|
{
|
||||||
if (strcmp(g_ruapu_isa_map[i].isa, isa) == 0)
|
if (strcmp(*isa_supported, isa) == 0)
|
||||||
{
|
return 1;
|
||||||
return g_ruapu_isa_map[i].capable;
|
|
||||||
}
|
isa_supported++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* const* ruapu_rua()
|
||||||
|
{
|
||||||
|
return g_ruapu_isa_supported;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // RUAPU_IMPLEMENTATION
|
#endif // RUAPU_IMPLEMENTATION
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
Loading…
Reference in New Issue
Block a user