annotate mp3lib/tabinit_MMX.c @ 22997:fd0fda0c6555

skip MMX code in rgb24tobgr24 if the size of the input is smaller than the size of the units the MMX code processes
author ivo
date Wed, 18 Apr 2007 09:27:59 +0000
parents d6e342ac2363
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4140
nick
parents:
diff changeset
1 /*
nick
parents:
diff changeset
2 * This code was taken from http://www.mpg123.org
nick
parents:
diff changeset
3 * See ChangeLog of mpg123-0.59s-pre.1 for detail
nick
parents:
diff changeset
4 * Applied to mplayer by Nick Kurshev <nickols_k@mail.ru>
nick
parents:
diff changeset
5 */
16989
e7a129082fda Unify include paths, -I.. is in CFLAGS.
diego
parents: 12303
diff changeset
6 #include "config.h"
e7a129082fda Unify include paths, -I.. is in CFLAGS.
diego
parents: 12303
diff changeset
7 #include "mangle.h"
4140
nick
parents:
diff changeset
8
8560
1320f1b3229d fixing that f*cking linker 'bug' e.g. naming config with libmp3lame
alex
parents: 8544
diff changeset
9 long __attribute__((aligned(8))) mp3lib_decwins [544];
4140
nick
parents:
diff changeset
10
8544
94564cc01c07 don't redefine decwin as static
arpi
parents: 4246
diff changeset
11 #define real float
8560
1320f1b3229d fixing that f*cking linker 'bug' e.g. naming config with libmp3lame
alex
parents: 8544
diff changeset
12 extern real mp3lib_decwin[(512+32)];
8544
94564cc01c07 don't redefine decwin as static
arpi
parents: 4246
diff changeset
13 // static long decwin [544];
94564cc01c07 don't redefine decwin as static
arpi
parents: 4246
diff changeset
14
12292
114f3d149324 attribute_used for gcc3.4
alex
parents: 8560
diff changeset
15 static short attribute_used intwinbase_MMX[] =
4140
nick
parents:
diff changeset
16 {
nick
parents:
diff changeset
17 0, -1, -1, -1, -1, -1, -1, -2,
nick
parents:
diff changeset
18 -2, -2, -2, -3, -3, -4, -4, -5,
nick
parents:
diff changeset
19 -5, -6, -7, -7, -8, -9, -10, -11,
nick
parents:
diff changeset
20 -13, -14, -16, -17, -19, -21, -24, -26,
nick
parents:
diff changeset
21 -29, -31, -35, -38, -41, -45, -49, -53,
nick
parents:
diff changeset
22 -58, -63, -68, -73, -79, -85, -91, -97,
nick
parents:
diff changeset
23 -104, -111, -117, -125, -132, -139, -147, -154,
nick
parents:
diff changeset
24 -161, -169, -176, -183, -190, -196, -202, -208,
nick
parents:
diff changeset
25 -213, -218, -222, -225, -227, -228, -228, -227,
nick
parents:
diff changeset
26 -224, -221, -215, -208, -200, -189, -177, -163,
nick
parents:
diff changeset
27 -146, -127, -106, -83, -57, -29, 2, 36,
nick
parents:
diff changeset
28 72, 111, 153, 197, 244, 294, 347, 401,
nick
parents:
diff changeset
29 459, 519, 581, 645, 711, 779, 848, 919,
nick
parents:
diff changeset
30 991, 1064, 1137, 1210, 1283, 1356, 1428, 1498,
nick
parents:
diff changeset
31 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962,
nick
parents:
diff changeset
32 2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063,
nick
parents:
diff changeset
33 2037, 2000, 1952, 1893, 1822, 1739, 1644, 1535,
nick
parents:
diff changeset
34 1414, 1280, 1131, 970, 794, 605, 402, 185,
nick
parents:
diff changeset
35 -45, -288, -545, -814, -1095, -1388, -1692, -2006,
nick
parents:
diff changeset
36 -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
nick
parents:
diff changeset
37 -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597,
nick
parents:
diff changeset
38 -7910, -8209, -8491, -8755, -8998, -9219, -9416, -9585,
nick
parents:
diff changeset
39 -9727, -9838, -9916, -9959, -9966, -9935, -9863, -9750,
nick
parents:
diff changeset
40 -9592, -9389, -9139, -8840, -8492, -8092, -7640, -7134,
nick
parents:
diff changeset
41 -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082,
nick
parents:
diff changeset
42 -70, 998, 2122, 3300, 4533, 5818, 7154, 8540,
nick
parents:
diff changeset
43 9975, 11455, 12980, 14548, 16155, 17799, 19478, 21189,
nick
parents:
diff changeset
44 22929, 24694, 26482, 28289, 30112, 31947,-26209,-24360,
nick
parents:
diff changeset
45 -22511,-20664,-18824,-16994,-15179,-13383,-11610, -9863,
nick
parents:
diff changeset
46 -8147, -6466, -4822, -3222, -1667, -162, 1289, 2684,
nick
parents:
diff changeset
47 4019, 5290, 6494, 7629, 8692, 9679, 10590, 11420,
nick
parents:
diff changeset
48 12169, 12835, 13415, 13908, 14313, 14630, 14856, 14992,
nick
parents:
diff changeset
49 15038
nick
parents:
diff changeset
50 };
nick
parents:
diff changeset
51
12303
f881c918739b attribute_used patch by (VMiklos <mamajom at axelero dot hu>)
michael
parents: 12292
diff changeset
52 static long attribute_used intwindiv = 0x47800000;
4140
nick
parents:
diff changeset
53
nick
parents:
diff changeset
54 void make_decode_tables_MMX(long scaleval)
nick
parents:
diff changeset
55 {
4141
nick
parents: 4140
diff changeset
56 long intwinbase_step;
nick
parents: 4140
diff changeset
57 intwinbase_step=2;
4140
nick
parents:
diff changeset
58 scaleval =- scaleval;
nick
parents:
diff changeset
59 __asm __volatile(
nick
parents:
diff changeset
60 "xorl %%ecx,%%ecx\n\t"
nick
parents:
diff changeset
61 "xorl %%ebx,%%ebx\n\t"
nick
parents:
diff changeset
62 "movl $32,%%esi\n\t"
nick
parents:
diff changeset
63 "movl %0,%%edi\n\t"
nick
parents:
diff changeset
64 ".L00:\n\t"
nick
parents:
diff changeset
65 "cmpl $528,%%ecx\n\t"
nick
parents:
diff changeset
66 "jnc .L02\n\t"
nick
parents:
diff changeset
67 "movswl (%%edi),%%eax\n\t"
nick
parents:
diff changeset
68 "cmpl %0+444,%%edi\n\t"
nick
parents:
diff changeset
69 "jc .L01\n\t"
nick
parents:
diff changeset
70 "addl $60000,%%eax\n\t"
nick
parents:
diff changeset
71 ".L01:\n\t"
nick
parents:
diff changeset
72 "pushl %%eax\n\t"
nick
parents:
diff changeset
73 "fildl (%%esp)\n\t"
4246
3f677202418b mangling in mp3lib + stdcall undefined fix with cygwin
atmos4
parents: 4141
diff changeset
74 "fdivs "MANGLE(intwindiv)"\n\t"
4140
nick
parents:
diff changeset
75 "popl %%eax\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
76 "fimull %1\n\t"
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
77 "fsts "MANGLE(mp3lib_decwin)"(,%%ecx,4)\n\t"
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
78 "fstps "MANGLE(mp3lib_decwin)"+64(,%%ecx,4)\n\t"
4140
nick
parents:
diff changeset
79 ".L02:\n\t"
nick
parents:
diff changeset
80 "leal -1(%%esi),%%edx\n\t"
nick
parents:
diff changeset
81 "and %%ebx,%%edx\n\t"
nick
parents:
diff changeset
82 "cmp $31,%%edx\n\t"
nick
parents:
diff changeset
83 "jnz .L03\n\t"
nick
parents:
diff changeset
84 "addl $-1023,%%ecx\n\t"
nick
parents:
diff changeset
85 "test %%esi,%%ebx\n\t"
nick
parents:
diff changeset
86 "jz .L03\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
87 "negl %1\n\t"
4140
nick
parents:
diff changeset
88 ".L03:\n\t"
nick
parents:
diff changeset
89 "addl %%esi,%%ecx\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
90 "addl %2,%%edi\n\t"
4140
nick
parents:
diff changeset
91 "incl %%ebx\n\t"
nick
parents:
diff changeset
92 "cmpl %0,%%edi\n\t"
nick
parents:
diff changeset
93 "jz .L04\n\t"
nick
parents:
diff changeset
94 "cmp $256,%%ebx\n\t"
nick
parents:
diff changeset
95 "jnz .L00\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
96 "negl %2\n\t"
4140
nick
parents:
diff changeset
97 "jmp .L00\n\t"
nick
parents:
diff changeset
98 ".L04:\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
99 ::"g"(intwinbase_MMX),"m"(scaleval),"m"(intwinbase_step)
21027
c26154fca245 Fix clobber list, half of the modified registers were missing.
reimar
parents: 16989
diff changeset
100 :"memory","%eax","%ebx","%ecx","%edx","%esi","%edi");
4141
nick
parents: 4140
diff changeset
101 intwinbase_step=2;
4140
nick
parents:
diff changeset
102 __asm __volatile(
nick
parents:
diff changeset
103 "xorl %%ecx,%%ecx\n\t"
nick
parents:
diff changeset
104 "xorl %%ebx,%%ebx\n\t"
nick
parents:
diff changeset
105 ".L05:\n\t"
nick
parents:
diff changeset
106 "cmpl $528,%%ecx\n\t"
nick
parents:
diff changeset
107 "jnc .L11\n\t"
nick
parents:
diff changeset
108 "movswl (%%edi),%%eax\n\t"
nick
parents:
diff changeset
109 "cmpl %0+444,%%edi\n\t"
nick
parents:
diff changeset
110 "jc .L06\n\t"
nick
parents:
diff changeset
111 "addl $60000,%%eax\n\t"
nick
parents:
diff changeset
112 ".L06:\n\t"
nick
parents:
diff changeset
113 "cltd\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
114 "imull %1\n\t"
4140
nick
parents:
diff changeset
115 "shrdl $17,%%edx,%%eax\n\t"
nick
parents:
diff changeset
116 "cmpl $32767,%%eax\n\t"
nick
parents:
diff changeset
117 "movl $1055,%%edx\n\t"
nick
parents:
diff changeset
118 "jle .L07\n\t"
nick
parents:
diff changeset
119 "movl $32767,%%eax\n\t"
nick
parents:
diff changeset
120 "jmp .L08\n\t"
nick
parents:
diff changeset
121 ".L07:\n\t"
nick
parents:
diff changeset
122 "cmpl $-32767,%%eax\n\t"
nick
parents:
diff changeset
123 "jge .L08\n\t"
nick
parents:
diff changeset
124 "movl $-32767,%%eax\n\t"
nick
parents:
diff changeset
125 ".L08:\n\t"
nick
parents:
diff changeset
126 "cmpl $512,%%ecx\n\t"
nick
parents:
diff changeset
127 "jnc .L09\n\t"
nick
parents:
diff changeset
128 "subl %%ecx,%%edx\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
129 "movw %%ax,"MANGLE(mp3lib_decwins)"(,%%edx,2)\n\t"
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
130 "movw %%ax,"MANGLE(mp3lib_decwins)"-32(,%%edx,2)\n\t"
4140
nick
parents:
diff changeset
131 ".L09:\n\t"
nick
parents:
diff changeset
132 "testl $1,%%ecx\n\t"
nick
parents:
diff changeset
133 "jnz .L10\n\t"
nick
parents:
diff changeset
134 "negl %%eax\n\t"
nick
parents:
diff changeset
135 ".L10:\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
136 "movw %%ax,"MANGLE(mp3lib_decwins)"(,%%ecx,2)\n\t"
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
137 "movw %%ax,"MANGLE(mp3lib_decwins)"+32(,%%ecx,2)\n\t"
4140
nick
parents:
diff changeset
138 ".L11:\n\t"
nick
parents:
diff changeset
139 "leal -1(%%esi),%%edx\n\t"
nick
parents:
diff changeset
140 "and %%ebx,%%edx\n\t"
nick
parents:
diff changeset
141 "cmp $31,%%edx\n\t"
nick
parents:
diff changeset
142 "jnz .L12\n\t"
nick
parents:
diff changeset
143 "addl $-1023,%%ecx\n\t"
nick
parents:
diff changeset
144 "test %%esi,%%ebx\n\t"
nick
parents:
diff changeset
145 "jz .L12\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
146 "negl %1\n\t"
4140
nick
parents:
diff changeset
147 ".L12:\n\t"
nick
parents:
diff changeset
148 "addl %%esi,%%ecx\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
149 "addl %2,%%edi\n\t"
4140
nick
parents:
diff changeset
150 "incl %%ebx\n\t"
nick
parents:
diff changeset
151 "cmpl %0,%%edi\n\t"
nick
parents:
diff changeset
152 "jz .L13\n\t"
nick
parents:
diff changeset
153 "cmp $256,%%ebx\n\t"
nick
parents:
diff changeset
154 "jnz .L05\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
155 "negl %2\n\t"
4140
nick
parents:
diff changeset
156 "jmp .L05\n\t"
nick
parents:
diff changeset
157 ".L13:\n\t"
21044
d6e342ac2363 Avoid code like "fstps %1+64(,%%ecx,4)\n\t", it might end up as
reimar
parents: 21027
diff changeset
158 ::"g"(intwinbase_MMX),"m"(scaleval),"m"(intwinbase_step)
21027
c26154fca245 Fix clobber list, half of the modified registers were missing.
reimar
parents: 16989
diff changeset
159 :"memory","%eax","%ebx","%ecx","%edx","%esi","%edi");
4140
nick
parents:
diff changeset
160 }