[Top][All Lists]
[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"
);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Bug-indent] indent segfault,
Stephane Marchesin <=