115 lines
2.1 KiB
C
115 lines
2.1 KiB
C
/* 16-bit signed integer dot product
|
|
* Switch to appropriate versions
|
|
* Copyright 2004 Phil Karn
|
|
* May be used under the terms of the GNU Lesser General Public License (LGPL)
|
|
*/
|
|
#include <stdlib.h>
|
|
#include "fec.h"
|
|
|
|
void *initdp_port(signed short coeffs[], int len);
|
|
long dotprod_port(void *p, signed short *b);
|
|
void freedp_port(void *p);
|
|
|
|
#ifdef __i386__
|
|
void *initdp_mmx(signed short coeffs[], int len);
|
|
void *initdp_sse2(signed short coeffs[], int len);
|
|
long dotprod_mmx(void *p, signed short *b);
|
|
long dotprod_sse2(void *p, signed short *b);
|
|
void freedp_mmx(void *p);
|
|
void freedp_sse2(void *p);
|
|
#endif
|
|
|
|
#ifdef __VEC__
|
|
void *initdp_av(signed short coeffs[], int len);
|
|
long dotprod_av(void *p, signed short *b);
|
|
void freedp_av(void *p);
|
|
#endif
|
|
|
|
/* Create and return a descriptor for use with the dot product function */
|
|
void *initdp(signed short coeffs[], int len)
|
|
{
|
|
find_cpu_mode();
|
|
|
|
switch (Cpu_mode) {
|
|
case PORT:
|
|
default:
|
|
return initdp_port(coeffs, len);
|
|
#ifdef __i386__
|
|
case MMX:
|
|
case SSE:
|
|
return initdp_mmx(coeffs, len);
|
|
case SSE2:
|
|
return initdp_sse2(coeffs, len);
|
|
#endif
|
|
|
|
#ifdef __x86_64__
|
|
case SSE2:
|
|
return initdp_port(coeffs, len);
|
|
#endif
|
|
|
|
#ifdef __VEC__
|
|
case ALTIVEC:
|
|
return initdp_av(coeffs, len);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
/* Free a dot product descriptor created earlier */
|
|
void freedp(void *p)
|
|
{
|
|
switch (Cpu_mode) {
|
|
case PORT:
|
|
default:
|
|
return freedp_port(p);
|
|
#ifdef __i386__
|
|
case MMX:
|
|
case SSE:
|
|
return freedp_mmx(p);
|
|
case SSE2:
|
|
return freedp_sse2(p);
|
|
#endif
|
|
|
|
#ifdef __x86_64__
|
|
case SSE2:
|
|
return freedp_port(p);
|
|
#endif
|
|
|
|
#ifdef __VEC__
|
|
case ALTIVEC:
|
|
return freedp_av(p);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
/* Compute a dot product given a descriptor and an input array
|
|
* The length is taken from the descriptor
|
|
*/
|
|
long dotprod(void *p, signed short a[])
|
|
{
|
|
switch (Cpu_mode) {
|
|
case PORT:
|
|
default:
|
|
return dotprod_port(p, a);
|
|
#ifdef __i386__
|
|
case MMX:
|
|
case SSE:
|
|
return dotprod_mmx(p, a);
|
|
case SSE2:
|
|
return dotprod_sse2(p, a);
|
|
#endif
|
|
|
|
#ifdef __x86_64__
|
|
case SSE2:
|
|
return dotprod_port(p, a);
|
|
#endif
|
|
|
|
#ifdef __VEC__
|
|
case ALTIVEC:
|
|
return dotprod_av(p, a);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|