[PD-cvs] pd/src m_simd_sse_gcc.c,1.1.2.1,1.1.2.2 m_simd_sse_gcc.h,1.1.2.3,1.1.2.4

Tim Blechmann timblech at users.sourceforge.net
Sat Jul 10 21:57:23 CEST 2004


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20643

Modified Files:
      Tag: devel_0_37
	m_simd_sse_gcc.c m_simd_sse_gcc.h 
Log Message:

port of thomas grill's vectorized simd functions for vc to gcc

Index: m_simd_sse_gcc.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_simd_sse_gcc.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** m_simd_sse_gcc.c	23 Dec 2003 01:15:39 -0000	1.1.2.1
--- m_simd_sse_gcc.c	10 Jul 2004 19:57:20 -0000	1.1.2.2
***************
*** 10,12 ****
--- 10,997 ----
  
  
+ /* TB: adapted from the xxx_sse_vc routines 
+    since gcc can't access the c code as vc can, the functions itself have
+    been adapted to assembler */
+ 
+ /* zero_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n" /* sizeof(t_float) */
+     ".set T_INT,4                                 \n" /* sizeof(t_int)   */
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+ 
+     ".globl    zero_perf_sse_gcc                  \n"
+     "zero_perf_sse_gcc:                           \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "pushl     %esi                               \n"
+     "movl      %esi, -4(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %edx                  \n" /* out */
+     "movl      2*T_INT(%esi), %ecx                \n" /* n */
+ 	 
+     "xorps     %xmm0, %xmm0                       \n" /* load zero */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     
+     /* loop: *out=0 */
+     "zpsg_loop:                                   \n"
+     "movaps    %xmm0, (%edx)                      \n"
+     "movaps    %xmm0, 4*T_FLOAT(%edx)             \n"
+     "movaps    %xmm0, 8*T_FLOAT(%edx)             \n"
+     "movaps    %xmm0, 12*T_FLOAT(%edx)            \n"
+     
+     "addl      $64, %edx                          \n" /* out+=16 */
+     "loop      zpsg_loop                          \n"
+     
+     
+     /* return w+3; */
+     "movl      -4(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $12, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     zero_perf_sse_gcc, @function       \n"
+ 
+     );
+ 
+ /* copy_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    copy_perf_sse_gcc                  \n"
+     "copy_perf_sse_gcc:                           \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      1*T_INT(%esi), %ebx                \n" /* in1 */
+     "movl      2*T_INT(%esi), %edx                \n" /* out */
+     "movl      3*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = *in */
+     "cpsg_loop:                                   \n"
+     "movaps    (%ebx), %xmm0                      \n"
+     "movaps    %xmm0, (%edx)                      \n"
+     "movaps    4*T_FLOAT(%ebx), %xmm1             \n"
+     "movaps    %xmm1, 4*T_FLOAT(%edx)             \n"
+     
+     "movaps    8*T_FLOAT(%ebx), %xmm2             \n"
+     "movaps    %xmm2, 8*T_FLOAT(%edx)             \n"
+     "movaps    12*T_FLOAT(%ebx), %xmm3            \n"
+     "movaps    %xmm3, 12*T_FLOAT(%edx)            \n"
+      
+     "addl      $64, %ebx                          \n" /* in1 +=16 */
+     "addl      $64, %edx                          \n" /* out +=16 */
+     "loop      cpsg_loop                          \n"
+     
+     /* return w+4; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $16, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     copy_perf_sse_gcc, @function       \n"
+     );
+ 
+ 
+ /* sig_tilde_perf_sse_gcc(t_int * w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+     
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    sig_tilde_perf_sse_gcc             \n"
+     "sig_tilde_perf_sse_gcc:                      \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "pushl     %esi                               \n"
+     "movl      %esi, -4(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      2*T_INT(%esi), %edx                \n" /* out */
+     "movl      1*T_INT(%esi), %eax                \n" /* f */
+     "movl      3*T_INT(%esi), %ecx                \n" /* n */
+ 
+     /* set registers to f */
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "movl      12(%esi), %ecx                     \n"
+     "shrl      $4, %ecx                           \n"  /* divide by 16 */
+     
+     /* loop: *out = f */
+     "sigtpsg_loop:                                \n"
+     "movaps    %xmm0, (%edx)                      \n"
+     "movaps    %xmm0, 16(%edx)                    \n"
+     "movaps    %xmm0, 32(%edx)                    \n"
+     "movaps    %xmm0, 48(%edx)                    \n" 
+     "addl      $64, %edx                          \n" /* out+=16 */
+     "loop      sigtpsg_loop                       \n"
+ 
+     /* return w+4; */
+     "movl      -4(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $16, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     sig_tilde_perf_sse_gcc, @function  \n"
+ 
+     );
+     
+ 
+ 
+ /* plus_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    plus_perf_sse_gcc                  \n"
+     "plus_perf_sse_gcc:                           \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument vector */
+     
+     "movl      1*T_INT(%esi), %eax                \n" /* in1 */
+     "movl      2*T_INT(%esi), %ebx                \n" /* in2 */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     "xorl      %esi, %esi                         \n" /* reset index */
+     
+     /* loop: *out = *in1 + *in2 */
+     "ppsg_loop:                                   \n"
+     "movaps    (%eax,%esi), %xmm0                 \n"
+     "movaps    (%ebx,%esi), %xmm1                 \n"
+     "addps     %xmm1, %xmm0                       \n"
+     "movaps    %xmm0, (%edx,%esi)                 \n"
+     
+     "movaps    4*T_FLOAT(%eax,%esi), %xmm2        \n"
+     "movaps    4*T_FLOAT(%ebx,%esi), %xmm3        \n"
+     "addps     %xmm3, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    8*T_FLOAT(%eax,%esi), %xmm4        \n"
+     "movaps    8*T_FLOAT(%ebx,%esi), %xmm5        \n"
+     "addps     %xmm5, %xmm4                       \n"
+     "movaps    %xmm4, 8*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    12*T_FLOAT(%eax,%esi), %xmm6       \n"
+     "movaps    12*T_FLOAT(%ebx,%esi), %xmm7       \n"
+     "addps     %xmm7, %xmm6                       \n"
+     "movaps    %xmm6, 12*T_FLOAT(%edx,%esi)       \n"
+ 
+     "addl      $64, %esi                          \n" /* out+=16; */
+     "loop      ppsg_loop                          \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     plus_perf_sse_gcc, @function       \n"
+ 
+     );
+ 
+ /* scalarplus_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    scalarplus_perf_sse_gcc            \n"
+     "scalarplus_perf_sse_gcc:                     \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %ebx                  \n" /* in */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      2*T_INT(%esi), %eax                \n" /* value */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = *in + value */
+     "sppsg_loop:                                  \n"
+     
+     "movaps    (%ebx), %xmm1                      \n"
+     "addps     %xmm0, %xmm1                       \n"
+     "movaps    %xmm1, (%edx)                      \n"
+     
+     "movaps    4*T_FLOAT(%ebx), %xmm2             \n"
+     "addps     %xmm0, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx)             \n"
+ 
+     "movaps    8*T_FLOAT(%ebx), %xmm3             \n"
+     "addps     %xmm0, %xmm3                       \n"
+     "movaps    %xmm3, 8*T_FLOAT(%edx)             \n"
+ 
+     "movaps    12*T_FLOAT(%ebx), %xmm4            \n"
+     "addps     %xmm0, %xmm4                       \n"
+     "movaps    %xmm4, 12*T_FLOAT(%edx)            \n"
+ 
+     "addl      $64, %ebx                          \n" /* in += 16 */
+     "addl      $64, %edx                          \n" /* out += 16 */
+     "loop      sppsg_loop                         \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     scalarplus_perf_sse_gcc, @function \n"
+ 
+     );
+ 
+ 
+ /* minus_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    minus_perf_sse_gcc            \n"
+     "minus_perf_sse_gcc:                     \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      1*T_INT(%esi), %eax                \n" /* in1 */
+     "movl      2*T_INT(%esi), %ebx                \n" /* in2 */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     "xorl      %esi, %esi                         \n" /* reset register */
+ 
+ 
+     /* loop: *out = *in1 - *in2 */
+     "mpsg_loop:                                   \n"
+ 
+     "movaps    (%eax,%esi), %xmm0                 \n"
+     "movaps    (%ebx,%esi), %xmm1                 \n"
+     "subps     %xmm1, %xmm0                       \n"
+     "movaps    %xmm0, (%edx,%esi)                 \n"
+ 
+     "movaps    4*T_FLOAT(%eax,%esi), %xmm2        \n"
+     "movaps    4*T_FLOAT(%ebx,%esi), %xmm3        \n"
+     "subps     %xmm3, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx,%esi)        \n"
+ 
+     "movaps    8*T_FLOAT(%eax,%esi), %xmm4        \n"
+     "movaps    8*T_FLOAT(%ebx,%esi), %xmm5        \n"
+     "subps     %xmm5, %xmm4                       \n"
+     "movaps    %xmm4, 8*T_FLOAT(%edx,%esi)        \n"
+ 
+     "movaps    12*T_FLOAT(%eax,%esi), %xmm6       \n"
+     "movaps    12*T_FLOAT(%ebx,%esi), %xmm7       \n"
+     "subps     %xmm7, %xmm6                       \n"
+     "movaps    %xmm6, 12*T_FLOAT(%edx,%esi)       \n"
+     "addl      $64, %esi                          \n" /* out +=16 */
+ 
+     "loop      mpsg_loop                          \n"
+     
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     minus_perf_sse_gcc, @function      \n"
+     
+     );
+ 
+ /* scalarminus_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    scalarminus_perf_sse_gcc           \n"
+     "scalarminus_perf_sse_gcc:                    \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %ebx                  \n" /* in */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      2*T_INT(%esi), %eax                \n" /* value */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = *in - value */
+     "smpsg_loop:                                  \n"
+     
+     "movaps    (%ebx), %xmm1                      \n"
+     "subps     %xmm0, %xmm1                       \n"
+     "movaps    %xmm1, (%edx)                      \n"
+     
+     "movaps    4*T_FLOAT(%ebx), %xmm2             \n"
+     "subps     %xmm0, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx)             \n"
+ 
+     "movaps    8*T_FLOAT(%ebx), %xmm3             \n"
+     "subps     %xmm0, %xmm3                       \n"
+     "movaps    %xmm3, 8*T_FLOAT(%edx)             \n"
+ 
+     "movaps    12*T_FLOAT(%ebx), %xmm4            \n"
+     "subps     %xmm0, %xmm4                       \n"
+     "movaps    %xmm4, 12*T_FLOAT(%edx)            \n"
+ 
+     "addl      $64, %ebx                          \n" /* in += 16 */
+     "addl      $64, %edx                          \n" /* out += 16 */
+     "loop      smpsg_loop                         \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     scalarminus_perf_sse_gcc, @function\n"
+ 
+     );
+ 
+ /* times_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    times_perf_sse_gcc                 \n"
+     "times_perf_sse_gcc:                          \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument vector */
+     
+     "movl      1*T_INT(%esi), %eax                \n" /* in1 */
+     "movl      2*T_INT(%esi), %ebx                \n" /* in2 */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     "xorl      %esi, %esi                         \n" /* reset index */
+     
+     /* loop: *out = *in1 * *in2 */
+     "tpsg_loop:                                   \n"
+     "movaps    (%eax,%esi), %xmm0                 \n"
+     "movaps    (%ebx,%esi), %xmm1                 \n"
+     "mulps     %xmm1, %xmm0                       \n"
+     "movaps    %xmm0, (%edx,%esi)                 \n"
+     
+     "movaps    4*T_FLOAT(%eax,%esi), %xmm2        \n"
+     "movaps    4*T_FLOAT(%ebx,%esi), %xmm3        \n"
+     "mulps     %xmm3, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    8*T_FLOAT(%eax,%esi), %xmm4        \n"
+     "movaps    8*T_FLOAT(%ebx,%esi), %xmm5        \n"
+     "mulps     %xmm5, %xmm4                       \n"
+     "movaps    %xmm4, 8*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    12*T_FLOAT(%eax,%esi), %xmm6       \n"
+     "movaps    12*T_FLOAT(%ebx,%esi), %xmm7       \n"
+     "mulps     %xmm7, %xmm6                       \n"
+     "movaps    %xmm6, 12*T_FLOAT(%edx,%esi)       \n"
+ 
+     "addl      $64, %esi                          \n" /* out+=16; */
+     "loop      tpsg_loop                          \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     times_perf_sse_gcc, @function      \n"
+ 
+     );
+ 
+ /* scalartimes_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    scalartimes_perf_sse_gcc           \n"
+     "scalartimes_perf_sse_gcc:                    \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %ebx                  \n" /* in */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      2*T_INT(%esi), %eax                \n" /* value */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = *in * n */
+     "stpsg_loop:                                  \n"
+     
+     "movaps    (%ebx), %xmm1                      \n"
+     "mulps     %xmm0, %xmm1                       \n"
+     "movaps    %xmm1, (%edx)                      \n"
+     
+     "movaps    4*T_FLOAT(%ebx), %xmm2             \n"
+     "mulps     %xmm0, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx)             \n"
+ 
+     "movaps    8*T_FLOAT(%ebx), %xmm3             \n"
+     "mulps     %xmm0, %xmm3                       \n"
+     "movaps    %xmm3, 8*T_FLOAT(%edx)             \n"
+ 
+     "movaps    12*T_FLOAT(%ebx), %xmm4            \n"
+     "mulps     %xmm0, %xmm4                       \n"
+     "movaps    %xmm4, 12*T_FLOAT(%edx)            \n"
+ 
+     "addl      $64, %ebx                          \n" /* in += 16 */
+     "addl      $64, %edx                          \n" /* out += 16 */
+     "loop      stpsg_loop                         \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     scalartimes_perf_sse_gcc, @function\n"
+ 
+     );
+ 
+ /* over_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    over_perf_sse_gcc                  \n"
+     "over_perf_sse_gcc:                           \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument vector */
+     
+     "movl      1*T_INT(%esi), %eax                \n" /* in1 */
+     "movl      2*T_INT(%esi), %ebx                \n" /* in2 */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     "xorl      %esi, %esi                         \n" /* reset index */
+     
+     /* loop: *out = *in1 / *in2 */
+     "opsg_loop:                                   \n"
+     "movaps    (%eax,%esi), %xmm0                 \n"
+     "movaps    (%ebx,%esi), %xmm1                 \n"
+     "divps     %xmm1, %xmm0                       \n"
+     "movaps    %xmm0, (%edx,%esi)                 \n"
+     
+     "movaps    4*T_FLOAT(%eax,%esi), %xmm2        \n"
+     "movaps    4*T_FLOAT(%ebx,%esi), %xmm3        \n"
+     "divps     %xmm3, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    8*T_FLOAT(%eax,%esi), %xmm4        \n"
+     "movaps    8*T_FLOAT(%ebx,%esi), %xmm5        \n"
+     "divps     %xmm5, %xmm4                       \n"
+     "movaps    %xmm4, 8*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    12*T_FLOAT(%eax,%esi), %xmm6       \n"
+     "movaps    12*T_FLOAT(%ebx,%esi), %xmm7       \n"
+     "divps     %xmm7, %xmm6                       \n"
+     "movaps    %xmm6, 12*T_FLOAT(%edx,%esi)       \n"
+ 
+     "addl      $64, %esi                          \n" /* out+=16; */
+     "loop      opsg_loop                          \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     over_perf_sse_gcc, @function       \n"
+ 
+     );
+ 
+ /* scalarover_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    scalarover_perf_sse_gcc            \n"
+     "scalarover_perf_sse_gcc:                     \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %ebx                  \n" /* in */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      2*T_INT(%esi), %eax                \n" /* value */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = *in / n */
+     "sopsg_loop:                                  \n"
+     
+     "movaps    (%ebx), %xmm1                      \n"
+     "divps     %xmm0, %xmm1                       \n"
+     "movaps    %xmm1, (%edx)                      \n"
+     
+     "movaps    4*T_FLOAT(%ebx), %xmm2             \n"
+     "divps     %xmm0, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx)             \n"
+ 
+     "movaps    8*T_FLOAT(%ebx), %xmm3             \n"
+     "divps     %xmm0, %xmm3                       \n"
+     "movaps    %xmm3, 8*T_FLOAT(%edx)             \n"
+ 
+     "movaps    12*T_FLOAT(%ebx), %xmm4            \n"
+     "divps     %xmm0, %xmm4                       \n"
+     "movaps    %xmm4, 12*T_FLOAT(%edx)            \n"
+ 
+     "addl      $64, %ebx                          \n" /* in += 16 */
+     "addl      $64, %edx                          \n" /* out += 16 */
+     "loop      sopsg_loop                         \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     scalarover_perf_sse_gcc, @function \n"
+ 
+     );
+ 
+ /* min_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    min_perf_sse_gcc                   \n"
+     "min_perf_sse_gcc:                            \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument vector */
+     
+     "movl      1*T_INT(%esi), %eax                \n" /* in1 */
+     "movl      2*T_INT(%esi), %ebx                \n" /* in2 */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     "xorl      %esi, %esi                         \n" /* reset index */
+     
+     /* loop: *out = min(*in1, *in2) */
+     "minpsg_loop:                                 \n"
+     "movaps    (%eax,%esi), %xmm0                 \n"
+     "movaps    (%ebx,%esi), %xmm1                 \n"
+     "minps     %xmm1, %xmm0                       \n"
+     "movaps    %xmm0, (%edx,%esi)                 \n"
+     
+     "movaps    4*T_FLOAT(%eax,%esi), %xmm2        \n"
+     "movaps    4*T_FLOAT(%ebx,%esi), %xmm3        \n"
+     "minps     %xmm3, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    8*T_FLOAT(%eax,%esi), %xmm4        \n"
+     "movaps    8*T_FLOAT(%ebx,%esi), %xmm5        \n"
+     "minps     %xmm5, %xmm4                       \n"
+     "movaps    %xmm4, 8*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    12*T_FLOAT(%eax,%esi), %xmm6       \n"
+     "movaps    12*T_FLOAT(%ebx,%esi), %xmm7       \n"
+     "minps     %xmm7, %xmm6                       \n"
+     "movaps    %xmm6, 12*T_FLOAT(%edx,%esi)       \n"
+ 
+     "addl      $64, %esi                          \n" /* out+=16; */
+     "loop      minpsg_loop                        \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     min_perf_sse_gcc, @function        \n"
+ 
+     );
+ 
+ /* scalarmin_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    scalarmin_perf_sse_gcc             \n"
+     "scalarmin_perf_sse_gcc:                      \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %ebx                  \n" /* in */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      2*T_INT(%esi), %eax                \n" /* value */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = min(*in,value) */
+     "sminopsg_loop:                               \n"
+     
+     "movaps    (%ebx), %xmm1                      \n"
+     "minps     %xmm0, %xmm1                       \n"
+     "movaps    %xmm1, (%edx)                      \n"
+     
+     "movaps    4*T_FLOAT(%ebx), %xmm2             \n"
+     "minps     %xmm0, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx)             \n"
+ 
+     "movaps    8*T_FLOAT(%ebx), %xmm3             \n"
+     "minps     %xmm0, %xmm3                       \n"
+     "movaps    %xmm3, 8*T_FLOAT(%edx)             \n"
+ 
+     "movaps    12*T_FLOAT(%ebx), %xmm4            \n"
+     "minps     %xmm0, %xmm4                       \n"
+     "movaps    %xmm4, 12*T_FLOAT(%edx)            \n"
+ 
+     "addl      $64, %ebx                          \n" /* in += 16 */
+     "addl      $64, %edx                          \n" /* out += 16 */
+     "loop      sminopsg_loop                      \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     scalarmin_perf_sse_gcc, @function  \n"
+ 
+     );
+ 
+ /* max_perf_sse_gcc (t_int * w)*/
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    max_perf_sse_gcc                   \n"
+     "max_perf_sse_gcc:                            \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument vector */
+     
+     "movl      1*T_INT(%esi), %eax                \n" /* in1 */
+     "movl      2*T_INT(%esi), %ebx                \n" /* in2 */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+     "xorl      %esi, %esi                         \n" /* reset index */
+     
+     /* loop: *out = max(*in1, *in2) */
+     "maxpsg_loop:                                 \n"
+     "movaps    (%eax,%esi), %xmm0                 \n"
+     "movaps    (%ebx,%esi), %xmm1                 \n"
+     "maxps     %xmm1, %xmm0                       \n"
+     "movaps    %xmm0, (%edx,%esi)                 \n"
+     
+     "movaps    4*T_FLOAT(%eax,%esi), %xmm2        \n"
+     "movaps    4*T_FLOAT(%ebx,%esi), %xmm3        \n"
+     "maxps     %xmm3, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    8*T_FLOAT(%eax,%esi), %xmm4        \n"
+     "movaps    8*T_FLOAT(%ebx,%esi), %xmm5        \n"
+     "maxps     %xmm5, %xmm4                       \n"
+     "movaps    %xmm4, 8*T_FLOAT(%edx,%esi)        \n"
+     
+     "movaps    12*T_FLOAT(%eax,%esi), %xmm6       \n"
+     "movaps    12*T_FLOAT(%ebx,%esi), %xmm7       \n"
+     "maxps     %xmm7, %xmm6                       \n"
+     "movaps    %xmm6, 12*T_FLOAT(%edx,%esi)       \n"
+ 
+     "addl      $64, %esi                          \n" /* out+=16; */
+     "loop      maxpsg_loop                        \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     max_perf_sse_gcc, @function        \n"
+ 
+     );
+ 
+ /* scalarmax_perf_sse_gcc(t_int *w) */
+ asm(
+     ".set T_FLOAT,4                               \n"
+     ".set T_INT,4                                 \n"
+ 
+     /* header */
+     ".text                                        \n"
+     ".align    4                                  \n" /* alignment */
+     
+     ".globl    scalarmax_perf_sse_gcc             \n"
+     "scalarmax_perf_sse_gcc:                      \n"
+     
+     /* head of function */
+     "pushl     %ebp                               \n"
+     "movl      %esp, %ebp                         \n"
+     "subl      $8, %esp                           \n"
+     "movl      %ebx, -4(%ebp)                     \n"
+     "movl      %esi, -8(%ebp)                     \n"
+ 
+     /* get arguments */
+     "movl      8(%ebp), %esi                      \n" /* argument pointer */
+     "movl      T_INT(%esi), %ebx                  \n" /* in */
+     "movl      3*T_INT(%esi), %edx                \n" /* out */
+     "movl      2*T_INT(%esi), %eax                \n" /* value */
+     "movl      4*T_INT(%esi), %ecx                \n" /* n */
+     
+     "movss     (%eax), %xmm0                      \n"
+     "shufps    $0, %xmm0, %xmm0                   \n"
+     "shrl      $4, %ecx                           \n" /* divide by 16 */
+ 
+     /* loop: *out = max(*in,value) */
+     "smaxopsg_loop:                               \n"
+     
+     "movaps    (%ebx), %xmm1                      \n"
+     "maxps     %xmm0, %xmm1                       \n"
+     "movaps    %xmm1, (%edx)                      \n"
+     
+     "movaps    4*T_FLOAT(%ebx), %xmm2             \n"
+     "maxps     %xmm0, %xmm2                       \n"
+     "movaps    %xmm2, 4*T_FLOAT(%edx)             \n"
+ 
+     "movaps    8*T_FLOAT(%ebx), %xmm3             \n"
+     "maxps     %xmm0, %xmm3                       \n"
+     "movaps    %xmm3, 8*T_FLOAT(%edx)             \n"
+ 
+     "movaps    12*T_FLOAT(%ebx), %xmm4            \n"
+     "maxps     %xmm0, %xmm4                       \n"
+     "movaps    %xmm4, 12*T_FLOAT(%edx)            \n"
+ 
+     "addl      $64, %ebx                          \n" /* in += 16 */
+     "addl      $64, %edx                          \n" /* out += 16 */
+     "loop      smaxopsg_loop                      \n"
+ 
+     /* return w+5; */
+     "movl      -4(%ebp), %ebx                     \n"
+     "movl      -8(%ebp), %esi                     \n"
+     "movl      8(%ebp), %eax                      \n"
+     "addl      $20, %eax                          \n"
+     "movl      %ebp, %esp                         \n"
+     "popl      %ebp                               \n"
+     "ret                                          \n"
+ 
+     ".align    4                                  \n" /* alignment */
+     ".type     scalarmax_perf_sse_gcc, @function  \n"
+ 
+     );
+ 
+ 
  #endif
+ 

Index: m_simd_sse_gcc.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_simd_sse_gcc.h,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -C2 -d -r1.1.2.3 -r1.1.2.4
*** m_simd_sse_gcc.h	29 Dec 2003 02:01:57 -0000	1.1.2.3
--- m_simd_sse_gcc.h	10 Jul 2004 19:57:21 -0000	1.1.2.4
***************
*** 33,58 ****
  
  /* functions in d_ugen.c */
! #define zero_perf_simd          zero_perf8 /* SIMD not implemented */
  
  /* functions in d_dac.c */
! #define copy_perf_simd          copy_perf8 /* SIMD not implemented */
  
  /* functions in d_ctl.c */
! #define sig_tilde_perf_simd     sig_tilde_perf8 /* SIMD not implemented */
  
  /* functions in d_arithmetic.c */
! #define plus_perf_simd          plus_perf8 /* SIMD not implemented */
! #define scalarplus_perf_simd    scalarplus_perf8 /* SIMD not implemented */
! #define minus_perf_simd         minus_perf8 /* SIMD not implemented */
! #define scalarminus_perf_simd   scalarminus_perf8 /* SIMD not implemented */
! #define times_perf_simd         times_perf8 /* SIMD not implemented */
! #define scalartimes_perf_simd   scalartimes_perf8 /* SIMD not implemented */
  #define sqr_perf_simd           sqr_perf8 /* SIMD not implemented */
! #define over_perf_simd          over_perf8 /* SIMD not implemented */
! #define scalarover_perf_simd    scalarover_perf8 /* SIMD not implemented */
! #define min_perf_simd           min_perf8 /* SIMD not implemented */
! #define scalarmin_perf_simd     scalarmin_perf8 /* SIMD not implemented */
! #define max_perf_simd           max_perf8 /* SIMD not implemented */
! #define scalarmax_perf_simd     scalarmax_perf8 /* SIMD not implemented */
  
  /* functions in d_math.c */
--- 33,58 ----
  
  /* functions in d_ugen.c */
! #define zero_perf_simd          zero_perf_sse_gcc
  
  /* functions in d_dac.c */
! #define copy_perf_simd          copy_perf_sse_gcc
  
  /* functions in d_ctl.c */
! #define sig_tilde_perf_simd     sig_tilde_perf_sse_gcc
  
  /* functions in d_arithmetic.c */
! #define plus_perf_simd          plus_perf_sse_gcc
! #define scalarplus_perf_simd    scalarplus_perf_sse_gcc
! #define minus_perf_simd         minus_perf_sse_gcc
! #define scalarminus_perf_simd   scalarminus_perf_sse_gcc
! #define times_perf_simd         times_perf_sse_gcc
! #define scalartimes_perf_simd   scalartimes_perf_sse_gcc
  #define sqr_perf_simd           sqr_perf8 /* SIMD not implemented */
! #define over_perf_simd          over_perf_sse_gcc
! #define scalarover_perf_simd    scalarover_perf_sse_gcc
! #define min_perf_simd           min_perf_sse_gcc
! #define scalarmin_perf_simd     scalarmin_perf_sse_gcc
! #define max_perf_simd           max_perf_sse_gcc
! #define scalarmax_perf_simd     scalarmax_perf_sse_gcc
  
  /* functions in d_math.c */





More information about the Pd-cvs mailing list