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
10 typedef double ( *ddf ) ( double );
11
12
13 float a1 [256];
14 float a2 [256];
15
init(void)16 void 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
test(unsigned int no,scalar_t f)26 void 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
testn(scalarn_t f)58 void 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
test2(const char * name,ddf f)93 void 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
main(int argc,char ** argv)109 int 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