]> git.wh0rd.org - ICEs.git/blobdiff - 287391/svolume_mmx.i.3
more ices
[ICEs.git] / 287391 / svolume_mmx.i.3
diff --git a/287391/svolume_mmx.i.3 b/287391/svolume_mmx.i.3
new file mode 100644 (file)
index 0000000..e2de434
--- /dev/null
@@ -0,0 +1,102 @@
+typedef long int int64_t;
+typedef int64_t pa_reg_x86;
+void pa_volume_s16ne_mmx(short *samples, int *volumes, unsigned channels,
+                        unsigned length)
+{
+       long int channel;
+       long int temp;
+       __asm__ __volatile__(" xor %3, %3                    \n\t"
+                            " sar $1, %2                    \n\t"
+                            " test $1, %2                   \n\t"
+                            " je 2f                         \n\t"
+                            " movd (%1, %3, 4), %%mm0       \n\t"
+                            " movw (%0), %w4                \n\t"
+                            " movd %4, %%mm1                \n\t"
+                            " pxor  %%mm4, %%mm4           \n\t"
+                            " punpcklwd %%mm4, " "%%mm1" "        \n\t"
+                            " pcmpgtw " "%%mm0" ", %%mm4          \n\t"
+                            " pand " "%%mm1" ", %%mm4             \n\t"
+                            " movq " "%%mm1" ", %%mm5             \n\t"
+                            " pmulhw " "%%mm0" ", " "%%mm1" "            \n\t"
+                            " paddw %%mm4, " "%%mm1" "            \n\t"
+                            " psrld $16, " "%%mm0" "              \n\t"
+                            " pmaddwd %%mm5, " "%%mm0" "          \n\t"
+                            " paddd " "%%mm1" ", " "%%mm0" "             \n\t"
+                            " packssdw " "%%mm0" ", " "%%mm0" "          \n\t"
+                            " movd %%mm0, %4                \n\t"
+                            " movw %w4, (%0)                \n\t"
+                            " add $2, %0                    \n\t" " add " "$1"
+                            ", %3                 \n\t"
+                            " mov %3, %4                   \n\t" " sub " "%5"
+                            ", %4                 \n\t"
+                            " cmovae %4, %3                \n\t"
+                            "2:                             \n\t"
+                            " sar $1, %2                    \n\t"
+                            " test $1, %2                   \n\t"
+                            " je 4f                         \n\t"
+                            "3:                             \n\t"
+                            " movq (%1, %3, 4), %%mm0       \n\t"
+                            " movd (%0), %%mm1              \n\t"
+                            " pxor  %%mm4, %%mm4           \n\t"
+                            " punpcklwd %%mm4, " "%%mm1" "        \n\t"
+                            " pcmpgtw " "%%mm0" ", %%mm4          \n\t"
+                            " pand " "%%mm1" ", %%mm4             \n\t"
+                            " movq " "%%mm1" ", %%mm5             \n\t"
+                            " pmulhw " "%%mm0" ", " "%%mm1" "            \n\t"
+                            " paddw %%mm4, " "%%mm1" "            \n\t"
+                            " psrld $16, " "%%mm0" "              \n\t"
+                            " pmaddwd %%mm5, " "%%mm0" "          \n\t"
+                            " paddd " "%%mm1" ", " "%%mm0" "             \n\t"
+                            " packssdw " "%%mm0" ", " "%%mm0" "          \n\t"
+                            " movd %%mm0, (%0)              \n\t"
+                            " add $4, %0                    \n\t" " add " "$2"
+                            ", %3                 \n\t"
+                            " mov %3, %4                   \n\t" " sub " "%5"
+                            ", %4                 \n\t"
+                            " cmovae %4, %3                \n\t"
+                            "4:                             \n\t"
+                            " sar $1, %2                    \n\t"
+                            " cmp $0, %2                    \n\t"
+                            " je 6f                         \n\t"
+                            "5:                             \n\t"
+                            " movq (%1, %3, 4), %%mm0       \n\t"
+                            " movq 8(%1, %3, 4), %%mm2      \n\t"
+                            " movd (%0), %%mm1              \n\t"
+                            " movd 4(%0), %%mm3             \n\t"
+                            " pxor  %%mm4, %%mm4           \n\t"
+                            " punpcklwd %%mm4, " "%%mm1" "        \n\t"
+                            " pcmpgtw " "%%mm0" ", %%mm4          \n\t"
+                            " pand " "%%mm1" ", %%mm4             \n\t"
+                            " movq " "%%mm1" ", %%mm5             \n\t"
+                            " pmulhw " "%%mm0" ", " "%%mm1" "            \n\t"
+                            " paddw %%mm4, " "%%mm1" "            \n\t"
+                            " psrld $16, " "%%mm0" "              \n\t"
+                            " pmaddwd %%mm5, " "%%mm0" "          \n\t"
+                            " paddd " "%%mm1" ", " "%%mm0" "             \n\t"
+                            " packssdw " "%%mm0" ", " "%%mm0" "          \n\t"
+                            " pxor  %%mm4, %%mm4           \n\t"
+                            " punpcklwd %%mm4, " "%%mm3" "        \n\t"
+                            " pcmpgtw " "%%mm2" ", %%mm4          \n\t"
+                            " pand " "%%mm3" ", %%mm4             \n\t"
+                            " movq " "%%mm3" ", %%mm5             \n\t"
+                            " pmulhw " "%%mm2" ", " "%%mm3" "            \n\t"
+                            " paddw %%mm4, " "%%mm3" "            \n\t"
+                            " psrld $16, " "%%mm2" "              \n\t"
+                            " pmaddwd %%mm5, " "%%mm2" "          \n\t"
+                            " paddd " "%%mm3" ", " "%%mm2" "             \n\t"
+                            " packssdw " "%%mm2" ", " "%%mm2" "          \n\t"
+                            " movd %%mm0, (%0)              \n\t"
+                            " movd %%mm2, 4(%0)             \n\t"
+                            " add $8, %0                    \n\t" " add " "$4"
+                            ", %3                 \n\t"
+                            " mov %3, %4                   \n\t" " sub " "%5"
+                            ", %4                 \n\t"
+                            " cmovae %4, %3                \n\t"
+                            " dec %2                        \n\t"
+                            " jne 5b                        \n\t"
+                            "6:                             \n\t"
+                            " emms                          \n\t":"+r"
+                            (samples), "+r"(volumes), "+r"(length),
+                            "=D"((pa_reg_x86) channel),
+                            "=&r"(temp):"X"((pa_reg_x86) channels):"cc");
+}