From: Frédéric Recoules <frederic.recoules@xxxxxxxxx> - move 'size' and 'old_ebx' in the output section since they are clobbered; - add the "memory" clobber since input pointers are accessed; - (minor) add the "cc" clobber since flags are clobbered. The compiler is missing some dataflow information about the execution of the assembly chunks. For instance, it assumes that 'size' remains unchanged and that no input pointer is accessed. The compiler optimizer may take advantage of these assumption and produce a wrong code. Note: currently produces the same binary output. Signed-off-by: Frédéric Recoules <frederic.recoules@xxxxxxxxx> --- src/pcm/pcm_dmix_i386.h | 45 +++++++++++++++++---------------------- src/pcm/pcm_dmix_x86_64.h | 27 +++++++++++------------ 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/src/pcm/pcm_dmix_i386.h b/src/pcm/pcm_dmix_i386.h index e816d5e0..3ea0737d 100644 --- a/src/pcm/pcm_dmix_i386.h +++ b/src/pcm/pcm_dmix_i386.h @@ -142,12 +142,11 @@ static void MIX_AREAS_16(unsigned int size, "7:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -233,12 +232,11 @@ static void MIX_AREAS_16_MMX(unsigned int size, "5:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -347,12 +345,11 @@ static void MIX_AREAS_32(unsigned int size, "6:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -454,12 +451,11 @@ static void MIX_AREAS_24(unsigned int size, "6:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -554,11 +550,10 @@ static void MIX_AREAS_24_CMOV(unsigned int size, "6:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } diff --git a/src/pcm/pcm_dmix_x86_64.h b/src/pcm/pcm_dmix_x86_64.h index dc433b35..7f711547 100644 --- a/src/pcm/pcm_dmix_x86_64.h +++ b/src/pcm/pcm_dmix_x86_64.h @@ -114,12 +114,11 @@ static void MIX_AREAS_16(unsigned int size, "\temms\n" "\tmovq %[old_rbx], %%rbx\n" - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_rbx] "=m" (old_rbx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_rbx] "m" (old_rbx) - : "rsi", "rdi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -230,12 +229,11 @@ static void MIX_AREAS_32(unsigned int size, "6:" "\tmovq %[old_rbx], %%rbx\n" - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_rbx] "=m" (old_rbx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_rbx] "m" (old_rbx) - : "rsi", "rdi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -334,11 +332,10 @@ static void MIX_AREAS_24(unsigned int size, "6:" "\tmovq %[old_rbx], %%rbx\n" - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_rbx] "=m" (old_rbx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_rbx] "m" (old_rbx) - : "rsi", "rdi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc" ); } -- 2.17.1