e14743d1 |
1 | /* |
2 | SDL - Simple DirectMedia Layer |
3 | Copyright (C) 1997-2009 Sam Lantinga |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | This library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with this library; if not, write to the Free Software |
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
18 | |
19 | Sam Lantinga |
20 | slouken@libsdl.org |
21 | */ |
22 | #include "SDL_config.h" |
23 | |
24 | /* |
25 | MMX assembler version of SDL_MixAudio for signed little endian 16 bit samples and signed 8 bit samples |
26 | Copyright 2002 Stephane Marchesin (stephane.marchesin@wanadoo.fr) |
27 | This code is licensed under the LGPL (see COPYING for details) |
28 | |
29 | Assumes buffer size in bytes is a multiple of 16 |
30 | Assumes SDL_MIX_MAXVOLUME = 128 |
31 | */ |
32 | |
33 | |
34 | /*********************************************** |
35 | * Mixing for 16 bit signed buffers |
36 | ***********************************************/ |
37 | |
38 | #if defined(SDL_BUGGY_MMX_MIXERS) /* buggy, so we're disabling them. --ryan. */ |
39 | #if defined(__GNUC__) && defined(__i386__) && defined(SDL_ASSEMBLY_ROUTINES) |
40 | void SDL_MixAudio_MMX_S16(char* dst,char* src,unsigned int size,int volume) |
41 | { |
42 | __asm__ __volatile__ ( |
43 | |
44 | " movl %3,%%eax\n" /* eax = volume */ |
45 | |
46 | " movl %2,%%edx\n" /* edx = size */ |
47 | |
48 | " shrl $4,%%edx\n" /* process 16 bytes per iteration = 8 samples */ |
49 | |
50 | " jz .endS16\n" |
51 | |
52 | " pxor %%mm0,%%mm0\n" |
53 | |
54 | " movd %%eax,%%mm0\n" |
55 | " movq %%mm0,%%mm1\n" |
56 | " psllq $16,%%mm0\n" |
57 | " por %%mm1,%%mm0\n" |
58 | " psllq $16,%%mm0\n" |
59 | " por %%mm1,%%mm0\n" |
60 | " psllq $16,%%mm0\n" |
61 | " por %%mm1,%%mm0\n" /* mm0 = vol|vol|vol|vol */ |
62 | |
63 | ".align 8\n" |
64 | " .mixloopS16:\n" |
65 | |
66 | " movq (%1),%%mm1\n" /* mm1 = a|b|c|d */ |
67 | |
68 | " movq %%mm1,%%mm2\n" /* mm2 = a|b|c|d */ |
69 | |
70 | " movq 8(%1),%%mm4\n" /* mm4 = e|f|g|h */ |
71 | |
72 |