1*638691a0SAndroid Build Coastguard Worker #include <stdio.h>
2*638691a0SAndroid Build Coastguard Worker #include <stdlib.h>
3*638691a0SAndroid Build Coastguard Worker #include <memory.h>
4*638691a0SAndroid Build Coastguard Worker #include <time.h>
5*638691a0SAndroid Build Coastguard Worker #include "config.h"
6*638691a0SAndroid Build Coastguard Worker #ifdef HAVE_GETOPT_H
7*638691a0SAndroid Build Coastguard Worker #include <getopt.h>
8*638691a0SAndroid Build Coastguard Worker #endif
9*638691a0SAndroid Build Coastguard Worker #include "fec.h"
10*638691a0SAndroid Build Coastguard Worker
11*638691a0SAndroid Build Coastguard Worker #if HAVE_GETOPT_LONG
12*638691a0SAndroid Build Coastguard Worker struct option Options[] = {
13*638691a0SAndroid Build Coastguard Worker {"frame-length",1,NULL,'l'},
14*638691a0SAndroid Build Coastguard Worker {"frame-count",1,NULL,'n'},
15*638691a0SAndroid Build Coastguard Worker {"verbose",0,NULL,'v'},
16*638691a0SAndroid Build Coastguard Worker {"force-altivec",0,NULL,'a'},
17*638691a0SAndroid Build Coastguard Worker {"force-port",0,NULL,'p'},
18*638691a0SAndroid Build Coastguard Worker {"force-mmx",0,NULL,'m'},
19*638691a0SAndroid Build Coastguard Worker {"force-sse",0,NULL,'s'},
20*638691a0SAndroid Build Coastguard Worker {"force-sse2",0,NULL,'t'},
21*638691a0SAndroid Build Coastguard Worker {NULL},
22*638691a0SAndroid Build Coastguard Worker };
23*638691a0SAndroid Build Coastguard Worker #endif
24*638691a0SAndroid Build Coastguard Worker
25*638691a0SAndroid Build Coastguard Worker int Verbose = 0;
26*638691a0SAndroid Build Coastguard Worker
main(int argc,char * argv[])27*638691a0SAndroid Build Coastguard Worker int main(int argc,char *argv[]){
28*638691a0SAndroid Build Coastguard Worker signed short *buf;
29*638691a0SAndroid Build Coastguard Worker int i,d,trial,trials=10000;
30*638691a0SAndroid Build Coastguard Worker int bufsize = 2048;
31*638691a0SAndroid Build Coastguard Worker long long port_sum,simd_sum;
32*638691a0SAndroid Build Coastguard Worker time_t t;
33*638691a0SAndroid Build Coastguard Worker int timetrials=0;
34*638691a0SAndroid Build Coastguard Worker
35*638691a0SAndroid Build Coastguard Worker find_cpu_mode();
36*638691a0SAndroid Build Coastguard Worker time(&t);
37*638691a0SAndroid Build Coastguard Worker srandom(t);
38*638691a0SAndroid Build Coastguard Worker
39*638691a0SAndroid Build Coastguard Worker #if HAVE_GETOPT_LONG
40*638691a0SAndroid Build Coastguard Worker while((d = getopt_long(argc,argv,"vapmstl:n:T",Options,NULL)) != EOF){
41*638691a0SAndroid Build Coastguard Worker #else
42*638691a0SAndroid Build Coastguard Worker while((d = getopt(argc,argv,"vapmstl:n:T")) != EOF){
43*638691a0SAndroid Build Coastguard Worker #endif
44*638691a0SAndroid Build Coastguard Worker switch(d){
45*638691a0SAndroid Build Coastguard Worker case 'a':
46*638691a0SAndroid Build Coastguard Worker Cpu_mode = ALTIVEC;
47*638691a0SAndroid Build Coastguard Worker break;
48*638691a0SAndroid Build Coastguard Worker case 'p':
49*638691a0SAndroid Build Coastguard Worker Cpu_mode = PORT;
50*638691a0SAndroid Build Coastguard Worker break;
51*638691a0SAndroid Build Coastguard Worker case 'm':
52*638691a0SAndroid Build Coastguard Worker Cpu_mode = MMX;
53*638691a0SAndroid Build Coastguard Worker break;
54*638691a0SAndroid Build Coastguard Worker case 's':
55*638691a0SAndroid Build Coastguard Worker Cpu_mode = SSE;
56*638691a0SAndroid Build Coastguard Worker break;
57*638691a0SAndroid Build Coastguard Worker case 't':
58*638691a0SAndroid Build Coastguard Worker Cpu_mode = SSE2;
59*638691a0SAndroid Build Coastguard Worker break;
60*638691a0SAndroid Build Coastguard Worker case 'l':
61*638691a0SAndroid Build Coastguard Worker bufsize = atoi(optarg);
62*638691a0SAndroid Build Coastguard Worker break;
63*638691a0SAndroid Build Coastguard Worker case 'n':
64*638691a0SAndroid Build Coastguard Worker trials = atoi(optarg);
65*638691a0SAndroid Build Coastguard Worker break;
66*638691a0SAndroid Build Coastguard Worker case 'v':
67*638691a0SAndroid Build Coastguard Worker Verbose++;
68*638691a0SAndroid Build Coastguard Worker break;
69*638691a0SAndroid Build Coastguard Worker case 'T':
70*638691a0SAndroid Build Coastguard Worker timetrials++;
71*638691a0SAndroid Build Coastguard Worker break;
72*638691a0SAndroid Build Coastguard Worker }
73*638691a0SAndroid Build Coastguard Worker }
74*638691a0SAndroid Build Coastguard Worker
75*638691a0SAndroid Build Coastguard Worker buf = (signed short *)calloc(bufsize,sizeof(signed short));
76*638691a0SAndroid Build Coastguard Worker if(timetrials){
77*638691a0SAndroid Build Coastguard Worker for(trial=0;trial<trials;trial++){
78*638691a0SAndroid Build Coastguard Worker (void)sumsq(buf,bufsize);
79*638691a0SAndroid Build Coastguard Worker }
80*638691a0SAndroid Build Coastguard Worker } else {
81*638691a0SAndroid Build Coastguard Worker for(trial=0;trial<trials;trial++){
82*638691a0SAndroid Build Coastguard Worker int length,offset;
83*638691a0SAndroid Build Coastguard Worker
84*638691a0SAndroid Build Coastguard Worker offset = random() & 7;
85*638691a0SAndroid Build Coastguard Worker length = (random() % bufsize) - offset;
86*638691a0SAndroid Build Coastguard Worker if(length <= 0)
87*638691a0SAndroid Build Coastguard Worker continue;
88*638691a0SAndroid Build Coastguard Worker for(i=0;i<bufsize;i++)
89*638691a0SAndroid Build Coastguard Worker buf[i] = random();
90*638691a0SAndroid Build Coastguard Worker
91*638691a0SAndroid Build Coastguard Worker port_sum = sumsq_port(buf+offset,length);
92*638691a0SAndroid Build Coastguard Worker simd_sum = sumsq(buf+offset,length);
93*638691a0SAndroid Build Coastguard Worker if(port_sum != simd_sum){
94*638691a0SAndroid Build Coastguard Worker printf("offset %d len %d port_sum = %lld simd_sum = %lld ",offset,length,port_sum,simd_sum);
95*638691a0SAndroid Build Coastguard Worker
96*638691a0SAndroid Build Coastguard Worker printf("ERROR! diff = %lld\n",simd_sum-port_sum);
97*638691a0SAndroid Build Coastguard Worker }
98*638691a0SAndroid Build Coastguard Worker }
99*638691a0SAndroid Build Coastguard Worker }
100*638691a0SAndroid Build Coastguard Worker exit(0);
101*638691a0SAndroid Build Coastguard Worker }
102