| /* 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 __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: |
| #ifdef __i386__ |
| case MMX: |
| case SSE: |
| return freedp_mmx(p); |
| case SSE2: |
| return freedp_sse2(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 __VEC__ |
| case ALTIVEC: |
| return dotprod_av(p,a); |
| #endif |
| } |
| } |
| |
| |