From c8cd89a7cb7aaa715bbdcde4e246b0bbf4f2ab64 Mon Sep 17 00:00:00 2001 From: Deng Zhengrong Date: Tue, 17 Jul 2012 14:45:52 +0800 Subject: [PATCH] tests: add cpu test It tests only x86 architecture right now. --- src/Makefile.am | 6 + src/pulsecore/cpu-x86.c | 8 +- src/pulsecore/cpu-x86.h | 1 + src/pulsecore/sconv_sse.c | 54 ------- src/pulsecore/svolume_mmx.c | 90 ----------- src/pulsecore/svolume_sse.c | 85 ----------- src/tests/cpu-test.c | 292 ++++++++++++++++++++++++++++++++++++ 7 files changed, 306 insertions(+), 230 deletions(-) create mode 100644 src/tests/cpu-test.c diff --git a/src/Makefile.am b/src/Makefile.am index 8f54b1d5..06bc5db1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -244,6 +244,7 @@ TESTS_default = \ volume-test \ mix-test \ proplist-test \ + cpu-test \ lock-autospawn-test TESTS_norun = \ @@ -483,6 +484,11 @@ proplist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la li proplist_test_CFLAGS = $(AM_CFLAGS) proplist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +cpu_test_SOURCES = tests/cpu-test.c +cpu_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + rtstutter_SOURCES = tests/rtstutter.c rtstutter_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la rtstutter_CFLAGS = $(AM_CFLAGS) diff --git a/src/pulsecore/cpu-x86.c b/src/pulsecore/cpu-x86.c index 05a4b2f0..b2a558a2 100644 --- a/src/pulsecore/cpu-x86.c +++ b/src/pulsecore/cpu-x86.c @@ -44,7 +44,7 @@ static void get_cpuid(uint32_t op, uint32_t *a, uint32_t *b, uint32_t *c, uint32 } #endif -pa_bool_t pa_cpu_init_x86(pa_cpu_x86_flag_t *flags) { +void pa_cpu_get_x86_flags(pa_cpu_x86_flag_t *flags) { #if defined (__i386__) || defined (__amd64__) uint32_t eax, ebx, ecx, edx; uint32_t level; @@ -111,6 +111,12 @@ pa_bool_t pa_cpu_init_x86(pa_cpu_x86_flag_t *flags) { (*flags & PA_CPU_X86_MMXEXT) ? "MMXEXT " : "", (*flags & PA_CPU_X86_3DNOW) ? "3DNOW " : "", (*flags & PA_CPU_X86_3DNOWEXT) ? "3DNOWEXT " : ""); +#endif /* defined (__i386__) || defined (__amd64__) */ +} + +pa_bool_t pa_cpu_init_x86(pa_cpu_x86_flag_t *flags) { +#if defined (__i386__) || defined (__amd64__) + pa_cpu_get_x86_flags(flags); /* activate various optimisations */ if (*flags & PA_CPU_X86_MMX) { diff --git a/src/pulsecore/cpu-x86.h b/src/pulsecore/cpu-x86.h index 0045ef6d..9a9f3a19 100644 --- a/src/pulsecore/cpu-x86.h +++ b/src/pulsecore/cpu-x86.h @@ -40,6 +40,7 @@ typedef enum pa_cpu_x86_flag { PA_CPU_X86_CMOV = (1 << 10) } pa_cpu_x86_flag_t; +void pa_cpu_get_x86_flags(pa_cpu_x86_flag_t *flags); pa_bool_t pa_cpu_init_x86 (pa_cpu_x86_flag_t *flags); #if defined (__i386__) diff --git a/src/pulsecore/sconv_sse.c b/src/pulsecore/sconv_sse.c index 3c9a809f..19de6fda 100644 --- a/src/pulsecore/sconv_sse.c +++ b/src/pulsecore/sconv_sse.c @@ -162,65 +162,11 @@ static void pa_sconv_s16le_from_f32ne_sse2(unsigned n, const float *a, int16_t * ); } -#undef RUN_TEST - -#ifdef RUN_TEST -#define SAMPLES 1019 -#define TIMES 1000 - -static void run_test(void) { - int16_t samples[SAMPLES]; - int16_t samples_ref[SAMPLES]; - float floats[SAMPLES]; - int i; - pa_usec_t start, stop; - pa_convert_func_t func; - - printf("checking SSE %zd\n", sizeof(samples)); - - memset(samples_ref, 0, sizeof(samples_ref)); - memset(samples, 0, sizeof(samples)); - - for (i = 0; i < SAMPLES; i++) { - floats[i] = 2.1f * (rand()/(float) RAND_MAX - 0.5f); - } - - func = pa_get_convert_from_float32ne_function(PA_SAMPLE_S16LE); - func(SAMPLES, floats, samples_ref); - pa_sconv_s16le_from_f32ne_sse2(SAMPLES, floats, samples); - - for (i = 0; i < SAMPLES; i++) { - if (samples[i] != samples_ref[i]) { - printf ("%d: %04x != %04x (%f)\n", i, samples[i], samples_ref[i], - floats[i]); - } - } - - start = pa_rtclock_now(); - for (i = 0; i < TIMES; i++) { - pa_sconv_s16le_from_f32ne_sse2(SAMPLES, floats, samples); - } - stop = pa_rtclock_now(); - pa_log_info("SSE: %llu usec.", (long long unsigned int)(stop - start)); - - start = pa_rtclock_now(); - for (i = 0; i < TIMES; i++) { - func(SAMPLES, floats, samples_ref); - } - stop = pa_rtclock_now(); - pa_log_info("ref: %llu usec.", (long long unsigned int)(stop - start)); -} -#endif #endif /* defined (__i386__) || defined (__amd64__) */ - void pa_convert_func_init_sse(pa_cpu_x86_flag_t flags) { #if !defined(__APPLE__) && defined (__i386__) || defined (__amd64__) -#ifdef RUN_TEST - run_test(); -#endif - if (flags & PA_CPU_X86_SSE2) { pa_log_info("Initialising SSE2 optimized conversions."); pa_set_convert_from_float32ne_function(PA_SAMPLE_S16LE, (pa_convert_func_t) pa_sconv_s16le_from_f32ne_sse2); diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c index c470ffbd..d68a1059 100644 --- a/src/pulsecore/svolume_mmx.c +++ b/src/pulsecore/svolume_mmx.c @@ -240,100 +240,10 @@ static void pa_volume_s16re_mmx(int16_t *samples, const int32_t *volumes, unsign ); } -#undef RUN_TEST - -#ifdef RUN_TEST -#define CHANNELS 2 -#define SAMPLES 1022 -#define TIMES 1000 -#define TIMES2 100 -#define PADDING 16 - -static void run_test(void) { - int16_t samples[SAMPLES]; - int16_t samples_ref[SAMPLES]; - int16_t samples_orig[SAMPLES]; - int32_t volumes[CHANNELS + PADDING]; - int i, j, padding; - pa_do_volume_func_t func; - pa_usec_t start, stop; - int k; - pa_usec_t min = INT_MAX, max = 0; - double s1 = 0, s2 = 0; - - func = pa_get_volume_func(PA_SAMPLE_S16NE); - - printf("checking MMX %zd\n", sizeof(samples)); - - pa_random(samples, sizeof(samples)); - /* for (i = 0; i < SAMPLES; i++) - samples[i] = -1; */ - memcpy(samples_ref, samples, sizeof(samples)); - memcpy(samples_orig, samples, sizeof(samples)); - - for (i = 0; i < CHANNELS; i++) - volumes[i] = PA_CLAMP_VOLUME(rand() >> 15); - /* volumes[i] = 0x0000ffff; */ - for (padding = 0; padding < PADDING; padding++, i++) - volumes[i] = volumes[padding]; - - func(samples_ref, volumes, CHANNELS, sizeof(samples)); - pa_volume_s16ne_mmx(samples, volumes, CHANNELS, sizeof(samples)); - for (i = 0; i < SAMPLES; i++) { - if (samples[i] != samples_ref[i]) { - printf("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i], - samples_orig[i], volumes[i % CHANNELS]); - } - } - - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples, samples_orig, sizeof(samples)); - pa_volume_s16ne_mmx(samples, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("MMX: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - min = INT_MAX; max = 0; - s1 = s2 = 0; - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples_ref, samples_orig, sizeof(samples)); - func(samples_ref, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - pa_assert_se(memcmp(samples_ref, samples, sizeof(samples)) == 0); -} -#endif - #endif /* defined (__i386__) || defined (__amd64__) */ - void pa_volume_func_init_mmx(pa_cpu_x86_flag_t flags) { #if defined (__i386__) || defined (__amd64__) - -#ifdef RUN_TEST - run_test(); -#endif - if ((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV)) { pa_log_info("Initialising MMX optimized volume functions."); diff --git a/src/pulsecore/svolume_sse.c b/src/pulsecore/svolume_sse.c index 771bf538..daa87ca3 100644 --- a/src/pulsecore/svolume_sse.c +++ b/src/pulsecore/svolume_sse.c @@ -252,95 +252,10 @@ static void pa_volume_s16re_sse2(int16_t *samples, const int32_t *volumes, unsig ); } -#undef RUN_TEST - -#ifdef RUN_TEST -#define CHANNELS 2 -#define SAMPLES 1022 -#define TIMES 1000 -#define TIMES2 100 -#define PADDING 16 - -static void run_test(void) { - int16_t samples[SAMPLES]; - int16_t samples_ref[SAMPLES]; - int16_t samples_orig[SAMPLES]; - int32_t volumes[CHANNELS + PADDING]; - int i, j, padding; - pa_do_volume_func_t func; - pa_usec_t start, stop; - int k; - pa_usec_t min = INT_MAX, max = 0; - double s1 = 0, s2 = 0; - - func = pa_get_volume_func(PA_SAMPLE_S16NE); - - printf("checking SSE2 %zd\n", sizeof(samples)); - - pa_random(samples, sizeof(samples)); - memcpy(samples_ref, samples, sizeof(samples)); - memcpy(samples_orig, samples, sizeof(samples)); - - for (i = 0; i < CHANNELS; i++) - volumes[i] = PA_CLAMP_VOLUME(rand() >> 15); - for (padding = 0; padding < PADDING; padding++, i++) - volumes[i] = volumes[padding]; - - func(samples_ref, volumes, CHANNELS, sizeof(samples)); - pa_volume_s16ne_sse2(samples, volumes, CHANNELS, sizeof(samples)); - for (i = 0; i < SAMPLES; i++) { - if (samples[i] != samples_ref[i]) { - printf ("%d: %04x != %04x (%04x * %04x)\n", i, samples[i], samples_ref[i], - samples_orig[i], volumes[i % CHANNELS]); - } - } - - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples, samples_orig, sizeof(samples)); - pa_volume_s16ne_sse2(samples, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("SSE: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - min = INT_MAX; max = 0; - s1 = s2 = 0; - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples_ref, samples_orig, sizeof(samples)); - func(samples_ref, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - pa_assert_se(memcmp(samples_ref, samples, sizeof(samples)) == 0); -} -#endif #endif /* defined (__i386__) || defined (__amd64__) */ void pa_volume_func_init_sse(pa_cpu_x86_flag_t flags) { #if defined (__i386__) || defined (__amd64__) - -#ifdef RUN_TEST - run_test(); -#endif - if (flags & PA_CPU_X86_SSE2) { pa_log_info("Initialising SSE2 optimized volume functions."); diff --git a/src/tests/cpu-test.c b/src/tests/cpu-test.c new file mode 100644 index 00000000..de25bc6a --- /dev/null +++ b/src/tests/cpu-test.c @@ -0,0 +1,292 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +START_TEST (svolume_mmx_test) { +#define CHANNELS 2 +#define SAMPLES 1022 +#define TIMES 1000 +#define TIMES2 100 +#define PADDING 16 + + int16_t samples[SAMPLES]; + int16_t samples_ref[SAMPLES]; + int16_t samples_orig[SAMPLES]; + int32_t volumes[CHANNELS + PADDING]; + int i, j, padding; + pa_do_volume_func_t orig_func, mmx_func; + pa_usec_t start, stop; + int k; + pa_usec_t min = INT_MAX, max = 0; + double s1 = 0, s2 = 0; + + pa_cpu_x86_flag_t flags = 0; + + pa_cpu_get_x86_flags(&flags); + + if (!((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV))) { + pa_log_info("MMX/CMOV not supported. Skipping"); + return; + } + + orig_func = pa_get_volume_func(PA_SAMPLE_S16NE); + pa_volume_func_init_mmx(flags); + mmx_func = pa_get_volume_func(PA_SAMPLE_S16NE); + + pa_log_debug("Checking MMX svolume (%zd)\n", sizeof(samples)); + + pa_random(samples, sizeof(samples)); + memcpy(samples_ref, samples, sizeof(samples)); + memcpy(samples_orig, samples, sizeof(samples)); + + for (i = 0; i < CHANNELS; i++) + volumes[i] = PA_CLAMP_VOLUME((pa_volume_t)(rand() >> 15)); + for (padding = 0; padding < PADDING; padding++, i++) + volumes[i] = volumes[padding]; + + orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); + mmx_func(samples, volumes, CHANNELS, sizeof(samples)); + for (i = 0; i < SAMPLES; i++) { + if (samples[i] != samples_ref[i]) { + printf("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i], + samples_orig[i], volumes[i % CHANNELS]); + fail(); + } + } + + for (k = 0; k < TIMES2; k++) { + start = pa_rtclock_now(); + for (j = 0; j < TIMES; j++) { + memcpy(samples, samples_orig, sizeof(samples)); + mmx_func(samples, volumes, CHANNELS, sizeof(samples)); + } + stop = pa_rtclock_now(); + + if (min > (stop - start)) min = stop - start; + if (max < (stop - start)) max = stop - start; + s1 += stop - start; + s2 += (stop - start) * (stop - start); + } + pa_log_info("MMX: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, + (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + + min = INT_MAX; max = 0; + s1 = s2 = 0; + for (k = 0; k < TIMES2; k++) { + start = pa_rtclock_now(); + for (j = 0; j < TIMES; j++) { + memcpy(samples_ref, samples_orig, sizeof(samples)); + orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); + } + stop = pa_rtclock_now(); + + if (min > (stop - start)) min = stop - start; + if (max < (stop - start)) max = stop - start; + s1 += stop - start; + s2 += (stop - start) * (stop - start); + } + pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, + (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + + fail_unless(memcmp(samples_ref, samples, sizeof(samples)) == 0); + +#undef CHANNELS +#undef SAMPLES +#undef TIMES +#undef TIMES2 +#undef PADDING +} +END_TEST + +START_TEST (svolume_sse_test) { +#define CHANNELS 2 +#define SAMPLES 1022 +#define TIMES 1000 +#define TIMES2 100 +#define PADDING 16 + + int16_t samples[SAMPLES]; + int16_t samples_ref[SAMPLES]; + int16_t samples_orig[SAMPLES]; + int32_t volumes[CHANNELS + PADDING]; + int i, j, padding; + pa_do_volume_func_t orig_func, sse_func; + pa_usec_t start, stop; + int k; + pa_usec_t min = INT_MAX, max = 0; + double s1 = 0, s2 = 0; + pa_cpu_x86_flag_t flags = 0; + + pa_cpu_get_x86_flags(&flags); + + if (!(flags & PA_CPU_X86_SSE2)) { + pa_log_info("SSE2 not supported. Skipping"); + return; + } + + orig_func = pa_get_volume_func(PA_SAMPLE_S16NE); + pa_volume_func_init_sse(flags); + sse_func = pa_get_volume_func(PA_SAMPLE_S16NE); + + pa_log_debug("Checking SSE2 svolume (%zd)\n", sizeof(samples)); + + pa_random(samples, sizeof(samples)); + memcpy(samples_ref, samples, sizeof(samples)); + memcpy(samples_orig, samples, sizeof(samples)); + + for (i = 0; i < CHANNELS; i++) + volumes[i] = PA_CLAMP_VOLUME((pa_volume_t)(rand() >> 15)); + for (padding = 0; padding < PADDING; padding++, i++) + volumes[i] = volumes[padding]; + + orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); + sse_func(samples, volumes, CHANNELS, sizeof(samples)); + for (i = 0; i < SAMPLES; i++) { + if (samples[i] != samples_ref[i]) { + printf ("%d: %04x != %04x (%04x * %04x)\n", i, samples[i], samples_ref[i], + samples_orig[i], volumes[i % CHANNELS]); + fail(); + } + } + + for (k = 0; k < TIMES2; k++) { + start = pa_rtclock_now(); + for (j = 0; j < TIMES; j++) { + memcpy(samples, samples_orig, sizeof(samples)); + sse_func(samples, volumes, CHANNELS, sizeof(samples)); + } + stop = pa_rtclock_now(); + + if (min > (stop - start)) min = stop - start; + if (max < (stop - start)) max = stop - start; + s1 += stop - start; + s2 += (stop - start) * (stop - start); + } + pa_log_info("SSE: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, + (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + + min = INT_MAX; max = 0; + s1 = s2 = 0; + for (k = 0; k < TIMES2; k++) { + start = pa_rtclock_now(); + for (j = 0; j < TIMES; j++) { + memcpy(samples_ref, samples_orig, sizeof(samples)); + orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); + } + stop = pa_rtclock_now(); + + if (min > (stop - start)) min = stop - start; + if (max < (stop - start)) max = stop - start; + s1 += stop - start; + s2 += (stop - start) * (stop - start); + } + pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, + (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + + fail_unless(memcmp(samples_ref, samples, sizeof(samples)) == 0); + +#undef CHANNELS +#undef SAMPLES +#undef TIMES +#undef TIMES2 +#undef PADDING +} +END_TEST + +START_TEST (sconv_sse_test) { +#define SAMPLES 1019 +#define TIMES 1000 + + int16_t samples[SAMPLES]; + int16_t samples_ref[SAMPLES]; + float floats[SAMPLES]; + int i; + pa_usec_t start, stop; + pa_convert_func_t orig_func, sse_func; + pa_cpu_x86_flag_t flags = 0; + + pa_cpu_get_x86_flags(&flags); + + if (!(flags & PA_CPU_X86_SSE2)) { + pa_log_info("SSE2 not supported. Skipping"); + return; + } + + pa_log_debug("Checking SSE sconv (%zd)\n", sizeof(samples)); + + memset(samples_ref, 0, sizeof(samples_ref)); + memset(samples, 0, sizeof(samples)); + + for (i = 0; i < SAMPLES; i++) { + floats[i] = 2.1f * (rand()/(float) RAND_MAX - 0.5f); + } + + orig_func = pa_get_convert_from_float32ne_function(PA_SAMPLE_S16LE); + pa_convert_func_init_sse(flags); + sse_func = pa_get_convert_from_float32ne_function(PA_SAMPLE_S16LE); + + orig_func(SAMPLES, floats, samples_ref); + sse_func(SAMPLES, floats, samples); + + for (i = 0; i < SAMPLES; i++) { + if (samples[i] != samples_ref[i]) { + printf ("%d: %04x != %04x (%f)\n", i, samples[i], samples_ref[i], + floats[i]); + fail(); + } + } + + start = pa_rtclock_now(); + for (i = 0; i < TIMES; i++) { + sse_func(SAMPLES, floats, samples); + } + stop = pa_rtclock_now(); + pa_log_info("SSE: %llu usec.", (long long unsigned int)(stop - start)); + + start = pa_rtclock_now(); + for (i = 0; i < TIMES; i++) { + orig_func(SAMPLES, floats, samples_ref); + } + stop = pa_rtclock_now(); + pa_log_info("ref: %llu usec.", (long long unsigned int)(stop - start)); + +#undef SAMPLES +#undef TIMES +} +END_TEST + +int main(int argc, char *argv[]) { + int failed = 0; + Suite *s; + TCase *tc; + SRunner *sr; + + if (!getenv("MAKE_CHECK")) + pa_log_set_level(PA_LOG_DEBUG); + + s = suite_create("CPU"); + tc = tcase_create("x86"); + tcase_add_test(tc, svolume_mmx_test); + tcase_add_test(tc, svolume_sse_test); + tcase_add_test(tc, sconv_sse_test); + suite_add_tcase(s, tc); + + sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + failed = srunner_ntests_failed(sr); + srunner_free(sr); + + return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} -- 2.39.2