Update of /cvsroot/pure-data/externals/volctl~
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1220
Modified Files:
makefile readme.txt volctl~.c
Log Message:
simd-optimized ramp
Index: volctl~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/volctl~/volctl~.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** volctl~.c 4 Sep 2004 21:27:12 -0000 1.1.1.1
--- volctl~.c 28 Dec 2004 15:48:19 -0000 1.2
***************
*** 1,30 ****
/* Copyright (c) 2004 Tim Blechmann.
! *For information on usage and redistribution, and for a DISCLAIMER OF ALL
! *WARRANTIES, see the file, "gpl.txt" in this distribution.
*
! *This program is free software; you can redistribute it and/or
! *modify it under the terms of the GNU General Public License
! *as published by the Free Software Foundation; either version 2
! *of the License, or (at your option) any later version.
*
! *See file LICENSE for further informations on licensing terms.
*
! *This program is distributed in the hope that it will be useful,
! *but WITHOUT ANY WARRANTY; without even the implied warranty of
! *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! *GNU General Public License for more details.
*
! *You should have received a copy of the GNU General Public License
! *along with this program; if not, write to the Free Software
! *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
! *Based on PureData by Miller Puckette and others.
*
! * coded while listening to: Julien Ottavi: Nervure Magnetique
* */
#include "m_pd.h"
-
#include "m_simd.h"
--- 1,29 ----
/* Copyright (c) 2004 Tim Blechmann.
! * For information on usage and redistribution, and for a DISCLAIMER OF ALL
! * WARRANTIES, see the file, "gpl.txt" in this distribution.
*
! * This program is free software; you can redistribute it and/or
! * modify it under the terms of the GNU General Public License
! * as published by the Free Software Foundation; either version 2
! * of the License, or (at your option) any later version.
*
! * See file LICENSE for further informations on licensing terms.
*
! * This program is distributed in the hope that it will be useful,
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! * GNU General Public License for more details.
*
! * You should have received a copy of the GNU General Public License
! * along with this program; if not, write to the Free Software
! * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
! * Based on PureData by Miller Puckette and others.
*
! * coded while listening to: Julien Ottavi: Nervure Magnetique
* */
#include "m_pd.h"
#include "m_simd.h"
***************
*** 37,49 ****
{
t_object x_obj;
! float x_f;
! float x_h; //interpolation time
! float x_value; //current factor
int x_ticksleft; //ticks to go
! float x_mspersample; //ms per sample
! float x_slope; //slope
!
int x_line;
--- 36,49 ----
{
t_object x_obj;
! t_float x_f;
! t_float x_h; //interpolation time
! t_float x_value; //current factor
int x_ticksleft; //ticks to go
! t_float x_samples_per_ms; //ms per sample
! t_float x_slope; //slope
! t_float * x_slopes; //slopes for simd
! t_float x_slope_step;
int x_line;
***************
*** 55,59 ****
t_volctl *x = (t_volctl *)pd_new(volctl_class);
! inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("f1"));
inlet_settip(x->x_obj.ob_inlet,gensym("factor"));
x->x_value = atom_getfloatarg(0, argc, argv);
--- 55,59 ----
t_volctl *x = (t_volctl *)pd_new(volctl_class);
! inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("f1"));
inlet_settip(x->x_obj.ob_inlet,gensym("factor"));
x->x_value = atom_getfloatarg(0, argc, argv);
***************
*** 63,73 ****
x->x_h = atom_getfloatarg(1, argc, argv);
! x->x_mspersample = 1000.f / 44100; // assume default samplerate
outlet_new(&x->x_obj, &s_signal);
x->x_f = 0;
return (x);
}
t_int *volctl_perform(t_int *w)
{
--- 63,82 ----
x->x_h = atom_getfloatarg(1, argc, argv);
! x->x_samples_per_ms = 44100.f / 1000.f; // assume default samplerate
outlet_new(&x->x_obj, &s_signal);
x->x_f = 0;
+
+ x->x_slopes = getalignedbytes(4*sizeof(t_float));
+
return (x);
}
+ static void volctl_free(t_volctl *x)
+ {
+ freealignedbytes(x->x_slopes, 4*sizeof(t_float));
+ }
+
+
t_int *volctl_perform(t_int *w)
{
***************
*** 77,114 ****
int n = (int)(w[4]);
! float f = x->x_value;
if (x->x_ticksleft)
{
! float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! f+=x_slope;
! *out++ = *in++ * f;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -=n;
! while (n--)
! {
! f+=x_slope;
! *out++ = *in++ * f;
! }
! x->x_value = f;
! }
}
else
! while (n--) *out++ = *in++ * f;
return (w+5);
--- 86,123 ----
int n = (int)(w[4]);
! t_float f = x->x_value;
if (x->x_ticksleft)
{
! t_float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! f+=x_slope;
! *out++ = *in++ * f;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -=n;
! while (n--)
! {
! f+=x_slope;
! *out++ = *in++ * f;
! }
! x->x_value = f;
! }
}
else
! while (n--) *out++ = *in++ * f;
return (w+5);
***************
*** 123,168 ****
int n = (int)(w[4]);
! float f = x->x_value;
if (x->x_ticksleft)
{
! float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -= n;
! while (n--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! x->x_value = f;
! }
}
else
{
! for (; n; n -= 8, in += 8, out += 8)
! {
! float f0 = in[0], f1 = in[1], f2 = in[2], f3 = in[3];
! float f4 = in[4], f5 = in[5], f6 = in[6], f7 = in[7];
! out[0] = f0 * f; out[1] = f1 * f; out[2] = f2 * f; out[3] = f3 * f;
! out[4] = f4 * f; out[5] = f5 * f; out[6] = f6 * f; out[7] = f7 * f;
! }
}
return (w+5);
--- 132,192 ----
int n = (int)(w[4]);
! t_float f = x->x_value;
if (x->x_ticksleft)
{
! t_float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -= n;
! n = n>>3;
! while (n--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! *out++ = *in++ * f;
! f+=x_slope;
! }
! x->x_value = f;
! }
}
else
{
! for (; n; n -= 8, in += 8, out += 8)
! {
! t_float f0 = in[0], f1 = in[1], f2 = in[2], f3 = in[3];
! t_float f4 = in[4], f5 = in[5], f6 = in[6], f7 = in[7];
! out[0] = f0 * f; out[1] = f1 * f; out[2] = f2 * f; out[3] = f3 * f;
! out[4] = f4 * f; out[5] = f5 * f; out[6] = f6 * f; out[7] = f7 * f;
! }
}
return (w+5);
***************
*** 177,241 ****
if (x->x_ticksleft)
{
! int n = (int)(w[4]);
! float f = x->x_value;
! float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -= n;
! while (n--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! x->x_value = f;
! }
}
else
{
! asm(
! ".set T_FLOAT,4 \n"
!
! "movss (%3), %%xmm0 \n"
! "shufps $0, %%xmm0, %%xmm0 \n"
! "shrl $4, %2 \n"
!
! "volctl_loop: \n"
! "movaps (%0), %%xmm1 \n"
! "mulps %%xmm0, %%xmm1 \n"
! "movaps %%xmm1, (%1) \n"
! "movaps 4*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm0, %%xmm2 \n"
! "movaps %%xmm2, 4*T_FLOAT(%1) \n"
! "movaps 8*T_FLOAT(%0), %%xmm3 \n"
! "mulps %%xmm0, %%xmm3 \n"
! "movaps %%xmm3, 8*T_FLOAT(%1) \n"
! "movaps 12*T_FLOAT(%0), %%xmm4 \n"
! "mulps %%xmm0, %%xmm4 \n"
! "movaps %%xmm4, 12*T_FLOAT(%1) \n"
! "addl $64, %0 \n"
! "addl $64, %1 \n"
! "loop volctl_loop \n"
! :
! : "r"(in), "r"(out),
! "a"(w[4]),"r"(&(x->x_value))
! : "%xmm0","%xmm1","%xmm2","%xmm3","%xmm4");
}
return (w+5);
--- 201,304 ----
if (x->x_ticksleft)
{
! int n = (int)(w[4]);
! t_float x_slope = x->x_slope;
! if (x->x_ticksleft < n)
! {
! t_float f = x->x_value;
!
! int remain = x->x_ticksleft;
! n-=remain;
! while (remain--)
! {
! *out++ = *in++ * f;
! f+=x_slope;
! }
! while (n--)
! {
! *out++ = *in++ * f;
! }
! x->x_value = f;
! x->x_ticksleft = 0;
! }
! else
! {
! x->x_ticksleft -= n;
!
! asm(
! ".set T_FLOAT,4 \n"
! "movss (%3),%%xmm0 \n" /* value */
! "shufps $0, %%xmm0, %%xmm0 \n"
! "movaps (%4), %%xmm1 \n" /* x_slopes */
! "addps %%xmm0, %%xmm1 \n"
! "movss (%5), %%xmm0 \n"
! "shufps $0, %%xmm0, %%xmm0 \n" /* x_slope_step */
!
! "shrl $4, %2 \n" /* n>>4 */
!
! "1: \n"
! "movaps (%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, (%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 4*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 4*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 8*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 8*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n"
!
! "movaps 12*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm1, %%xmm2 \n"
! "movaps %%xmm2, 12*T_FLOAT(%1) \n"
! "addps %%xmm0, %%xmm1 \n" /* one instr. obsolete */
!
! "addl $16*T_FLOAT, %0 \n"
! "addl $16*T_FLOAT, %1 \n"
! "loop 1b \n"
!
! :
! :"r"(in), "r"(out), "c"(n), "r"(&(t_float)(x->x_value)),
! "r"((t_float*)x->x_slopes), "r"(&(t_float)(x->x_slope_step))
! :"%xmm0", "%xmm1", "%xmm2");
!
! /* post("value %f", x->x_value); */
! x->x_value += n*(x->x_slope);
! }
}
else
{
! asm(
! ".set T_FLOAT,4 \n"
!
! "movss (%3), %%xmm0 \n"
! "shufps $0, %%xmm0, %%xmm0 \n"
! "shrl $4, %2 \n"
!
! "volctl_loop: \n"
! "movaps (%0), %%xmm1 \n"
! "mulps %%xmm0, %%xmm1 \n"
! "movaps %%xmm1, (%1) \n"
! "movaps 4*T_FLOAT(%0), %%xmm2 \n"
! "mulps %%xmm0, %%xmm2 \n"
! "movaps %%xmm2, 4*T_FLOAT(%1) \n"
! "movaps 8*T_FLOAT(%0), %%xmm3 \n"
! "mulps %%xmm0, %%xmm3 \n"
! "movaps %%xmm3, 8*T_FLOAT(%1) \n"
! "movaps 12*T_FLOAT(%0), %%xmm4 \n"
! "mulps %%xmm0, %%xmm4 \n"
! "movaps %%xmm4, 12*T_FLOAT(%1) \n"
! "addl $16*T_FLOAT, %0 \n"
! "addl $16*T_FLOAT, %1 \n"
! "loop volctl_loop \n"
! :
! : "r"(in), "r"(out),
! "c"(w[4]),"r"(&(t_float)(x->x_value))
! : "%xmm0", "%xmm1","%xmm2","%xmm3","%xmm4");
}
return (w+5);
***************
*** 245,250 ****
void volctl_set(t_volctl *x, t_float f)
{
! x->x_ticksleft = x->x_h / x->x_mspersample;
! x->x_slope = (f - x->x_value) / x->x_ticksleft;
}
--- 308,323 ----
void volctl_set(t_volctl *x, t_float f)
{
! t_float slope;
! int i;
!
! x->x_ticksleft = x->x_h * x->x_samples_per_ms;
! slope = (f - x->x_value) / x->x_ticksleft;
! x->x_slope = slope;
!
! for (i = 0; i != 4; ++i)
! {
! x->x_slopes[i] = i*slope;
! }
! x->x_slope_step = 4*slope;
}
***************
*** 256,271 ****
else
{
! if(SIMD_CHECK2(n,sp[0]->s_vec,sp[1]->s_vec))
! dsp_add(volctl_perf_simd, 4, x, sp[0]->s_vec, sp[1]->s_vec, n);
! else
! dsp_add(volctl_perf8, 4, x, sp[0]->s_vec, sp[1]->s_vec, n);
}
! x->x_mspersample = 1000.f / sp[0]->s_sr;
}
void volctl_tilde_setup(void)
{
! volctl_class = class_new(gensym("volctl~"), (t_newmethod)volctl_new, 0,
! sizeof(t_volctl), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(volctl_class, t_volctl, x_f);
class_addmethod(volctl_class, (t_method)volctl_dsp, gensym("dsp"), 0);
--- 329,344 ----
else
{
! if(SIMD_CHECK2(n,sp[0]->s_vec,sp[1]->s_vec))
! dsp_add(volctl_perf_simd, 4, x, sp[0]->s_vec, sp[1]->s_vec, n);
! else
! dsp_add(volctl_perf8, 4, x, sp[0]->s_vec, sp[1]->s_vec, n);
}
! x->x_samples_per_ms = sp[0]->s_sr / 1000.f;
}
void volctl_tilde_setup(void)
{
! volctl_class = class_new(gensym("volctl~"), (t_newmethod)volctl_new,
! (t_method)volctl_free, sizeof(t_volctl), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(volctl_class, t_volctl, x_f);
class_addmethod(volctl_class, (t_method)volctl_dsp, gensym("dsp"), 0);
Index: makefile
===================================================================
RCS file: /cvsroot/pure-data/externals/volctl~/makefile,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** makefile 4 Sep 2004 21:27:10 -0000 1.1.1.1
--- makefile 28 Dec 2004 15:48:19 -0000 1.2
***************
*** 63,67 ****
LINUXCFLAGS = -DPD -O3 -fPIC -funroll-loops -fomit-frame-pointer \
-Wall -W -Wshadow -Wstrict-prototypes -Werror \
! -Wno-unused -Wno-parentheses -Wno-switch
LINUXINCLUDE = -I../../src
--- 63,67 ----
LINUXCFLAGS = -DPD -O3 -fPIC -funroll-loops -fomit-frame-pointer \
-Wall -W -Wshadow -Wstrict-prototypes -Werror \
! -Wno-unused -Wno-parentheses -Wno-switch
LINUXINCLUDE = -I../../src
Index: readme.txt
===================================================================
RCS file: /cvsroot/pure-data/externals/volctl~/readme.txt,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** readme.txt 4 Sep 2004 21:27:10 -0000 1.1.1.1
--- readme.txt 28 Dec 2004 15:48:19 -0000 1.2
***************
*** 9,13 ****
| | | | |
|*~ 0| = |volctl 0 10|
! | |
except that it is faster
--- 9,13 ----
| | | | |
|*~ 0| = |volctl 0 10|
! | |
except that it is faster
***************
*** 21,24 ****
todo:
- - write complete volctl_perform_simd function in assembler
- check icc's segfault
\ No newline at end of file
--- 21,23 ----