107 lines
2.1 KiB
C
107 lines
2.1 KiB
C
|
#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);
|
||
|
}
|