bug-indent
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-indent] indent segfault


From: Stephane Marchesin
Subject: [Bug-indent] indent segfault
Date: Sat, 24 Aug 2002 23:20:54 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1b) Gecko/20020722

Hi,

First, I hope I'm sending it to the right place.
I came across a piece of c code that crashes indent including version 2.2.8 (maybe because it has some embedded asm?). The code is attached.
Hope this will be of some help to you.

Stephane
void mix_audio (char *srca, char *srcb, char *dst, unsigned int len, int volume)
{
        int dummy;
        __asm__ (
        "
        shrl $4,%ebx            # process 16 bytes per iteration = 8 samples

        jz .endS16

        pxor %mm0,%mm0
        
        movd %eax,%mm0
        movq %mm0,%mm1
        psllq $16,%mm0
        por %mm1,%mm0
        psllq $16,%mm0
        por %mm1,%mm0
        psllq $16,%mm0
        por %mm1,%mm0           # mm0 = vol|vol|vol|vol

.align 16
        .mixloopS16:

        movq (%esi),%mm1 # mm1 = a|b|c|d

        movq %mm1,%mm2 # mm2 = a|b|c|d
        
        movq 8(%esi),%mm4 # mm4 = e|f|g|h
        
        // pré charger le buffer dst dans mm7
        movq (%edi),%mm7 # mm7 = dst[0]
        
        // multiplier par le volume
        pmullw %mm0,%mm1 # mm1 = l(a*v)|l(b*v)|l(c*v)|l(d*v)
        
        pmulhw %mm0,%mm2 # mm2 = h(a*v)|h(b*v)|h(c*v)|h(d*v)
        movq %mm4,%mm5 # mm5 = e|f|g|h
        
        pmullw %mm0,%mm4 # mm4 = l(e*v)|l(f*v)|l(g*v)|l(h*v)
        
        pmulhw %mm0,%mm5 # mm5 = h(e*v)|h(f*v)|h(g*v)|h(h*v)
        movq %mm1,%mm3 # mm3 = l(a*v)|l(b*v)|l(c*v)|l(d*v)
        
        punpckhwd %mm2,%mm1 # mm1 = a*v|b*v
        
        movq %mm4,%mm6 # mm6 = l(e*v)|l(f*v)|l(g*v)|l(h*v)
        punpcklwd %mm2,%mm3 # mm3 = c*v|d*v
        
        punpckhwd %mm5,%mm4 # mm4 = e*f|f*v
        
        punpcklwd %mm5,%mm6 # mm6 = g*v|h*v
        
        // pré charger le buffer dst dans mm5
        movq 8(%edi),%mm5 # mm5 = dst[1]
                
        // diviser par 128
        psrad $7,%mm1 # mm1 = a*v/128|b*v/128 , 128 = SDL_MIX_MAXVOLUME
        addl $16,%esi
        
        psrad $7,%mm3 # mm3 = c*v/128|d*v/128
        
        psrad $7,%mm4 # mm4 = e*v/128|f*v/128
        
        // mm1 = le sample avec le volume modifié
        packssdw %mm1,%mm3 # mm3 = s(a*v|b*v|c*v|d*v)
                
        psrad $7,%mm6 # mm6= g*v/128|h*v/128
        paddsw %mm7,%mm3 # mm3 = adjust_volume(src)+dst
                
        // mm4 = le sample avec le volume modifié
        packssdw %mm4,%mm6 # mm6 = s(e*v|f*v|g*v|h*v)
        movq %mm3,(%edx)
                
        paddsw %mm5,%mm6 # mm6 = adjust_volume(src)+dst

        movq %mm6,8(%edx)
        
        addl $16,%edi
        addl $16,%edx

        dec %ebx

        jnz .mixloopS16

        emms
        
.endS16:
        "
        : "=b" (dummy)
        : "D" (srca), "S" (srcb), "d" (dst), "b" (len), "a" (volume)
        : "cc", "memory"
        );
}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]