diff --git a/libretro-common/features/features_cpu.c b/libretro-common/features/features_cpu.c index 5b4595b055..187054905a 100644 --- a/libretro-common/features/features_cpu.c +++ b/libretro-common/features/features_cpu.c @@ -590,7 +590,6 @@ uint64_t cpu_features_get(void) int flags[4]; int vendor_shuffle[3]; char vendor[13]; - size_t len = 0; uint64_t cpu_flags = 0; uint64_t cpu = 0; unsigned max_flag = 0; @@ -598,20 +597,9 @@ uint64_t cpu_features_get(void) int vendor_is_intel = 0; const int avx_flags = (1 << 27) | (1 << 28); #endif - - char buf[sizeof(" MMX MMXEXT SSE SSE2 SSE3 SSSE3 SS4 SSE4.2 AES AVX AVX2 NEON VMX VMX128 VFPU PS")]; - - memset(buf, 0, sizeof(buf)); - - (void)len; - (void)cpu_flags; - (void)flags; - (void)max_flag; - (void)vendor; - (void)vendor_shuffle; - + size_t written = 0; #if defined(__MACH__) - len = sizeof(size_t); + size_t len = sizeof(size_t); if (sysctlbyname("hw.optional.mmx", NULL, &len, NULL, 0) == 0) { cpu |= RETRO_SIMD_MMX; @@ -673,8 +661,6 @@ uint64_t cpu_features_get(void) cpu |= RETRO_SIMD_SSE; cpu |= RETRO_SIMD_MMXEXT; #elif defined(CPU_X86) - (void)avx_flags; - x86_cpuid(0, flags); vendor_shuffle[0] = flags[1]; vendor_shuffle[1] = flags[3]; @@ -806,26 +792,6 @@ uint64_t cpu_features_get(void) cpu |= RETRO_SIMD_PS; #endif - if (cpu & RETRO_SIMD_MMX) strlcat(buf, " MMX", sizeof(buf)); - if (cpu & RETRO_SIMD_MMXEXT) strlcat(buf, " MMXEXT", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE) strlcat(buf, " SSE", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE2) strlcat(buf, " SSE2", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE3) strlcat(buf, " SSE3", sizeof(buf)); - if (cpu & RETRO_SIMD_SSSE3) strlcat(buf, " SSSE3", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE4) strlcat(buf, " SSE4", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE42) strlcat(buf, " SSE4.2", sizeof(buf)); - if (cpu & RETRO_SIMD_AES) strlcat(buf, " AES", sizeof(buf)); - if (cpu & RETRO_SIMD_AVX) strlcat(buf, " AVX", sizeof(buf)); - if (cpu & RETRO_SIMD_AVX2) strlcat(buf, " AVX2", sizeof(buf)); - if (cpu & RETRO_SIMD_NEON) strlcat(buf, " NEON", sizeof(buf)); - if (cpu & RETRO_SIMD_VFPV3) strlcat(buf, " VFPv3", sizeof(buf)); - if (cpu & RETRO_SIMD_VFPV4) strlcat(buf, " VFPv4", sizeof(buf)); - if (cpu & RETRO_SIMD_VMX) strlcat(buf, " VMX", sizeof(buf)); - if (cpu & RETRO_SIMD_VMX128) strlcat(buf, " VMX128", sizeof(buf)); - if (cpu & RETRO_SIMD_VFPU) strlcat(buf, " VFPU", sizeof(buf)); - if (cpu & RETRO_SIMD_PS) strlcat(buf, " PS", sizeof(buf)); - if (cpu & RETRO_SIMD_ASIMD) strlcat(buf, " ASIMD", sizeof(buf)); - return cpu; } diff --git a/retroarch.c b/retroarch.c index 9e0e870705..9f5ed09855 100644 --- a/retroarch.c +++ b/retroarch.c @@ -23640,46 +23640,165 @@ int retroarch_get_capabilities(enum rarch_capabilities type, { case RARCH_CAPABILITIES_CPU: { - uint64_t cpu = cpu_features_get(); + unsigned written = strlen(s); + uint64_t cpu = cpu_features_get(); if (cpu & RETRO_SIMD_MMX) - strlcat(s, "MMX ", len); + { + s[written++] = ' '; + s[written++] = 'M'; + s[written++] = 'M'; + s[written++] = 'X'; + } if (cpu & RETRO_SIMD_MMXEXT) - strlcat(s, "MMXEXT ", len); + { + s[written++] = ' '; + s[written++] = 'M'; + s[written++] = 'M'; + s[written++] = 'X'; + s[written++] = 'E'; + s[written++] = 'X'; + s[written++] = 'T'; + } if (cpu & RETRO_SIMD_SSE) - strlcat(s, "SSE1 ", len); + { + s[written++] = ' '; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'E'; + } if (cpu & RETRO_SIMD_SSE2) - strlcat(s, "SSE2 ", len); + { + s[written++] = ' '; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'E'; + s[written++] = '2'; + } if (cpu & RETRO_SIMD_SSE3) - strlcat(s, "SSE3 ", len); + { + s[written++] = ' '; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'E'; + s[written++] = '3'; + } if (cpu & RETRO_SIMD_SSSE3) - strlcat(s, "SSSE3 ", len); + { + s[written++] = ' '; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'E'; + s[written++] = '3'; + } if (cpu & RETRO_SIMD_SSE4) - strlcat(s, "SSE4 ", len); + { + s[written++] = ' '; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'E'; + s[written++] = '4'; + } if (cpu & RETRO_SIMD_SSE42) - strlcat(s, "SSE4.2 ", len); - if (cpu & RETRO_SIMD_AVX) - strlcat(s, "AVX ", len); - if (cpu & RETRO_SIMD_AVX2) - strlcat(s, "AVX2 ", len); - if (cpu & RETRO_SIMD_VFPU) - strlcat(s, "VFPU ", len); - if (cpu & RETRO_SIMD_NEON) - strlcat(s, "NEON ", len); - if (cpu & RETRO_SIMD_VFPV3) - strlcat(s, "VFPv3 ", len); - if (cpu & RETRO_SIMD_VFPV4) - strlcat(s, "VFPv4 ", len); - if (cpu & RETRO_SIMD_PS) - strlcat(s, "PS ", len); + { + s[written++] = ' '; + s[written++] = 'S'; + s[written++] = 'S'; + s[written++] = 'E'; + s[written++] = '4'; + s[written++] = '.'; + s[written++] = '2'; + } if (cpu & RETRO_SIMD_AES) - strlcat(s, "AES ", len); + { + s[written++] = ' '; + s[written++] = 'A'; + s[written++] = 'E'; + s[written++] = 'S'; + } + if (cpu & RETRO_SIMD_AVX) + { + s[written++] = ' '; + s[written++] = 'A'; + s[written++] = 'V'; + s[written++] = 'X'; + } + if (cpu & RETRO_SIMD_AVX2) + { + s[written++] = ' '; + s[written++] = 'A'; + s[written++] = 'V'; + s[written++] = 'X'; + s[written++] = '2'; + } + if (cpu & RETRO_SIMD_NEON) + { + s[written++] = ' '; + s[written++] = 'N'; + s[written++] = 'E'; + s[written++] = 'O'; + s[written++] = 'N'; + } + if (cpu & RETRO_SIMD_VFPV3) + { + s[written++] = ' '; + s[written++] = 'V'; + s[written++] = 'F'; + s[written++] = 'P'; + s[written++] = 'v'; + s[written++] = '3'; + } + if (cpu & RETRO_SIMD_VFPV4) + { + s[written++] = ' '; + s[written++] = 'V'; + s[written++] = 'F'; + s[written++] = 'P'; + s[written++] = 'v'; + s[written++] = '4'; + } if (cpu & RETRO_SIMD_VMX) - strlcat(s, "VMX ", len); + { + s[written++] = ' '; + s[written++] = 'V'; + s[written++] = 'M'; + s[written++] = 'X'; + } if (cpu & RETRO_SIMD_VMX128) - strlcat(s, "VMX128 ", len); + { + s[written++] = ' '; + s[written++] = 'V'; + s[written++] = 'M'; + s[written++] = 'X'; + s[written++] = '1'; + s[written++] = '2'; + s[written++] = '8'; + } + if (cpu & RETRO_SIMD_VFPU) + { + s[written++] = ' '; + s[written++] = 'V'; + s[written++] = 'F'; + s[written++] = 'P'; + s[written++] = 'U'; + } + if (cpu & RETRO_SIMD_PS) + { + s[written++] = ' '; + s[written++] = 'P'; + s[written++] = 'S'; + } if (cpu & RETRO_SIMD_ASIMD) - strlcat(s, "ASIMD ", len); + { + s[written++] = ' '; + s[written++] = 'A'; + s[written++] = 'S'; + s[written++] = 'I'; + s[written++] = 'M'; + s[written++] = 'D'; + } + s[written++] = '\0'; } break; case RARCH_CAPABILITIES_COMPILER: