ruapu_rua() returns all supported features (#52)

This commit is contained in:
nihui 2024-02-28 22:44:21 +08:00 committed by GitHub
parent 884debca87
commit 8d3ffb0e60
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 9 deletions

View File

@ -20,6 +20,14 @@ int main()
// now, tell me if this cpu has 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;
}
```

7
main.c
View File

@ -113,5 +113,12 @@ int main()
#endif
const char* const* supported = ruapu_rua();
while (*supported)
{
fprintf(stderr, "%s\n", *supported);
supported++;
}
return 0;
}

41
ruapu.h
View File

@ -15,6 +15,8 @@ void ruapu_init();
int ruapu_supports(const char* isa);
const char* const* ruapu_rua();
#ifdef RUAPU_IMPLEMENTATION
#include <setjmp.h>
@ -261,10 +263,9 @@ struct ruapu_isa_entry
{
const char* isa;
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[] = {
@ -370,26 +371,42 @@ RUAPU_ISAENTRY(orvdx64)
#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__
static void ruapu_detect_openrisc_isa()
{
uint32_t value;
uint16_t addr = U(0x0000);
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++)
{
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
void ruapu_init()
{
#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++)
{
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__
ruapu_detect_openrisc_isa();
#else
@ -402,17 +419,23 @@ void ruapu_init()
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)
{
return g_ruapu_isa_map[i].capable;
}
if (strcmp(*isa_supported, isa) == 0)
return 1;
isa_supported++;
}
return 0;
}
const char* const* ruapu_rua()
{
return g_ruapu_isa_supported;
}
#endif // RUAPU_IMPLEMENTATION
#ifdef __cplusplus