]> code.delx.au - pulseaudio/commitdiff
svolume: fix MMX error
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 29 Oct 2009 13:49:52 +0000 (14:49 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 30 Oct 2009 04:09:15 +0000 (05:09 +0100)
We need to sign extend the lower part of the multiplication before adding it to
the higher part. Makes -1 * 0xffff work again.

src/pulsecore/svolume_mmx.c

index 5bf72ed07eff3ea1918d560b8a2afdb093febb7d..a011789c3606c149d0e57bab92aee43c3028987f 100644 (file)
@@ -62,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 | */
@@ -257,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];
 
@@ -269,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]);
         }
     }