aboutsummaryrefslogtreecommitdiffstats
path: root/sumsq_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'sumsq_test.c')
-rw-r--r--sumsq_test.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/sumsq_test.c b/sumsq_test.c
new file mode 100644
index 0000000..4debd47
--- /dev/null
+++ b/sumsq_test.c
@@ -0,0 +1,101 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+#include <time.h>
+#include "config.h"
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+#include "fec.h"
+
+#if HAVE_GETOPT_LONG
+struct option Options[] = {
+ {"frame-length",1,NULL,'l'},
+ {"frame-count",1,NULL,'n'},
+ {"verbose",0,NULL,'v'},
+ {"force-altivec",0,NULL,'a'},
+ {"force-port",0,NULL,'p'},
+ {"force-mmx",0,NULL,'m'},
+ {"force-sse",0,NULL,'s'},
+ {"force-sse2",0,NULL,'t'},
+ {NULL},
+};
+#endif
+
+int Verbose = 0;
+
+int main(int argc,char *argv[]){
+ signed short *buf;
+ int i,d,trial,trials=10000;
+ int bufsize = 2048;
+ long long port_sum,simd_sum;
+ time_t t;
+ int timetrials=0;
+
+ find_cpu_mode();
+ time(&t);
+ srandom(t);
+
+#if HAVE_GETOPT_LONG
+ while((d = getopt_long(argc,argv,"vapmstl:n:T",Options,NULL)) != EOF){
+#else
+ while((d = getopt(argc,argv,"vapmstl:n:T")) != EOF){
+#endif
+ switch(d){
+ case 'a':
+ Cpu_mode = ALTIVEC;
+ break;
+ case 'p':
+ Cpu_mode = PORT;
+ break;
+ case 'm':
+ Cpu_mode = MMX;
+ break;
+ case 's':
+ Cpu_mode = SSE;
+ break;
+ case 't':
+ Cpu_mode = SSE2;
+ break;
+ case 'l':
+ bufsize = atoi(optarg);
+ break;
+ case 'n':
+ trials = atoi(optarg);
+ break;
+ case 'v':
+ Verbose++;
+ break;
+ case 'T':
+ timetrials++;
+ break;
+ }
+ }
+
+ buf = (signed short *)calloc(bufsize,sizeof(signed short));
+ if(timetrials){
+ for(trial=0;trial<trials;trial++){
+ (void)sumsq(buf,bufsize);
+ }
+ } else {
+ for(trial=0;trial<trials;trial++){
+ int length,offset;
+
+ offset = random() & 7;
+ length = (random() % bufsize) - offset;
+ if(length <= 0)
+ continue;
+ for(i=0;i<bufsize;i++)
+ buf[i] = random();
+
+ port_sum = sumsq_port(buf+offset,length);
+ simd_sum = sumsq(buf+offset,length);
+ if(port_sum != simd_sum){
+ printf("offset %d len %d port_sum = %lld simd_sum = %lld ",offset,length,port_sum,simd_sum);
+
+ printf("ERROR! diff = %lld\n",simd_sum-port_sum);
+ }
+ }
+ }
+ exit(0);
+}