1*638691a0SAndroid Build Coastguard Worker /* Test dot-product function */
2*638691a0SAndroid Build Coastguard Worker
3*638691a0SAndroid Build Coastguard Worker #include <stdio.h>
4*638691a0SAndroid Build Coastguard Worker #include <stdlib.h>
5*638691a0SAndroid Build Coastguard Worker #include <memory.h>
6*638691a0SAndroid Build Coastguard Worker #include <math.h>
7*638691a0SAndroid Build Coastguard Worker #include "config.h"
8*638691a0SAndroid Build Coastguard Worker #ifdef HAVE_GETOPT_H
9*638691a0SAndroid Build Coastguard Worker #include <getopt.h>
10*638691a0SAndroid Build Coastguard Worker #endif
11*638691a0SAndroid Build Coastguard Worker #include "fec.h"
12*638691a0SAndroid Build Coastguard Worker
13*638691a0SAndroid Build Coastguard Worker #if HAVE_GETOPT_LONG
14*638691a0SAndroid Build Coastguard Worker struct option Options[] = {
15*638691a0SAndroid Build Coastguard Worker {"force-altivec",0,NULL,'a'},
16*638691a0SAndroid Build Coastguard Worker {"force-port",0,NULL,'p'},
17*638691a0SAndroid Build Coastguard Worker {"force-mmx",0,NULL,'m'},
18*638691a0SAndroid Build Coastguard Worker {"force-sse",0,NULL,'s'},
19*638691a0SAndroid Build Coastguard Worker {"force-sse2",0,NULL,'t'},
20*638691a0SAndroid Build Coastguard Worker {"trials",0,NULL,'n'},
21*638691a0SAndroid Build Coastguard Worker {NULL},
22*638691a0SAndroid Build Coastguard Worker };
23*638691a0SAndroid Build Coastguard Worker #endif
24*638691a0SAndroid Build Coastguard Worker
main(int argc,char * argv[])25*638691a0SAndroid Build Coastguard Worker int main(int argc,char *argv[]){
26*638691a0SAndroid Build Coastguard Worker short coeffs[512];
27*638691a0SAndroid Build Coastguard Worker short input[2048];
28*638691a0SAndroid Build Coastguard Worker int trials=1000,d;
29*638691a0SAndroid Build Coastguard Worker int errors = 0;
30*638691a0SAndroid Build Coastguard Worker
31*638691a0SAndroid Build Coastguard Worker #if HAVE_GETOPT_LONG
32*638691a0SAndroid Build Coastguard Worker while((d = getopt_long(argc,argv,"apmstn:",Options,NULL)) != EOF){
33*638691a0SAndroid Build Coastguard Worker #else
34*638691a0SAndroid Build Coastguard Worker while((d = getopt(argc,argv,"apmstn:")) != EOF){
35*638691a0SAndroid Build Coastguard Worker #endif
36*638691a0SAndroid Build Coastguard Worker switch(d){
37*638691a0SAndroid Build Coastguard Worker case 'a':
38*638691a0SAndroid Build Coastguard Worker Cpu_mode = ALTIVEC;
39*638691a0SAndroid Build Coastguard Worker break;
40*638691a0SAndroid Build Coastguard Worker case 'p':
41*638691a0SAndroid Build Coastguard Worker Cpu_mode = PORT;
42*638691a0SAndroid Build Coastguard Worker break;
43*638691a0SAndroid Build Coastguard Worker case 'm':
44*638691a0SAndroid Build Coastguard Worker Cpu_mode = MMX;
45*638691a0SAndroid Build Coastguard Worker break;
46*638691a0SAndroid Build Coastguard Worker case 's':
47*638691a0SAndroid Build Coastguard Worker Cpu_mode = SSE;
48*638691a0SAndroid Build Coastguard Worker break;
49*638691a0SAndroid Build Coastguard Worker case 't':
50*638691a0SAndroid Build Coastguard Worker Cpu_mode = SSE2;
51*638691a0SAndroid Build Coastguard Worker break;
52*638691a0SAndroid Build Coastguard Worker case 'n':
53*638691a0SAndroid Build Coastguard Worker trials = atoi(optarg);
54*638691a0SAndroid Build Coastguard Worker break;
55*638691a0SAndroid Build Coastguard Worker }
56*638691a0SAndroid Build Coastguard Worker }
57*638691a0SAndroid Build Coastguard Worker
58*638691a0SAndroid Build Coastguard Worker while(trials--){
59*638691a0SAndroid Build Coastguard Worker long port_result;
60*638691a0SAndroid Build Coastguard Worker long simd_result;
61*638691a0SAndroid Build Coastguard Worker int ntaps;
62*638691a0SAndroid Build Coastguard Worker int i;
63*638691a0SAndroid Build Coastguard Worker int csum = 0;
64*638691a0SAndroid Build Coastguard Worker int offset;
65*638691a0SAndroid Build Coastguard Worker void *dp_simd,*dp_port;
66*638691a0SAndroid Build Coastguard Worker
67*638691a0SAndroid Build Coastguard Worker /* Generate set of coefficients
68*638691a0SAndroid Build Coastguard Worker * limit sum of absolute values to 32767 to avoid overflow
69*638691a0SAndroid Build Coastguard Worker */
70*638691a0SAndroid Build Coastguard Worker memset(coeffs,0,sizeof(coeffs));
71*638691a0SAndroid Build Coastguard Worker for(i=0;i<512;i++){
72*638691a0SAndroid Build Coastguard Worker double gv;
73*638691a0SAndroid Build Coastguard Worker
74*638691a0SAndroid Build Coastguard Worker gv = normal_rand(0.,100.);
75*638691a0SAndroid Build Coastguard Worker if(csum + fabs(gv) > 32767)
76*638691a0SAndroid Build Coastguard Worker break;
77*638691a0SAndroid Build Coastguard Worker coeffs[i] = gv;
78*638691a0SAndroid Build Coastguard Worker csum += fabs(gv);
79*638691a0SAndroid Build Coastguard Worker }
80*638691a0SAndroid Build Coastguard Worker ntaps = i;
81*638691a0SAndroid Build Coastguard Worker
82*638691a0SAndroid Build Coastguard Worker /* Compare results to portable C version for a bunch of random data buffers and offsets */
83*638691a0SAndroid Build Coastguard Worker dp_simd = initdp(coeffs,ntaps);
84*638691a0SAndroid Build Coastguard Worker dp_port = initdp_port(coeffs,ntaps);
85*638691a0SAndroid Build Coastguard Worker
86*638691a0SAndroid Build Coastguard Worker for(i=0;i<2048;i++)
87*638691a0SAndroid Build Coastguard Worker input[i] = random();
88*638691a0SAndroid Build Coastguard Worker
89*638691a0SAndroid Build Coastguard Worker offset = random() & 511;
90*638691a0SAndroid Build Coastguard Worker
91*638691a0SAndroid Build Coastguard Worker simd_result = dotprod(dp_simd,input+offset);
92*638691a0SAndroid Build Coastguard Worker port_result = dotprod_port(dp_port,input+offset);
93*638691a0SAndroid Build Coastguard Worker if(simd_result != port_result){
94*638691a0SAndroid Build Coastguard Worker errors++;
95*638691a0SAndroid Build Coastguard Worker }
96*638691a0SAndroid Build Coastguard Worker }
97*638691a0SAndroid Build Coastguard Worker printf("dtest: %d errors\n",errors);
98*638691a0SAndroid Build Coastguard Worker exit(0);
99*638691a0SAndroid Build Coastguard Worker }
100