mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-24 07:00:01 -05:00
pcm: dmix: assembly: refactor the PIC mode
Newer versions of GCC (> 5.0) accept that ebx is declared
in the clobber list even in PIC mode. Meanwhile, even
unlikely, the compiler may use ebx as base address of
one of the memory entry, making subsequent access to
them unreliable ('size', 'dst_step', 'src_step', 'sum_step').
Adding ebx in the clobber solves the problem.
By the way, the entry 'old_ebx' is no longer required.
Signed-off-by: Frédéric Recoules <frederic.recoules@orange.fr>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
0fd7f0cdc5
commit
79c6ba99c4
2 changed files with 120 additions and 32 deletions
|
|
@ -27,6 +27,10 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__)
|
||||
# define BOUNDED_RBX
|
||||
#endif
|
||||
|
||||
/*
|
||||
* MMX optimized
|
||||
*/
|
||||
|
|
@ -35,8 +39,9 @@ static void MIX_AREAS_16(unsigned int size,
|
|||
volatile signed int *sum, size_t dst_step,
|
||||
size_t src_step, size_t sum_step)
|
||||
{
|
||||
#ifdef BOUNDED_RBX
|
||||
unsigned long long old_rbx;
|
||||
|
||||
#endif
|
||||
/*
|
||||
* RSI - src
|
||||
* RDI - dst
|
||||
|
|
@ -47,8 +52,9 @@ static void MIX_AREAS_16(unsigned int size,
|
|||
*/
|
||||
__asm__ __volatile__ (
|
||||
"\n"
|
||||
|
||||
#ifdef BOUNDED_RBX
|
||||
"\tmovq %%rbx, %[old_rbx]\n"
|
||||
#endif
|
||||
/*
|
||||
* initialization, load RSI, RDI, RBX registers
|
||||
*/
|
||||
|
|
@ -112,13 +118,20 @@ static void MIX_AREAS_16(unsigned int size,
|
|||
"6:"
|
||||
|
||||
"\temms\n"
|
||||
#ifdef BOUNDED_RBX
|
||||
"\tmovq %[old_rbx], %%rbx\n"
|
||||
|
||||
: [size] "+m" (size), [old_rbx] "=m" (old_rbx)
|
||||
#endif
|
||||
: [size] "+m" (size)
|
||||
#ifdef BOUNDED_RBX
|
||||
, [old_rbx] "=m" (old_rbx)
|
||||
#endif
|
||||
: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
|
||||
[dst_step] "m" (dst_step), [src_step] "m" (src_step),
|
||||
[sum_step] "m" (sum_step)
|
||||
: "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc"
|
||||
#ifndef BOUNDED_RBX
|
||||
, "rbx"
|
||||
#endif
|
||||
#ifdef HAVE_MMX
|
||||
, "mm0"
|
||||
#else
|
||||
|
|
@ -136,8 +149,9 @@ static void MIX_AREAS_32(unsigned int size,
|
|||
volatile signed int *sum, size_t dst_step,
|
||||
size_t src_step, size_t sum_step)
|
||||
{
|
||||
#ifdef BOUNDED_RBX
|
||||
unsigned long long old_rbx;
|
||||
|
||||
#endif
|
||||
/*
|
||||
* RSI - src
|
||||
* RDI - dst
|
||||
|
|
@ -148,8 +162,9 @@ static void MIX_AREAS_32(unsigned int size,
|
|||
*/
|
||||
__asm__ __volatile__ (
|
||||
"\n"
|
||||
|
||||
#ifdef BOUNDED_RBX
|
||||
"\tmovq %%rbx, %[old_rbx]\n"
|
||||
#endif
|
||||
/*
|
||||
* initialization, load RSI, RDI, RBX registers
|
||||
*/
|
||||
|
|
@ -233,13 +248,20 @@ static void MIX_AREAS_32(unsigned int size,
|
|||
"\tjnz 1b\n"
|
||||
|
||||
"6:"
|
||||
#ifdef BOUNDED_RBX
|
||||
"\tmovq %[old_rbx], %%rbx\n"
|
||||
|
||||
: [size] "+m" (size), [old_rbx] "=m" (old_rbx)
|
||||
#endif
|
||||
: [size] "+m" (size)
|
||||
#ifdef BOUNDED_RBX
|
||||
, [old_rbx] "=m" (old_rbx)
|
||||
#endif
|
||||
: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
|
||||
[dst_step] "m" (dst_step), [src_step] "m" (src_step),
|
||||
[sum_step] "m" (sum_step)
|
||||
: "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc"
|
||||
#ifndef BOUNDED_RBX
|
||||
, "rbx"
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -251,8 +273,9 @@ static void MIX_AREAS_24(unsigned int size,
|
|||
volatile signed int *sum, size_t dst_step,
|
||||
size_t src_step, size_t sum_step)
|
||||
{
|
||||
#ifdef BOUNDED_RBX
|
||||
unsigned long long old_rbx;
|
||||
|
||||
#endif
|
||||
/*
|
||||
* RSI - src
|
||||
* RDI - dst
|
||||
|
|
@ -263,8 +286,9 @@ static void MIX_AREAS_24(unsigned int size,
|
|||
*/
|
||||
__asm__ __volatile__ (
|
||||
"\n"
|
||||
|
||||
#ifdef BOUNDED_RBX
|
||||
"\tmovq %%rbx, %[old_rbx]\n"
|
||||
#endif
|
||||
/*
|
||||
* initialization, load RSI, RDI, RBX registers
|
||||
*/
|
||||
|
|
@ -336,12 +360,23 @@ static void MIX_AREAS_24(unsigned int size,
|
|||
"\tjnz 1b\n"
|
||||
|
||||
"6:"
|
||||
#ifdef BOUNDED_RBX
|
||||
"\tmovq %[old_rbx], %%rbx\n"
|
||||
|
||||
: [size] "+m" (size), [old_rbx] "=m" (old_rbx)
|
||||
#endif
|
||||
: [size] "+m" (size)
|
||||
#ifdef BOUNDED_RBX
|
||||
, [old_rbx] "=m" (old_rbx)
|
||||
#endif
|
||||
: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
|
||||
[dst_step] "m" (dst_step), [src_step] "m" (src_step),
|
||||
[sum_step] "m" (sum_step)
|
||||
: "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc"
|
||||
#ifndef BOUNDED_RBX
|
||||
, "rbx"
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
#ifdef BOUNDED_RBX
|
||||
# undef BOUNDED_RBX
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue