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 */
initdp(signed short coeffs[],int len)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 */
freedp(void * p)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 */
dotprod(void * p,signed short a[])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