]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/svolume_mmx.c
Sending translation for Chinese (Simplified)
[pulseaudio] / src / pulsecore / svolume_mmx.c
index 170f01d45118ba4e830d29deb3d5c194d5c5b8dc..0e222cdcb29621beb6758f0b776581c597918543 100644 (file)
@@ -25,6 +25,8 @@
 #endif
 
 #include <pulse/timeval.h>
+#include <pulse/rtclock.h>
+
 #include <pulsecore/random.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/g711.h>
@@ -60,7 +62,9 @@
       " movq "#s", %%mm5             \n\t"                                              \
       " pmulhw "#v", "#s"            \n\t" /* .. |    0  | vl*p0 | */                   \
       " paddw %%mm4, "#s"            \n\t" /* .. |    0  | vl*p0 | + sign correct */    \
+      " pslld $16, "#s"              \n\t" /* .. | vl*p0 |   0   | */                   \
       " psrld $16, "#v"              \n\t" /* .. |    0  |   vh  | */                   \
+      " psrad $16, "#s"              \n\t" /* .. |     vl*p0     | sign extend */       \
       " pmaddwd %%mm5, "#v"          \n\t" /* .. |    p0 * vh    | */                   \
       " paddd "#s", "#v"             \n\t" /* .. |    p0 * v0    | */                   \
       " packssdw "#v", "#v"          \n\t" /* .. | p1*v1 | p0*v0 | */
@@ -152,7 +156,7 @@ pa_volume_s16ne_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi
         " emms                          \n\t"
 
         : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
-        : "r" ((pa_reg_x86)channels)
+        : "rm" ((pa_reg_x86)channels)
         : "cc"
     );
 }
@@ -228,12 +232,12 @@ pa_volume_s16re_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi
         " emms                          \n\t"
 
         : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
-        : "r" ((pa_reg_x86)channels)
+        : "rm" ((pa_reg_x86)channels)
         : "cc"
     );
 }
 
-#define RUN_TEST
+#undef RUN_TEST
 
 #ifdef RUN_TEST
 #define CHANNELS 2
@@ -255,11 +259,14 @@ static void run_test (void) {
     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] = rand() >> 1;
+        /* volumes[i] = 0x0000ffff; */
     for (padding = 0; padding < PADDING; padding++, i++)
         volumes[i] = volumes[padding];
 
@@ -267,7 +274,7 @@ static void run_test (void) {
     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 * %04x)\n", i, samples[i], samples_ref[i],
+            printf ("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i],
                   samples_orig[i], volumes[i % CHANNELS]);
         }
     }
@@ -287,6 +294,8 @@ static void run_test (void) {
     }
     stop = pa_rtclock_now();
     pa_log_info("ref: %llu usec.", (long long unsigned int)(stop - start));
+
+    pa_assert_se(memcmp(samples_ref, samples, sizeof(samples)) == 0);
 }
 #endif
 
@@ -300,7 +309,7 @@ void pa_volume_func_init_mmx (pa_cpu_x86_flag_t flags) {
     run_test ();
 #endif
 
-    if (flags & PA_CPU_X86_MMX) {
+    if ((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV)) {
         pa_log_info("Initialising MMX optimized functions.");
 
         pa_set_volume_func (PA_SAMPLE_S16NE, (pa_do_volume_func_t) pa_volume_s16ne_mmx);