xref: /third_party/lame/misc/scalartest.c (revision 159b3361)
1#include <stdio.h>
2#include <math.h>
3#include <asm/msr.h>
4#include "resample.h"
5
6#define CLK    300.e6
7#define LOOPS  20000
8
9
10typedef double ( *ddf ) ( double );
11
12
13float a1 [256];
14float a2 [256];
15
16void init ( void )
17{
18    int  i;
19
20    for ( i = 0; i < sizeof(a1)/sizeof(*a1); i++ ) {
21        a1 [i] = sin(i)+0.2*sin(1.8*i)+log(2+i);
22	a2 [i] = cos(0.1*i);
23    }
24}
25
26void test ( unsigned int no, scalar_t f )
27{
28    unsigned long long  t1;
29    unsigned long long  t2;
30    unsigned long long  t3;
31    unsigned long long  t4;
32    int                 l;
33    double              last = 0;
34    double              curr = 0;
35
36    printf ( "[%3u] %22.14f\t\t", no, (double)f (a1,a2) );
37    fflush ( stdout );
38
39    do {
40    rdtscll (t1);
41    l = LOOPS;
42    do
43        ;
44    while (--l);
45    rdtscll (t2);
46    rdtscll (t3);
47    l = LOOPS;
48    do
49        f(a1,a2), f(a1,a2), f(a1,a2), f(a1,a2);
50    while (--l);
51    rdtscll (t4);
52    last = curr;
53    curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9;
54    } while ( fabs(curr-last) > 1.e-4 * (curr+last) );
55    printf ("%8.2f ns\n", (curr+last) / 2 );
56}
57
58void testn ( scalarn_t f )
59{
60    unsigned long long  t1;
61    unsigned long long  t2;
62    unsigned long long  t3;
63    unsigned long long  t4;
64    int                 l;
65    int                 i;
66    double              last = 0;
67    double              curr = 0;
68
69    for ( i = 1; i <= 64; i += i<6 ? 1 : i<8 ? 2 : i ) {
70        printf ( "[%3u] %22.14f\t\t", 4u*i, (double)f (a1,a2,i) );
71        fflush ( stdout );
72
73    do {
74        rdtscll (t1);
75        l = LOOPS;
76        do
77            ;
78        while (--l);
79        rdtscll (t2);
80        rdtscll (t3);
81        l = LOOPS;
82        do
83            f(a1,a2,i), f(a1,a2,i), f(a1,a2,i), f(a1,a2,i);
84        while (--l);
85        rdtscll (t4);
86    last = curr;
87    curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9;
88    } while ( fabs(curr-last) > 1.e-4 * (curr+last) );
89    printf ("%8.2f ns\n", (curr+last) / 2 );
90    }
91}
92
93void test2 ( const char* name, ddf f )
94{
95    int     i;
96    double  x;
97
98    printf ( "\n%%%% %s\n\n", name );
99
100    for ( i = -1000; i <= 1000; i++ ) {
101        x = 1.e-3 * i;
102	printf ( "%5d\t%12.8f\t%12.8f\t%12.8f\n", i, f(x), (f(x+5.e-5) - f(x-5.e-5))*1.e+4, (f(x+1.e-4) + f(x-1.e-4) - 2*f(x))*5.e+7 );
103    }
104    printf ( "%%%%\n" );
105    fflush ( stdout );
106}
107
108
109int main ( int argc, char** argv )
110{
111
112#if 0
113
114    test2 ( "Hann", hanning   );
115    test2 ( "Hamm", hamming   );
116    test2 ( "BM", blackman  );
117    test2 ( "BM1",blackman1 );
118    test2 ( "BM2",blackman2 );
119    test2 ( "BMH N",blackmanharris_nuttall );
120    test2 ( "MNH Min",blackmanharris_min4    );
121
122#else
123
124    init ();
125
126    test ( 4, scalar04_float32       );
127    test ( 4, scalar04_float32_i387  );
128    test ( 4, scalar04_float32_3DNow );
129    test ( 4, scalar04_float32_SIMD  );
130
131    test ( 8, scalar08_float32       );
132    test ( 8, scalar08_float32_i387  );
133    test ( 8, scalar08_float32_3DNow );
134    test ( 8, scalar08_float32_SIMD  );
135
136    test ( 12, scalar12_float32       );
137    test ( 12, scalar12_float32_i387  );
138    test ( 12, scalar12_float32_3DNow );
139    test ( 12, scalar12_float32_SIMD  );
140
141    test ( 16, scalar16_float32       );
142    test ( 16, scalar16_float32_i387  );
143    test ( 16, scalar16_float32_3DNow );
144    test ( 16, scalar16_float32_SIMD  );
145
146    test ( 20, scalar20_float32       );
147    test ( 20, scalar20_float32_i387  );
148    test ( 20, scalar20_float32_3DNow );
149    test ( 20, scalar20_float32_SIMD  );
150
151    test ( 24, scalar24_float32       );
152    test ( 24, scalar24_float32_i387  );
153    test ( 24, scalar24_float32_3DNow );
154    test ( 24, scalar24_float32_SIMD  );
155
156    testn( scalar4n_float32       );
157    testn( scalar4n_float32_i387  );
158    testn( scalar4n_float32_3DNow );
159    testn( scalar4n_float32_SIMD  );
160
161#endif
162
163    return 0;
164}
165
166/* end of scalartest.c */
167