Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv916
Modified Files: Tag: devel_0_37 d_global.c Log Message: loop unrolling for catch~, receive~
Index: d_global.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/d_global.c,v retrieving revision 1.1.1.2.8.3 retrieving revision 1.1.1.2.8.4 diff -C2 -d -r1.1.1.2.8.3 -r1.1.1.2.8.4 *** d_global.c 23 Jul 2004 08:46:40 -0000 1.1.1.2.8.3 --- d_global.c 3 Sep 2004 07:51:27 -0000 1.1.1.2.8.4 *************** *** 41,45 **** while (n--) { ! *out = (PD_BIGORSMALL(*in) ? 0 : *in); out++; in++; --- 41,45 ---- while (n--) { ! *out = (PD_BIGORSMALL(*in) ? 0 : *in); out++; in++; *************** *** 110,113 **** --- 110,139 ---- }
+ /* tb: vectorized receive function */ + static t_int *sigreceive_perf8(t_int *w) + { + t_sigreceive *x = (t_sigreceive *)(w[1]); + t_float *out = (t_float *)(w[2]); + int n = (int)(w[3]); + t_float *in = x->x_wherefrom; + if (in) + { + for (; n; n -= 8, in += 8, out += 8) + { + out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; + out[4] = in[4]; out[5] = in[5]; out[6] = in[6]; out[7] = in[7]; + } + } + else + { + for (; n; n -= 8, in += 8, out += 8) + { + out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; + out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; + } + } + return (w+4); + } + static void sigreceive_set(t_sigreceive *x, t_symbol *s) { *************** *** 140,145 **** { sigreceive_set(x, x->x_sym); ! dsp_add(sigreceive_perform, 3, ! x, sp[0]->s_vec, sp[0]->s_n); } } --- 166,175 ---- { sigreceive_set(x, x->x_sym); ! if(sp[0]->s_n&7) ! dsp_add(sigreceive_perform, 3, ! x, sp[0]->s_vec, sp[0]->s_n); ! else ! dsp_add(sigreceive_perf8, 3, ! x, sp[0]->s_vec, sp[0]->s_n); } } *************** *** 190,197 **** }
static void sigcatch_dsp(t_sigcatch *x, t_signal **sp) { if (x->x_n == sp[0]->s_n) ! dsp_add(sigcatch_perform, 3, x->x_vec, sp[0]->s_vec, sp[0]->s_n); else error("sigcatch %s: unexpected vector size", x->x_sym->s_name); } --- 220,249 ---- }
+ /* tb: vectorized catch function */ + static t_int *sigcatch_perf8(t_int *w) + { + t_float *in = (t_float *)(w[1]); + t_float *out = (t_float *)(w[2]); + int n = (int)(w[3]); + for (; n; n -= 8, in += 8, out += 8) + { + out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; out[3] = in[3]; + out[4] = in[4]; out[5] = in[5]; out[6] = in[6]; out[7] = in[7]; + + in[0] = 0; in[1] = 0; in[2] = 0; in[3] = 0; + in[4] = 0; in[5] = 0; in[6] = 0; in[7] = 0; + } + return (w+4); + } + static void sigcatch_dsp(t_sigcatch *x, t_signal **sp) { if (x->x_n == sp[0]->s_n) ! { ! if(sp[0]->s_n&7) ! dsp_add(sigcatch_perform, 3, x->x_vec, sp[0]->s_vec, sp[0]->s_n); ! else ! dsp_add(sigcatch_perf8, 3, x->x_vec, sp[0]->s_vec, sp[0]->s_n); ! } else error("sigcatch %s: unexpected vector size", x->x_sym->s_name); }