/* ------------------------------------------------------------------------- */ int test_sign16s_func(void) { INT16 ALIGN(src[65535]), ALIGN(d1[65535]); #ifdef WITH_SSE2 INT16 ALIGN(d2[65535]); int i; #endif int failed = 0; char testStr[256]; /* Test when we can reach 16-byte alignment */ testStr[0] = '\0'; get_random_data(src, sizeof(src)); general_sign_16s(src+1, d1+1, 65535); #ifdef WITH_SSE2 if (IsProcessorFeaturePresentEx(PF_EX_SSSE3)) { strcat(testStr, " SSSE3"); ssse3_sign_16s(src+1, d2+1, 65535); for (i=1; i<65535; ++i) { if (d1[i] != d2[i]) { printf("SIGN16s-SSE-aligned FAIL[%d] of %d: want %d, got %d\n", i, src[i], d1[i], d2[i]); ++failed; } } } #endif /* i386 */ /* Test when we cannot reach 16-byte alignment */ get_random_data(src, sizeof(src)); general_sign_16s(src+1, d1+2, 65535); #ifdef WITH_SSE2 if (IsProcessorFeaturePresentEx(PF_EX_SSSE3)) { ssse3_sign_16s(src+1, d2+2, 65535); for (i=2; i<65535; ++i) { if (d1[i] != d2[i]) { printf("SIGN16s-SSE-unaligned FAIL[%d] of %d: want %d, got %d\n", i, src[i-1], d1[i], d2[i]); ++failed; } } } #endif /* i386 */ if (!failed) printf("All sign16s tests passed (%s).\n", testStr); return (failed > 0) ? FAILURE : SUCCESS; }
/* ------------------------------------------------------------------------- */ void primitives_init_sign_opt(primitives_t *prims) { /* Pick tuned versions if possible. */ /* I didn't spot an IPP version of this. */ #if defined(WITH_SSE2) if (IsProcessorFeaturePresentEx(PF_EX_SSSE3) && IsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE)) { prims->sign_16s = ssse3_sign_16s; } #endif }
void primitives_flags_str(char* str, size_t len) { int i; *str = '\0'; --len; /* for the '/0' */ for (i = 0; i < sizeof(flags) / sizeof(flagpair_t); ++i) { if (IsProcessorFeaturePresent(flags[i].flag)) { int slen = strlen(flags[i].str) + 1; if (len < slen) break; if (*str != '\0') strcat(str, " "); strcat(str, flags[i].str); len -= slen; } } for (i = 0; i < sizeof(flags_extended) / sizeof(flagpair_t); ++i) { if (IsProcessorFeaturePresentEx(flags_extended[i].flag)) { int slen = strlen(flags_extended[i].str) + 1; if (len < slen) break; if (*str != '\0') strcat(str, " "); strcat(str, flags_extended[i].str); len -= slen; } } }
int TestCPUFeatures(int argc, char* argv[]) { printf("Base CPU Flags:\n"); #ifdef _M_IX86_AMD64 printf("\tPF_MMX_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\tPF_XMMI_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\tPF_XMMI64_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\tPF_3DNOW_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_3DNOW_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\tPF_SSE3_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\n"); printf("Extended CPU Flags (not found in windows API):\n"); printf("\tPF_EX_3DNOW_PREFETCH: %s\n", IsProcessorFeaturePresentEx(PF_EX_3DNOW_PREFETCH) ? "yes" : "no"); printf("\tPF_EX_SSSE3: %s\n", IsProcessorFeaturePresentEx(PF_EX_SSSE3) ? "yes" : "no"); printf("\tPF_EX_SSE41: %s\n", IsProcessorFeaturePresentEx(PF_EX_SSE41) ? "yes" : "no"); printf("\tPF_EX_SSE42: %s\n", IsProcessorFeaturePresentEx(PF_EX_SSE42) ? "yes" : "no"); printf("\tPF_EX_AVX: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX) ? "yes" : "no"); printf("\tPF_EX_FMA: %s\n", IsProcessorFeaturePresentEx(PF_EX_FMA) ? "yes" : "no"); printf("\tPF_EX_AVX_AES: %s\n", IsProcessorFeaturePresentEx(PF_EX_AVX_AES) ? "yes" : "no"); #elif defined(_M_ARM) printf("\tPF_ARM_NEON_INSTRUCTIONS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? "yes" : "no"); printf("\tPF_ARM_THUMB: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB) ? "yes" : "no"); printf("\tPF_ARM_VFP_32_REGISTERS_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE) ? "yes" : "no"); printf("\tPF_ARM_DIVIDE_INSTRUCTION_AVAILABLE: %s\n", IsProcessorFeaturePresent(PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE) ? "yes" : "no"); printf("\tPF_ARM_VFP3: %s\n", IsProcessorFeaturePresent(PF_ARM_VFP3) ? "yes" : "no"); printf("\tPF_ARM_THUMB: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB) ? "yes" : "no"); printf("\tPF_ARM_JAZELLE: %s\n", IsProcessorFeaturePresent(PF_ARM_JAZELLE) ? "yes" : "no"); printf("\tPF_ARM_DSP: %s\n", IsProcessorFeaturePresent(PF_ARM_DSP) ? "yes" : "no"); printf("\tPF_ARM_THUMB2: %s\n", IsProcessorFeaturePresent(PF_ARM_THUMB2) ? "yes" : "no"); printf("\tPF_ARM_T2EE: %s\n", IsProcessorFeaturePresent(PF_ARM_T2EE) ? "yes" : "no"); printf("\tPF_ARM_INTEL_WMMX: %s\n", IsProcessorFeaturePresent(PF_ARM_INTEL_WMMX) ? "yes" : "no"); printf("Extended CPU Flags (not found in windows API):\n"); printf("\tPF_EX_ARM_VFP1: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_VFP1) ? "yes" : "no"); printf("\tPF_EX_ARM_VFP3D16: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_VFP3D16) ? "yes" : "no"); printf("\tPF_EX_ARM_VFP4: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_VFP4) ? "yes" : "no"); printf("\tPF_EX_ARM_IDIVA: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_IDIVA) ? "yes" : "no"); printf("\tPF_EX_ARM_IDIVT: %s\n", IsProcessorFeaturePresentEx(PF_EX_ARM_IDIVT) ? "yes" : "no"); #endif printf("\n"); return 0; }
static BOOL CALLBACK rfx_rlgr_init(PINIT_ONCE once, PVOID param, PVOID *context) { g_LZCNT = IsProcessorFeaturePresentEx(PF_EX_LZCNT); return TRUE; }