[linux-audio-dev] Re: Fixing Freeverb and Denormals

Neil Klepeis nklepeis at sbcglobal.net
Fri Jan 21 23:08:50 UTC 2005


Erik de Castro Lopo wrote:
>>static inline float
>>undenormalise(volatile float s)
>>{
>>    s += 9.8607615E-32f;
>>    return s - 9.8607615E-32f;
>>}
> That looks OK to me, and the optimiser should not discard it because s 
> is volatile. Have you looked at the assembler output?

I used this new function and set all undenormalize calls in the freeverb 
source code to the form:
x = undenormalize(x)

The problem is MUCH better, now the DSP% only hits 60% instead of 
zooming past 80-90%, and ardour doesn't zombify.  Almost useful...  But 
I do get xruns.  There must be some other place where undenormalize 
needs to be called, or perhaps the new inline function is still not 
working quite right.

> The static inline function you have above should be OK. Look at the 
> assembler output (use gcc -S to generate assembler) to make sure that 
> the addition and subtraction isn't being optimised out.

What exactly am I looking for?  After using g++ -S, the allpass.o file, 
for example, starts out with:

         .file   "allpass.cpp"
         .text
         .align 2
         .p2align 2,,3
.globl _ZN7allpassC2Ev
         .type   _ZN7allpassC2Ev, @function
_ZN7allpassC2Ev:
.LFB11:
         pushl   %ebp
.LCFI0:
         movl    %esp, %ebp

[snip]



Thanks for your help!

Neil






More information about the Linux-audio-dev mailing list