[PD-cvs] pd/src d_filter.c,1.3.4.3,1.3.4.4
Tim Blechmann
timblech at users.sourceforge.net
Wed Jun 22 20:47:54 CEST 2005
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6391
Modified Files:
Tag: devel_0_38
d_filter.c
Log Message:
unrolled biquad and relaxed denormal bashing
Index: d_filter.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/d_filter.c,v
retrieving revision 1.3.4.3
retrieving revision 1.3.4.4
diff -C2 -d -r1.3.4.3 -r1.3.4.4
*** d_filter.c 21 May 2005 13:08:13 -0000 1.3.4.3
--- d_filter.c 22 Jun 2005 18:47:52 -0000 1.3.4.4
***************
*** 399,402 ****
--- 399,472 ----
}
+ /* tb: some loop unrolling & do some relaxed denormal bashing */
+ #if 1
+ static t_int *sigbiquad_perf8(t_int *w)
+ {
+ float *in = (float *)(w[1]);
+ float *out = (float *)(w[2]);
+ t_biquadctl *c = (t_biquadctl *)(w[3]);
+ int n = (t_int)(w[4])>>3;
+ int i;
+ float last = c->c_x1;
+ float prev = c->c_x2;
+ float fb1 = c->c_fb1;
+ float fb2 = c->c_fb2;
+ float ff1 = c->c_ff1;
+ float ff2 = c->c_ff2;
+ float ff3 = c->c_ff3;
+ for (i = 0; i < n; i++)
+ {
+ float output = *in++ + fb1 * last + fb2 * prev;
+ #ifdef __i386__
+ output += 1e-10; /* quantizing should be faster than PD_BIGORSMALL */
+ output -= 1e-10; /* only doing this every 8th sample should be ok */
+ #endif
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ output += 1e-10;
+ output -= 1e-10;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+
+ output = *in++ + fb1 * last + fb2 * prev;
+ *out++ = ff1 * output + ff2 * last + ff3 * prev;
+ prev = last;
+ last = output;
+ }
+ c->c_x1 = last;
+ c->c_x2 = prev;
+ return (w+5);
+ }
+ #endif
+
static void sigbiquad_list(t_sigbiquad *x, t_symbol *s, int argc, t_atom *argv)
{
***************
*** 442,449 ****
static void sigbiquad_dsp(t_sigbiquad *x, t_signal **sp)
{
dsp_add(sigbiquad_perform, 4,
sp[0]->s_vec, sp[1]->s_vec,
x->x_ctl, sp[0]->s_n);
!
}
--- 512,530 ----
static void sigbiquad_dsp(t_sigbiquad *x, t_signal **sp)
{
+ #if 1
+ const int n = sp[0]->s_n;
+ if (n&7)
+ dsp_add(sigbiquad_perform, 4,
+ sp[0]->s_vec, sp[1]->s_vec,
+ x->x_ctl, sp[0]->s_n);
+ else
+ dsp_add(sigbiquad_perf8, 4,
+ sp[0]->s_vec, sp[1]->s_vec,
+ x->x_ctl, sp[0]->s_n);
+ #else
dsp_add(sigbiquad_perform, 4,
sp[0]->s_vec, sp[1]->s_vec,
x->x_ctl, sp[0]->s_n);
! #endif
}
More information about the Pd-cvs
mailing list