[PD-cvs] externals/volctl~ makefile,1.1.1.1,1.2 readme.txt,1.1.1.1,1.2 volctl~.c,1.1.1.1,1.2

Tim Blechmann timblech at users.sourceforge.net
Tue Dec 28 16:48:21 CET 2004


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 ----





More information about the Pd-cvs mailing list