1 /* 16-bit signed integer dot product 2 * Switch to appropriate versions 3 * Copyright 2004 Phil Karn 4 * May be used under the terms of the GNU Lesser General Public License (LGPL) 5 */ 6 #include <stdlib.h> 7 #include "fec.h" 8 9 void *initdp_port(signed short coeffs[],int len); 10 long dotprod_port(void *p,signed short *b); 11 void freedp_port(void *p); 12 13 #ifdef __i386__ 14 void *initdp_mmx(signed short coeffs[],int len); 15 void *initdp_sse2(signed short coeffs[],int len); 16 long dotprod_mmx(void *p,signed short *b); 17 long dotprod_sse2(void *p,signed short *b); 18 void freedp_mmx(void *p); 19 void freedp_sse2(void *p); 20 #endif 21 22 #ifdef __VEC__ 23 void *initdp_av(signed short coeffs[],int len); 24 long dotprod_av(void *p,signed short *b); 25 void freedp_av(void *p); 26 #endif 27 28 /* Create and return a descriptor for use with the dot product function */ 29 void *initdp(signed short coeffs[],int len){ 30 find_cpu_mode(); 31 32 switch(Cpu_mode){ 33 case PORT: 34 default: 35 return initdp_port(coeffs,len); 36 #ifdef __i386__ 37 case MMX: 38 case SSE: 39 return initdp_mmx(coeffs,len); 40 case SSE2: 41 return initdp_sse2(coeffs,len); 42 #endif 43 44 #ifdef __VEC__ 45 case ALTIVEC: 46 return initdp_av(coeffs,len); 47 #endif 48 } 49 } 50 51 52 /* Free a dot product descriptor created earlier */ 53 void freedp(void *p){ 54 switch(Cpu_mode){ 55 case PORT: 56 default: 57 #ifdef __i386__ 58 case MMX: 59 case SSE: 60 return freedp_mmx(p); 61 case SSE2: 62 return freedp_sse2(p); 63 #endif 64 #ifdef __VEC__ 65 case ALTIVEC: 66 return freedp_av(p); 67 #endif 68 } 69 } 70 71 /* Compute a dot product given a descriptor and an input array 72 * The length is taken from the descriptor 73 */ 74 long dotprod(void *p,signed short a[]){ 75 switch(Cpu_mode){ 76 case PORT: 77 default: 78 return dotprod_port(p,a); 79 #ifdef __i386__ 80 case MMX: 81 case SSE: 82 return dotprod_mmx(p,a); 83 case SSE2: 84 return dotprod_sse2(p,a); 85 #endif 86 87 #ifdef __VEC__ 88 case ALTIVEC: 89 return dotprod_av(p,a); 90 #endif 91 } 92 } 93 94 95