annotate src/audio/SDL_mixer_MMX.c @ 4168:69bcba65c388 SDL-1.2

Fixed bug #526 Comment #1 From Simon Howard 2009-03-20 16:50:56 Hi, I'm the author of Chocolate Doom, one of the other source ports that James mentioned. This is a patch against the current SVN version of SDL 1.2 that fixes the bug. It has been tested and hopefully should be obviously correct from examining the changes. I'll give a brief explanation. When the palette is set with SDL_SetPalette, the IDirectDrawPalette_SetEntries DirectX function is invoked. However, when this happens, a WM_PALETTECHANGED message is sent to the window. A WM_PALETTECHANGED message can also be received if the palette is changed for some other reason, like if the system palette is changed. Therefore, the palette change handler (DX5_PaletteChanged) has code to deal with this case. It distinguishes "expected" palette changes (set with SDL_SetPalette) from "unexpected" palette changes using the colorchange_expected variable, which is set before calling IDirectDrawPalette_SetEntries. However, the code to set this variable is missing in the fullscreen code path. By setting this variable, the palette change is handled properly and the freezes go away.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 13 Apr 2009 00:53:12 +0000
parents a1b03ba2fcd0
children a8e5b518e194
rev   line source
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
1 /*
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
2 SDL - Simple DirectMedia Layer
4159
a1b03ba2fcd0 Updated copyright date
Sam Lantinga <slouken@libsdl.org>
parents: 1612
diff changeset
3 Copyright (C) 1997-2009 Sam Lantinga
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
4
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
5 This library is free software; you can redistribute it and/or
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
6 modify it under the terms of the GNU Lesser General Public
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
7 License as published by the Free Software Foundation; either
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
8 version 2.1 of the License, or (at your option) any later version.
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
9
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
10 This library is distributed in the hope that it will be useful,
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
13 Lesser General Public License for more details.
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
14
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
15 You should have received a copy of the GNU Lesser General Public
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
16 License along with this library; if not, write to the Free Software
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
18
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
19 Sam Lantinga
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
20 slouken@libsdl.org
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
21 */
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
22 #include "SDL_config.h"
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
23
1019
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
24 /*
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
25 MMX assembler version of SDL_MixAudio for signed little endian 16 bit samples and signed 8 bit samples
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
26 Copyright 2002 Stephane Marchesin (stephane.marchesin@wanadoo.fr)
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
27 This code is licensed under the LGPL (see COPYING for details)
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
28
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
29 Assumes buffer size in bytes is a multiple of 16
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
30 Assumes SDL_MIX_MAXVOLUME = 128
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
31 */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
32
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
33
1019
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
34 /***********************************************
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
35 * Mixing for 16 bit signed buffers
e3b3130f3af8 Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents: 887
diff changeset
36 ***********************************************/
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
37
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1147
diff changeset
38 #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES)
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
39 void SDL_MixAudio_MMX_S16(char* dst,char* src,unsigned int size,int volume)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
40 {
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
41 __asm__ __volatile__ (
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
42
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
43 " movl %3,%%eax\n" /* eax = volume */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
44
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
45 " movl %2,%%edx\n" /* edx = size */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
46
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
47 " shrl $4,%%edx\n" /* process 16 bytes per iteration = 8 samples */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
48
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
49 " jz .endS16\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
50
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
51 " pxor %%mm0,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
52
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
53 " movd %%eax,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
54 " movq %%mm0,%%mm1\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
55 " psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
56 " por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
57 " psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
58 " por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
59 " psllq $16,%%mm0\n"
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
60 " por %%mm1,%%mm0\n" /* mm0 = vol|vol|vol|vol */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
61
1411
efb34e597d21 Fixed assembly alignment error on Intel Macs.
Sam Lantinga <slouken@libsdl.org>
parents: 1402
diff changeset
62 ".align 8\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
63 " .mixloopS16:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
64
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
65 " movq (%1),%%mm1\n" /* mm1 = a|b|c|d */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
66
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
67 " movq %%mm1,%%mm2\n" /* mm2 = a|b|c|d */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
68
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
69 " movq 8(%1),%%mm4\n" /* mm4 = e|f|g|h */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
70
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
71 /* pré charger le buffer dst dans mm7 */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
72 " movq (%0),%%mm7\n" /* mm7 = dst[0] */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
73
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
74 /* multiplier par le volume */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
75 " pmullw %%mm0,%%mm1\n" /* mm1 = l(a*v)|l(b*v)|l(c*v)|l(d*v) */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
76
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
77 " pmulhw %%mm0,%%mm2\n" /* mm2 = h(a*v)|h(b*v)|h(c*v)|h(d*v) */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
78 " movq %%mm4,%%mm5\n" /* mm5 = e|f|g|h */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
79
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
80 " pmullw %%mm0,%%mm4\n" /* mm4 = l(e*v)|l(f*v)|l(g*v)|l(h*v) */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
81
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
82 " pmulhw %%mm0,%%mm5\n" /* mm5 = h(e*v)|h(f*v)|h(g*v)|h(h*v) */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
83 " movq %%mm1,%%mm3\n" /* mm3 = l(a*v)|l(b*v)|l(c*v)|l(d*v) */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
84
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
85 " punpckhwd %%mm2,%%mm1\n" /* mm1 = a*v|b*v */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
86
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
87 " movq %%mm4,%%mm6\n" /* mm6 = l(e*v)|l(f*v)|l(g*v)|l(h*v) */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
88 " punpcklwd %%mm2,%%mm3\n" /* mm3 = c*v|d*v */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
89
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
90 " punpckhwd %%mm5,%%mm4\n" /* mm4 = e*f|f*v */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
91
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
92 " punpcklwd %%mm5,%%mm6\n" /* mm6 = g*v|h*v */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
93
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
94 /* pré charger le buffer dst dans mm5 */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
95 " movq 8(%0),%%mm5\n" /* mm5 = dst[1] */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
96
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
97 /* diviser par 128 */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
98 " psrad $7,%%mm1\n" /* mm1 = a*v/128|b*v/128 , 128 = SDL_MIX_MAXVOLUME */
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
99 " add $16,%1\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
100
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
101 " psrad $7,%%mm3\n" /* mm3 = c*v/128|d*v/128 */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
102
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
103 " psrad $7,%%mm4\n" /* mm4 = e*v/128|f*v/128 */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
104
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
105 /* mm1 = le sample avec le volume modifié */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
106 " packssdw %%mm1,%%mm3\n" /* mm3 = s(a*v|b*v|c*v|d*v) */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
107
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
108 " psrad $7,%%mm6\n" /* mm6= g*v/128|h*v/128 */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
109 " paddsw %%mm7,%%mm3\n" /* mm3 = adjust_volume(src)+dst */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
110
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
111 /* mm4 = le sample avec le volume modifié */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
112 " packssdw %%mm4,%%mm6\n" /* mm6 = s(e*v|f*v|g*v|h*v) */
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
113 " movq %%mm3,(%0)\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
114
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
115 " paddsw %%mm5,%%mm6\n" /* mm6 = adjust_volume(src)+dst */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
116
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
117 " movq %%mm6,8(%0)\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
118
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
119 " add $16,%0\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
120
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
121 " dec %%edx\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
122
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
123 " jnz .mixloopS16\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
124
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
125 " emms\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
126
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
127 ".endS16:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
128 :
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
129 : "r" (dst), "r"(src),"m"(size),
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
130 "m"(volume)
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
131 : "eax","edx","memory"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
132 );
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
133 }
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
134
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
135
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
136
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
137 /*////////////////////////////////////////////// */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
138 /* Mixing for 8 bit signed buffers */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
139 /*////////////////////////////////////////////// */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
140
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
141 void SDL_MixAudio_MMX_S8(char* dst,char* src,unsigned int size,int volume)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
142 {
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
143 __asm__ __volatile__ (
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
144
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
145 " movl %3,%%eax\n" /* eax = volume */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
146
1147
b580f7201543 From: "Alex Volkov" <avcp-sdlmail@usa.net>
Ryan C. Gordon <icculus@icculus.org>
parents: 1019
diff changeset
147 " movd %%eax,%%mm0\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
148 " movq %%mm0,%%mm1\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
149 " psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
150 " por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
151 " psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
152 " por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
153 " psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
154 " por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
155
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
156 " movl %2,%%edx\n" /* edx = size */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
157 " shr $3,%%edx\n" /* process 8 bytes per iteration = 8 samples */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
158
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
159 " cmp $0,%%edx\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
160 " je .endS8\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
161
1411
efb34e597d21 Fixed assembly alignment error on Intel Macs.
Sam Lantinga <slouken@libsdl.org>
parents: 1402
diff changeset
162 ".align 8\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
163 " .mixloopS8:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
164
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
165 " pxor %%mm2,%%mm2\n" /* mm2 = 0 */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
166 " movq (%1),%%mm1\n" /* mm1 = a|b|c|d|e|f|g|h */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
167
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
168 " movq %%mm1,%%mm3\n" /* mm3 = a|b|c|d|e|f|g|h */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
169
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
170 /* on va faire le "sign extension" en faisant un cmp avec 0 qui retourne 1 si <0, 0 si >0 */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
171 " pcmpgtb %%mm1,%%mm2\n" /* mm2 = 11111111|00000000|00000000.... */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
172
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
173 " punpckhbw %%mm2,%%mm1\n" /* mm1 = 0|a|0|b|0|c|0|d */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
174
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
175 " punpcklbw %%mm2,%%mm3\n" /* mm3 = 0|e|0|f|0|g|0|h */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
176 " movq (%0),%%mm2\n" /* mm2 = destination */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
177
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
178 " pmullw %%mm0,%%mm1\n" /* mm1 = v*a|v*b|v*c|v*d */
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
179 " add $8,%1\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
180
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
181 " pmullw %%mm0,%%mm3\n" /* mm3 = v*e|v*f|v*g|v*h */
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
182 " psraw $7,%%mm1\n" /* mm1 = v*a/128|v*b/128|v*c/128|v*d/128 */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
183
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
184 " psraw $7,%%mm3\n" /* mm3 = v*e/128|v*f/128|v*g/128|v*h/128 */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
185
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
186 " packsswb %%mm1,%%mm3\n" /* mm1 = v*a/128|v*b/128|v*c/128|v*d/128|v*e/128|v*f/128|v*g/128|v*h/128 */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
187
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
188 " paddsb %%mm2,%%mm3\n" /* add to destination buffer */
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
189
1612
97d0966f4bf7 Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents: 1411
diff changeset
190 " movq %%mm3,(%0)\n" /* store back to ram */
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
191 " add $8,%0\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
192
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
193 " dec %%edx\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
194
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
195 " jnz .mixloopS8\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
196
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
197 ".endS8:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
198 " emms\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
199 :
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
200 : "r" (dst), "r"(src),"m"(size),
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
201 "m"(volume)
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
202 : "eax","edx","memory"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
203 );
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
204 }
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
205 #endif
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
206