/[svn]/linuxsampler/trunk/src/engines/common/BiquadFilter.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/common/BiquadFilter.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 268 by capela, Thu Oct 7 22:20:20 2004 UTC revision 319 by schoenebeck, Mon Dec 13 00:46:42 2004 UTC
# Line 69  namespace LinuxSampler { Line 69  namespace LinuxSampler {
69              bq_t y1;              bq_t y1;
70              bq_t y2;              bq_t y2;
71    
72                const static float fbc = 0.98;
73    
74              /**              /**
75               * Prevent \a f from going into denormal mode which would slow down               * Prevent \a f from going into denormal mode which would slow down
76               * subsequent floating point calculations, we achieve that by setting               * subsequent floating point calculations, we achieve that by setting
# Line 80  namespace LinuxSampler { Line 82  namespace LinuxSampler {
82                  f -= 1e-18f;                  f -= 1e-18f;
83              }              }
84          public:          public:
85              inline BiquadFilter() {              BiquadFilter() {
86                    Reset();
87                }
88    
89                void Reset() {
90                  x1 = 0.0f;                  x1 = 0.0f;
91                  x2 = 0.0f;                  x2 = 0.0f;
92                  y1 = 0.0f;                  y1 = 0.0f;
# Line 115  namespace LinuxSampler { Line 121  namespace LinuxSampler {
121                  return y;                  return y;
122              }              }
123    
124                // expects to find input in xmm0 (xmm0 stays unmodified) and finally leaves output in xmm6
125                inline void Apply4StepsSSE(biquad_param_t* param) {
126                    __asm__ __volatile__ (
127                        "movss (%2),%%xmm4                # b0\n\t"
128                        "shufps   $0x00,%%xmm4,%%xmm4     # copy b0 to other cells\n\t"
129                        "mulps  %%xmm0,%%xmm4             # xmm4 = x*b0\n\t"
130                        "movups (%0),%%xmm2               # load b1,b2,a1,a2\n\t"
131                        "movups (%1),%%xmm5               # load x1,x2,y1,y2\n\t"
132                        /* sample 0 */
133                        "movaps %%xmm5,%%xmm3\n\t"
134                        "mulps  %%xmm2,%%xmm5             # xmm5 = [b1,b2,a1,a2] * [x1,x2,y1,y2]\n\t"
135                        "shufps $0x0a,%%xmm3,%%xmm3       # x2 = x1, y2 = y1\n\t"
136                        "movss  %%xmm4,%%xmm6\n\t"
137                        "addss  %%xmm5,%%xmm6\n\t"
138                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
139                        "addss  %%xmm5,%%xmm6\n\t"
140                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
141                        "addss  %%xmm5,%%xmm6\n\t"
142                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
143                        "addss  %%xmm5,%%xmm6             # xmm6 = b0*x + b1*x1 + b2*x2 + a1*y1 + a2*y2\n\t"
144                        /* sample 1 */
145                        "shufps $0x39,%%xmm4,%%xmm4       # rotate xmm4 down 1 cell\n\t"
146                        "movss  %%xmm6,%%xmm3             # y1 = y\n\t"
147                        "shufps $0x4e,%%xmm3,%%xmm3       # rotate 2 cells\n\t"
148                        "movss  %%xmm0,%%xmm3             # x1 = x\n\t"
149                        "shufps $0x93,%%xmm6,%%xmm6       # rotate output up 1 cell\n\t"
150                        "movaps %%xmm3,%%xmm5\n\t"
151                        "shufps $0x39,%%xmm0,%%xmm0       # rotate input down 1 cell\n\t"
152                        "mulps  %%xmm2,%%xmm5             # xmm5 = [b1,b2,a1,a2] * [x1,x2,y1,y2]\n\t"
153                        "movss  %%xmm5,%%xmm6\n\t"
154                        "addss  %%xmm4,%%xmm6\n\t"
155                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
156                        "addss  %%xmm5,%%xmm6\n\t"
157                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
158                        "addss  %%xmm5,%%xmm6\n\t"
159                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
160                        "addss  %%xmm5,%%xmm6             # xmm6 = b0*x + b1*x1 + b2*x2 + a1*y1 + a2*y2\n\t"
161                        /* sample 2 */
162                        "shufps $0x0a,%%xmm3,%%xmm3       # x2 = x1, y2 = y1\n\t"
163                        "shufps $0x39,%%xmm4,%%xmm4       # rotate xmm4 down 1 cell\n\t"
164                        "movss  %%xmm6,%%xmm3             # y1 = y\n\t"
165                        "shufps $0x4e,%%xmm3,%%xmm3       # rotate 2 cells\n\t"
166                        "movss  %%xmm0,%%xmm3             # x1 = x\n\t"
167                        "shufps $0x93,%%xmm6,%%xmm6       # rotate output up 1 cell\n\t"
168                        "movaps %%xmm3,%%xmm5\n\t"
169                        "shufps $0x39,%%xmm0,%%xmm0       # rotate input down 1 cell\n\t"
170                        "mulps  %%xmm2,%%xmm5             # xmm5 = [b1,b2,a1,a2] * [x1,x2,y1,y2]\n\t"
171                        "movss  %%xmm5,%%xmm6\n\t"
172                        "addss  %%xmm4,%%xmm6\n\t"
173                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
174                        "addss  %%xmm5,%%xmm6\n\t"
175                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
176                        "addss  %%xmm5,%%xmm6\n\t"
177                        "shufps $0x39,%%xmm5,%%xmm5\n\t"
178                        "addss  %%xmm5,%%xmm6             # xmm6 = b0*x + b1*x1 + b2*x2 + a1*y1 + a2*y2\n\t"
179                        /* sample 3 */
180                        "shufps $0x0a,%%xmm3,%%xmm3       # x2 = x1, y2 = y1\n\t"
181                        "shufps $0x39,%%xmm4,%%xmm4       # rotate xmm4 down 1 cell\n\t"
182                        "movss  %%xmm6,%%xmm3             # y1 = y\n\t"
183                        "shufps $0x4e,%%xmm3,%%xmm3       # rotate 2 cells\n\t"
184                        "movss  %%xmm0,%%xmm3             # x1 = x\n\t"
185                        "shufps $0x93,%%xmm6,%%xmm6       # rotate output up 1 cell\n\t"
186                        "mulps  %%xmm3,%%xmm2             # xmm5 = [b1,b2,a1,a2] * [x1,x2,y1,y2]\n\t"
187                        "shufps $0x39,%%xmm0,%%xmm0       # rotate input down 1 cell\n\t"
188                        "movss  %%xmm2,%%xmm6\n\t"
189                        "shufps $0x39,%%xmm2,%%xmm2\n\t"
190                        "addss  %%xmm2,%%xmm6\n\t"
191                        "shufps $0x39,%%xmm2,%%xmm2\n\t"
192                        "addss  %%xmm2,%%xmm6\n\t"
193                        "shufps $0x39,%%xmm2,%%xmm2\n\t"
194                        "addss  %%xmm2,%%xmm6\n\t"
195                        "addss  %%xmm4,%%xmm6             # xmm6 = b0*x + b1*x1 + b2*x2 + a1*y1 + a2*y2\n\t"
196                        /* done */
197                        "shufps $0x0a,%%xmm3,%%xmm3       # x2 = x1, y2 = y1\n\t"
198                        "movss  %%xmm6,%%xmm3             # y1 = y\n\t"
199                        "shufps $0x4e,%%xmm3,%%xmm3       # rotate 2 cells\n\t"
200                        "movss  %%xmm0,%%xmm3             # x1 = x\n\t"
201                        "shufps $0x1b,%%xmm6,%%xmm6       # swap output to correct order\n\t"
202                        "shufps $0x39,%%xmm0,%%xmm0       # rotate input down 1 cell, to restore original input\n\t"
203                        "movups %%xmm3,(%1)               # store x1,x2,y1,y2\n\t"
204                        : /* no output */
205                        : "r" (&param->b1), /* %0 - [b1,b2,a1,a2] */
206                          "r" (&x1),        /* %1 - [x1,x2,y1,y2] */
207                          "r" (&param->b0)  /* %2 */
208                    );
209                }
210    
211              inline bq_t ApplyFB(bq_t x, const bq_t fb) {              inline bq_t ApplyFB(bq_t x, const bq_t fb) {
212                  bq_t y;                  bq_t y;
213    
# Line 144  namespace LinuxSampler { Line 237  namespace LinuxSampler {
237    
238                  return y;                  return y;
239              }              }
240    
241                // expects to find input in xmm0 (xmm0 stays unmodified) and finally leaves output in xmm7
242                inline void ApplyFB4StepsSSE(biquad_param_t* param, const bq_t &fb) {
243                    float xs, ys;
244                    float t0, t1, t2, t3, t4, t5, t6, t7, t8; // temporary stack space
245                    __asm__ __volatile__ (
246                        /* prepare input */
247                        "movss  %15,%%xmm5\n\t"
248                        "movss  %%xmm0,(%14)\n\t"
249                        /* sample 0 */
250                        "movss   %0, %%xmm3\n\t"
251                        "movss   %1, %%xmm4\n\t"
252                        "mulss   %%xmm4, %%xmm5\n\t"
253                        "movss   %%xmm3, %2\n\t"
254                        "movss   %%xmm5, %16\n\t"
255                        "mulss   %%xmm3, %%xmm5\n\t"
256                        "movss   %19, %%xmm2\n\t"
257                        "movss   %3, %%xmm6\n\t"
258                        "movss   %21, %%xmm3\n\t"
259                        "addss   %%xmm5, %%xmm6\n\t"
260                        "movss  %%xmm2, %%xmm5\n\t"
261                        "movss   %20, %%xmm4\n\t"
262                        "movss   %%xmm6, %4\n\t"
263                        "mulss   %%xmm6, %%xmm5\n\t"
264                        "movss   %5, %%xmm6\n\t"
265                        "movss   %%xmm2, %6\n\t"
266                        "movss   %%xmm4, %7\n\t"
267                        "movss   %%xmm3, %%xmm2\n\t"
268                        "mulss   %%xmm6, %%xmm4\n\t"
269                        "mulss   %8, %%xmm2\n\t"
270                        "movss   %%xmm3, %9\n\t"
271                        "addss   %%xmm4, %%xmm5\n\t"
272                        "movss   %18, %%xmm3\n\t"
273                        "movss   %17, %%xmm4\n\t"
274                        "addss   %%xmm2, %%xmm5\n\t"
275                        "movss   %%xmm4, %10\n\t"
276                        "movss   %%xmm3, %%xmm2\n\t"
277                        "mulss   %11, %%xmm4\n\t"
278                        "mulss   %12, %%xmm2\n\t"
279                        "movss   %%xmm3, %13\n\t"
280                        "addss   %%xmm4, %%xmm5\n\t"
281                        "movss   %11, %%xmm3\n\t"
282                        "movss   %4, %%xmm4\n\t"
283                        "addss   %%xmm2, %%xmm5\n\t"
284                        :: "m" (y1),  /* %0 */
285                           "m" (fbc), /* %1 */
286                           "m" (t0),  /* %2 */
287                           "m" (xs),  /* %3 */
288                           "m" (t7),  /* %4 */
289                           "m" (x1),  /* %5 */
290                           "m" (t1),  /* %6 */
291                           "m" (t2),  /* %7 */
292                           "m" (x2),  /* %8 */
293                           "m" (t3),  /* %9 */
294                           "m" (t4),  /* %10 */
295                           "m" (t0),  /* %11 */
296                           "m" (y2),  /* %12 */
297                           "m" (t5),  /* %13 */
298                           "r" (&xs),  /* %14 */
299                           "m" (fb),   /* %15 */
300                           "m" (ys),   /* %16 */
301                           "m" (param->a1), /* %17 */
302                           "m" (param->a2), /* %18 */
303                           "m" (param->b0), /* %19 */
304                           "m" (param->b1), /* %20 */
305                           "m" (param->b2) /* %21 */
306                    );
307                    __asm__ __volatile__ (
308                        "shufps $0x39,%%xmm0,%%xmm0  # rotate down one cell\n\t"
309                        "movss  %%xmm5,%%xmm7\n\t"
310                        ::
311                    );
312                    /* sample 1 */
313                    __asm__ __volatile__ (
314                        "movss   %0, %%xmm4\n\t"
315                        "movss   %%xmm0, %%xmm3\n\t"
316                        "mulss   %%xmm5, %%xmm4\n\t"
317                        "mulss   %3, %%xmm6\n\t"
318                        "movss   %5, %%xmm2\n\t"
319                        "addss   %%xmm4, %%xmm3\n\t"
320                        "mulss   %7, %%xmm2\n\t"
321                        "movss   %6, %%xmm4\n\t"
322                        "movss   %%xmm3, %8\n\t"
323                        "mulss   %%xmm3, %%xmm4\n\t"
324                        "addss   %%xmm2, %%xmm4\n\t"
325                        "movss   %9, %%xmm3\n\t"
326                        "mulss   %%xmm5, %%xmm3\n\t"
327                        "movss   %10, %%xmm2\n\t"
328                        "addss   %%xmm6, %%xmm4\n\t"
329                        "mulss   %11, %%xmm2\n\t"
330                        "addss   %%xmm3, %%xmm4\n\t"
331                        "addss   %%xmm2, %%xmm4\n\t"
332                        :: "m" (ys),  /* %0 */
333                           "m" (fbc), /* %1 */
334                           "m" (xs),  /* %2 */
335                           "m" (t3),  /* %3 */
336                           "m" (y2),  /* %4 */
337                           "m" (t2),  /* %5 */
338                           "m" (t1),  /* %6 */
339                           "m" (t7),  /* %7 */
340                           "m" (t8),  /* %8 */
341                           "m" (t4),  /* %9 */
342                           "m" (t5),  /* %10 */
343                           "m" (t0),  /* %11 */
344                           "m" (x2),  /* %12 */
345                           "m" (x1),  /* %13 */
346                           "m" (y1)   /* %14 */
347                    );
348                    __asm__ __volatile__ (
349                        "shufps $0x93,%%xmm7,%%xmm7  # rotate up one cell\n\t"
350                        "shufps $0x39,%%xmm0,%%xmm0  # rotate down one cell\n\t"
351                        "movss  %%xmm4,%%xmm7\n\t"
352                        ::
353                    );
354                    /* sample 2 */
355                    __asm__ __volatile__ (
356                        "movss   %2, %%xmm6\n\t"
357                        "movss   %3, %%xmm3\n\t"
358                        "mulss   %%xmm4, %%xmm6\n\t"
359                        "movss   %4, %%xmm2\n\t"
360                        "mulss   %9, %%xmm2\n\t"
361                        "addss   %%xmm0, %%xmm6\n\t"
362                        "mulss   %7, %%xmm5\n\t"
363                        "mulss   %%xmm6, %%xmm3\n\t"
364                        "addss   %%xmm2, %%xmm3\n\t"
365                        "movss   %5, %%xmm2\n\t"
366                        "mulss   %8, %%xmm2\n\t"
367                        "addss   %%xmm2, %%xmm3\n\t"
368                        "movss   %6, %%xmm2\n\t"
369                        "mulss   %%xmm4, %%xmm2\n\t"
370                        "addss   %%xmm5, %%xmm2\n\t"
371                        "addss   %%xmm2, %%xmm3\n\t"
372                        :: "m" (xs),  /* %0 */
373                           "m" (fb),  /* %1 */
374                           "m" (ys), /* %2 */
375                           "m" (t1),  /* %3 */
376                           "m" (t2),  /* %4 */
377                           "m" (t3),  /* %5 */
378                           "m" (t4),  /* %6 */
379                           "m" (t5),  /* %7 */
380                           "m" (t7),  /* %8 */
381                           "m" (t8),  /* %9 */
382                           "m" (x1),  /* %10 */
383                           "m" (x2),  /* %11 */
384                           "m" (y1),  /* %12 */
385                           "m" (y2)   /* %13 */
386                    );
387                    __asm__ __volatile__ (
388                        "shufps $0x39,%%xmm0,%%xmm0  # rotate down one cell\n\t"
389                        "shufps $0x93,%%xmm7,%%xmm7  # rotate up one cell\n\t"
390                        "movss  %%xmm3,%%xmm7\n\t"
391                        ::
392                    );
393                    /* sample 3 */
394                    __asm__ __volatile__ (
395                        "movss   %1, %%xmm2\n\t"
396                        "mulss   %7, %%xmm4\n\t"
397                        "mulss   %%xmm3, %%xmm2\n\t"
398                        "movss   %3, %%xmm5\n\t"
399                        "movss   %%xmm6, %11\n\t"
400                        "addss   %%xmm0, %%xmm2\n\t"
401                        "movss   %%xmm3, %13\n\t"
402                        "mulss   %%xmm2, %%xmm5\n\t"
403                        "mulss   %4, %%xmm6\n\t"
404                        "movss   %%xmm2, %10\n\t"
405                        "addss   %%xmm6, %%xmm5\n\t"
406                        "movss   %5, %%xmm2\n\t"
407                        "mulss   %9, %%xmm2\n\t"
408                        "mulss   %6, %%xmm3\n\t"
409                        "addss   %%xmm2, %%xmm5\n\t"
410                        "addss   %%xmm3, %%xmm4\n\t"
411                        "addss   %%xmm4, %%xmm5\n\t"
412                        "movss   %%xmm5, %12\n\t"
413                        :: "m" (xs),  /* %0 */
414                           "m" (ys),  /* %1 */
415                           "m" (fbc), /* %2 */
416                           "m" (t1),  /* %3 */
417                           "m" (t2),  /* %4 */
418                           "m" (t3),  /* %5 */
419                           "m" (t4),  /* %6 */
420                           "m" (t5),  /* %7 */
421                           "m" (t6),  /* %8 */
422                           "m" (t8),  /* %9 */
423                           "m" (x1),  /* %10 */
424                           "m" (x2),  /* %11 */
425                           "m" (y1),  /* %12 */
426                           "m" (y2)   /* %13 */
427                    );
428                    __asm__ __volatile__ (
429                        "shufps $0x93,%%xmm7,%%xmm7  # rotate up one cell\n\t"
430                        "shufps $0x39,%%xmm0,%%xmm0  # rotate down one cell to restore original input\n\t"
431                        "movss  %%xmm5,%%xmm7\n\t"
432                        "shufps $0x1b,%%xmm7,%%xmm7  # swap output to correct order\n\t"
433                        ::
434                    );
435                }
436      };      };
437    
438      class LowpassFilter : public BiquadFilter {      class LowpassFilter : public BiquadFilter {

Legend:
Removed from v.268  
changed lines
  Added in v.319

  ViewVC Help
Powered by ViewVC