tests: Factor out Orc test code into cpu-test
authorArun Raghavan <arun.raghavan@collabora.co.uk>
Tue, 24 Jul 2012 09:07:54 +0000 (14:37 +0530)
committerArun Raghavan <arun.raghavan@collabora.co.uk>
Sat, 4 Aug 2012 06:23:35 +0000 (08:23 +0200)
Reorganises all the svolume core test code in cpu-test since it's the
same across MMX/SSE/etc.

src/pulsecore/cpu-orc.c
src/pulsecore/cpu-orc.h
src/pulsecore/svolume_orc.c
src/tests/cpu-test.c

index 21d49ed..d40c224 100644 (file)
 
 #include "cpu-orc.h"
 
-void pa_cpu_init_orc(pa_cpu_info cpu_info)
+pa_bool_t pa_cpu_init_orc(pa_cpu_info cpu_info)
 {
 #ifndef DISABLE_ORC
     /* Update these as we test on more architectures */
     pa_cpu_x86_flag_t x86_want_flags = PA_CPU_X86_MMX | PA_CPU_X86_SSE | PA_CPU_X86_SSE2 | PA_CPU_X86_SSE3 | PA_CPU_X86_SSSE3 | PA_CPU_X86_SSE4_1 | PA_CPU_X86_SSE4_2;
 
     /* Enable Orc svolume optimizations */
-    if ((cpu_info.cpu_type == PA_CPU_X86) && (cpu_info.flags.x86 & x86_want_flags))
+    if ((cpu_info.cpu_type == PA_CPU_X86) && (cpu_info.flags.x86 & x86_want_flags)) {
         pa_volume_func_init_orc();
+        return TRUE;
+    }
 #endif
+
+    return FALSE;
 }
index d236f7a..0bf81cb 100644 (file)
@@ -26,7 +26,7 @@
 
 /* Orc-optimised bits */
 
-void pa_cpu_init_orc(pa_cpu_info cpu_info);
+pa_bool_t pa_cpu_init_orc(pa_cpu_info cpu_info);
 
 void pa_volume_func_init_orc(void);
 
index d5bd5f2..37e6bf8 100644 (file)
@@ -45,94 +45,9 @@ pa_volume_s16ne_orc(int16_t *samples, const int32_t *volumes, unsigned channels,
         fallback(samples, volumes, channels, length);
 }
 
-#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 ORC %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_orc(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_orc(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("ORC: %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
-
 void pa_volume_func_init_orc(void) {
     pa_log_info("Initialising ORC optimized volume functions.");
 
-#ifdef RUN_TEST
-    run_test();
-#endif
-
     fallback = pa_get_volume_func(PA_SAMPLE_S16NE);
     pa_set_volume_func(PA_SAMPLE_S16NE, (pa_do_volume_func_t) pa_volume_s16ne_orc);
 }
index de25bc6..a812db2 100644 (file)
@@ -8,44 +8,31 @@
 
 #include <pulse/rtclock.h>
 #include <pulsecore/cpu-x86.h>
+#include <pulsecore/cpu-orc.h>
 #include <pulsecore/random.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/endianmacros.h>
 #include <pulsecore/sconv.h>
 #include <pulsecore/sample-util.h>
 
-START_TEST (svolume_mmx_test) {
+/* Common defines for svolume tests */
 #define CHANNELS 2
 #define SAMPLES 1022
 #define TIMES 1000
 #define TIMES2 100
 #define PADDING 16
 
+static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_func) {
     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));
@@ -57,7 +44,7 @@ START_TEST (svolume_mmx_test) {
         volumes[i] = volumes[padding];
 
     orig_func(samples_ref, volumes, CHANNELS, sizeof(samples));
-    mmx_func(samples, volumes, CHANNELS, sizeof(samples));
+    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],
@@ -70,7 +57,7 @@ START_TEST (svolume_mmx_test) {
         start = pa_rtclock_now();
         for (j = 0; j < TIMES; j++) {
             memcpy(samples, samples_orig, sizeof(samples));
-            mmx_func(samples, volumes, CHANNELS, sizeof(samples));
+            func(samples, volumes, CHANNELS, sizeof(samples));
         }
         stop = pa_rtclock_now();
 
@@ -79,8 +66,8 @@ START_TEST (svolume_mmx_test) {
         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);
+    pa_log_info("func: %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;
@@ -97,36 +84,34 @@ START_TEST (svolume_mmx_test) {
         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_log_info("orig: %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
+START_TEST (svolume_mmx_test) {
+    pa_do_volume_func_t orig_func, mmx_func;
+    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");
+    run_volume_test(mmx_func, orig_func);
 }
 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);
@@ -140,70 +125,39 @@ START_TEST (svolume_sse_test) {
     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));
+    pa_log_debug("Checking SSE2 svolume");
+    run_volume_test(sse_func, orig_func);
+}
+END_TEST
 
-    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];
+START_TEST (svolume_orc_test) {
+    pa_do_volume_func_t orig_func, orc_func;
+    pa_cpu_info cpu_info;
 
-    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();
-        }
-    }
+#if defined (__i386__) || defined (__amd64__)
+    pa_zero(cpu_info);
+    cpu_info.cpu_type = PA_CPU_X86;
+    pa_cpu_get_x86_flags(&cpu_info.flags.x86);
+#endif
 
-    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();
+    orig_func = pa_get_volume_func(PA_SAMPLE_S16NE);
 
-        if (min > (stop - start)) min = stop - start;
-        if (max < (stop - start)) max = stop - start;
-        s1 += stop - start;
-        s2 += (stop - start) * (stop - start);
+    if (!pa_cpu_init_orc(cpu_info)) {
+        pa_log_info("Orc not supported. Skipping");
+        return;
     }
-    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);
+    orc_func = pa_get_volume_func(PA_SAMPLE_S16NE);
 
-    fail_unless(memcmp(samples_ref, samples, sizeof(samples)) == 0);
+    pa_log_debug("Checking SSE2 svolume");
+    run_volume_test(orc_func, orig_func, CHANNELS, SAMPLES, TIMES, TIMES2, PADDING);
 
 #undef CHANNELS
 #undef SAMPLES
 #undef TIMES
 #undef TIMES2
 #undef PADDING
-}
-END_TEST
+/* End svolume tests */
 
 START_TEST (sconv_sse_test) {
 #define SAMPLES 1019
@@ -280,6 +234,7 @@ int main(int argc, char *argv[]) {
     tc = tcase_create("x86");
     tcase_add_test(tc, svolume_mmx_test);
     tcase_add_test(tc, svolume_sse_test);
+    tcase_add_test(tc, svolume_orc_test);
     tcase_add_test(tc, sconv_sse_test);
     suite_add_tcase(s, tc);