src/audio/SDL_mixer_MMX.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 16 May 2004 17:19:48 +0000
changeset 887 b4b64bb88f2f
parent 539 a9e38f3b8e4d
child 1019 e3b3130f3af8
permissions -rw-r--r--
Date: Mon, 10 May 2004 10:17:46 -0400 From: Mike Frysinger Subject: Re: [SDL] gcc-3.4.0 / PIC fix here's a combined patch (yours and the one i mentioned earlier) that i tested with gcc-3.4.0 and gcc-3.3.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     1
// MMX assembler version of SDL_MixAudio for signed little endian 16 bit samples and signed 8 bit samples
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     2
// Copyright 2002 Stephane Marchesin (stephane.marchesin@wanadoo.fr)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     3
// This code is licensed under the LGPL (see COPYING for details)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     4
// 
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     5
// Assumes buffer size in bytes is a multiple of 16
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     6
// Assumes SDL_MIX_MAXVOLUME = 128
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     7
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     8
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     9
////////////////////////////////////////////////
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    10
// Mixing for 16 bit signed buffers
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    11
////////////////////////////////////////////////
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    12
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    13
#if defined(i386) && defined(__GNUC__) && defined(USE_ASMBLIT)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    14
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
    15
{
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    16
    __asm__ __volatile__ (
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    17
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    18
"	movl %3,%%eax\n"	// eax = volume
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    19
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    20
"	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
    21
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    22
"	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
    23
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    24
"	jz .endS16\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    25
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    26
"	pxor %%mm0,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    27
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    28
"	movd %%eax,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    29
"	movq %%mm0,%%mm1\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    30
"	psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    31
"	por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    32
"	psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    33
"	por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    34
"	psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    35
"	por %%mm1,%%mm0\n"		// mm0 = vol|vol|vol|vol
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    36
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    37
".align 16\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    38
"	.mixloopS16:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    39
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    40
"	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
    41
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    42
"	movq %%mm1,%%mm2\n" // mm2 = a|b|c|d
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    43
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    44
"	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
    45
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    46
	// pré charger le buffer dst dans mm7
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    47
"	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
    48
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    49
	// multiplier par le volume
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    50
"	pmullw %%mm0,%%mm1\n" // mm1 = l(a*v)|l(b*v)|l(c*v)|l(d*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    51
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    52
"	pmulhw %%mm0,%%mm2\n" // mm2 = h(a*v)|h(b*v)|h(c*v)|h(d*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    53
"	movq %%mm4,%%mm5\n" // mm5 = e|f|g|h
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    54
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    55
"	pmullw %%mm0,%%mm4\n" // mm4 = l(e*v)|l(f*v)|l(g*v)|l(h*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    56
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    57
"	pmulhw %%mm0,%%mm5\n" // mm5 = h(e*v)|h(f*v)|h(g*v)|h(h*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    58
"	movq %%mm1,%%mm3\n" // mm3 = l(a*v)|l(b*v)|l(c*v)|l(d*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    59
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    60
"	punpckhwd %%mm2,%%mm1\n" // mm1 = a*v|b*v
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    61
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    62
"	movq %%mm4,%%mm6\n" // mm6 = l(e*v)|l(f*v)|l(g*v)|l(h*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    63
"	punpcklwd %%mm2,%%mm3\n" // mm3 = c*v|d*v
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    64
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    65
"	punpckhwd %%mm5,%%mm4\n" // mm4 = e*f|f*v
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    66
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    67
"	punpcklwd %%mm5,%%mm6\n" // mm6 = g*v|h*v
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    68
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    69
	// pré charger le buffer dst dans mm5
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    70
"	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
    71
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    72
	// diviser par 128
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    73
"	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
    74
"	add $16,%1\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    75
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    76
"	psrad $7,%%mm3\n" // mm3 = c*v/128|d*v/128
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    77
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    78
"	psrad $7,%%mm4\n" // mm4 = e*v/128|f*v/128
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    79
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    80
	// mm1 = le sample avec le volume modifié
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    81
"	packssdw %%mm1,%%mm3\n" // mm3 = s(a*v|b*v|c*v|d*v)
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    82
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    83
"	psrad $7,%%mm6\n" // mm6= g*v/128|h*v/128
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    84
"	paddsw %%mm7,%%mm3\n" // mm3 = adjust_volume(src)+dst
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    85
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    86
	// mm4 = le sample avec le volume modifié
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    87
"	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
    88
"	movq %%mm3,(%0)\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    89
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    90
"	paddsw %%mm5,%%mm6\n" // mm6 = adjust_volume(src)+dst
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    91
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    92
"	movq %%mm6,8(%0)\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    93
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    94
"	add $16,%0\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    95
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
    96
"	dec %%edx\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    97
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    98
"	jnz .mixloopS16\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    99
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   100
"	emms\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   101
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   102
".endS16:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   103
	 :
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   104
	 : "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
   105
	 "m"(volume)
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   106
	 : "eax","edx","memory"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   107
	 );
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   108
}
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   109
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   110
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   111
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   112
////////////////////////////////////////////////
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   113
// Mixing for 8 bit signed buffers
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   114
////////////////////////////////////////////////
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   115
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   116
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
   117
{
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   118
    __asm__ __volatile__ (
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   119
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   120
"	movl %3,%%eax\n"	// eax = volume
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   121
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   122
"	movd %%edx,%%mm0\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   123
"	movq %%mm0,%%mm1\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   124
"	psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   125
"	por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   126
"	psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   127
"	por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   128
"	psllq $16,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   129
"	por %%mm1,%%mm0\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   130
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   131
"	movl %2,%%edx\n"	// edx = size
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   132
"	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
   133
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   134
"	cmp $0,%%edx\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   135
"	je .endS8\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   136
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   137
".align 16\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   138
"	.mixloopS8:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   139
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   140
"	pxor %%mm2,%%mm2\n"		// mm2 = 0
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   141
"	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
   142
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   143
"	movq %%mm1,%%mm3\n" 	// mm3 = a|b|c|d|e|f|g|h
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   144
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   145
	// on va faire le "sign extension" en faisant un cmp avec 0 qui retourne 1 si <0, 0 si >0
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   146
"	pcmpgtb %%mm1,%%mm2\n"	// mm2 = 11111111|00000000|00000000....
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   147
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   148
"	punpckhbw %%mm2,%%mm1\n"	// mm1 = 0|a|0|b|0|c|0|d
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   149
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   150
"	punpcklbw %%mm2,%%mm3\n"	// mm3 = 0|e|0|f|0|g|0|h
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   151
"	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
   152
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   153
"	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
   154
"	add $8,%1\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   155
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   156
"	pmullw %%mm0,%%mm3\n"	// mm3 = v*e|v*f|v*g|v*h
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   157
"	psraw $7,%%mm1\n"		// mm1 = v*a/128|v*b/128|v*c/128|v*d/128 
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   158
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   159
"	psraw $7,%%mm3\n"		// mm3 = v*e/128|v*f/128|v*g/128|v*h/128
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   160
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   161
"	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
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   162
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   163
"	paddsb %%mm2,%%mm3\n"	// add to destination buffer
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   164
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   165
"	movq %%mm3,(%0)\n"	// store back to ram
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   166
"	add $8,%0\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   167
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   168
"	dec %%edx\n"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   169
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   170
"	jnz .mixloopS8\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   171
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   172
".endS8:\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   173
"	emms\n"
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   174
	 :
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   175
	 : "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
   176
	 "m"(volume)
887
b4b64bb88f2f Date: Mon, 10 May 2004 10:17:46 -0400
Sam Lantinga <slouken@libsdl.org>
parents: 539
diff changeset
   177
	 : "eax","edx","memory"
539
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   178
	 );
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   179
}
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   180
#endif
a9e38f3b8e4d Added MMX audio mixing code for gcc (thanks Stephane!)
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   181