Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Test / Source / Tests / Test_v3dot.cpp
1 //
2 //  Test_v3dot.cpp
3 //  BulletTest
4 //
5 //  Copyright (c) 2011 Apple Inc.
6 //
7
8
9
10 #include "LinearMath/btScalar.h"
11 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
12
13 #include "Test_v3dot.h"
14 #include "vector.h"
15 #include "Utils.h"
16 #include "main.h"
17 #include <math.h>
18 #include <string.h>
19
20 #include <LinearMath/btVector3.h>
21
22 // reference code for testing purposes
23 static inline 
24 btScalar v3dot_ref(
25     const btVector3& v1, 
26         const btVector3& v2);
27
28 #define LOOPCOUNT 1000
29 #define NUM_CYCLES 10000
30
31 int Test_v3dot(void)
32 {
33     btVector3 v1, v2;
34    
35     float x,y,z,w;
36     
37     // Init the data
38     x = RANDF_01;
39     y = RANDF_01;
40     z = RANDF_01;
41     w = BT_NAN;     // w channel NaN
42     v1.setValue(x,y,z);
43         v1.setW(w);
44
45     x = RANDF_01;
46     y = RANDF_01;
47     z = RANDF_01;
48     v2.setValue(x,y,z);
49         v2.setW(w);
50         
51     float correctDot0, testDot0;
52
53     {
54                 correctDot0 = w;
55                 testDot0 = w; ;
56                 correctDot0 = v3dot_ref(v1, v2);
57                 testDot0 = v1.dot(v2);
58            
59                 if( fabsf(correctDot0 - testDot0) > FLT_EPSILON * 4 )
60                 {
61                         vlog( "Error - v3dot result error! %f != %f \n", correctDot0, testDot0);
62                 
63                         return 1;
64                 }
65         }
66     
67 #define DATA_SIZE 1024
68
69         btVector3 vec3_arr1[DATA_SIZE];
70         btVector3 vec3_arr2[DATA_SIZE];
71     btScalar res_arr[DATA_SIZE];
72     
73     uint64_t scalarTime;
74     uint64_t vectorTime;
75     size_t j, k;
76
77         for( k = 0; k < DATA_SIZE; k++ )
78         {
79         x = RANDF_01;
80         y = RANDF_01;
81         z = RANDF_01;
82                 vec3_arr1[k].setValue(x,y,z);
83                 vec3_arr1[k].setW(w);
84
85         x = RANDF_01;
86         y = RANDF_01;
87         z = RANDF_01;
88                 vec3_arr2[k].setValue(x,y,z);
89                 vec3_arr2[k].setW(w);
90         
91         res_arr[k] = w;
92     }
93     
94         {
95         uint64_t startTime, bestTime, currentTime;
96         
97         bestTime = -1LL;
98         scalarTime = 0;
99         for (j = 0; j < NUM_CYCLES; j++) 
100                 {
101             startTime = ReadTicks();
102             for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
103                         {
104                                 size_t k32 = (k & (DATA_SIZE-1)); 
105                 res_arr[k32] = v3dot_ref( vec3_arr1[k32], vec3_arr2[k32]); k32++;
106                                 res_arr[k32] = v3dot_ref( vec3_arr1[k32], vec3_arr2[k32]); k32++;
107                                 res_arr[k32] = v3dot_ref( vec3_arr1[k32], vec3_arr2[k32]); k32++;
108                                 res_arr[k32] = v3dot_ref( vec3_arr1[k32], vec3_arr2[k32]); 
109                         }
110                         currentTime = ReadTicks() - startTime;
111             scalarTime += currentTime;
112             if( currentTime < bestTime )
113                 bestTime = currentTime;
114         }
115         if( 0 == gReportAverageTimes )
116             scalarTime = bestTime;        
117         else
118             scalarTime /= NUM_CYCLES;
119     }
120     
121     {
122         uint64_t startTime, bestTime, currentTime;
123         
124         bestTime = -1LL;
125         vectorTime = 0;
126         for (j = 0; j < NUM_CYCLES; j++) 
127                 {
128             startTime = ReadTicks();
129             for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
130                         {
131                                 size_t k32 = k & (DATA_SIZE -1); 
132                 res_arr[k32] = vec3_arr1[k32].dot(vec3_arr2[k32]); k32++;
133                                 res_arr[k32] = vec3_arr1[k32].dot(vec3_arr2[k32]); k32++;
134                                 res_arr[k32] = vec3_arr1[k32].dot(vec3_arr2[k32]); k32++;
135                                 res_arr[k32] = vec3_arr1[k32].dot(vec3_arr2[k32]);
136                         }
137                         currentTime = ReadTicks() - startTime;
138             vectorTime += currentTime;
139             if( currentTime < bestTime )
140                 bestTime = currentTime;
141         }
142         if( 0 == gReportAverageTimes )
143             vectorTime = bestTime;        
144         else
145             vectorTime /= NUM_CYCLES;
146     }
147
148     vlog( "Timing:\n" );
149     vlog( "     \t    scalar\t    vector\n" );
150         vlog( "    \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT, TicksToCycles( vectorTime ) / LOOPCOUNT );
151
152     return 0;
153 }
154
155
156 static btScalar v3dot_ref(const btVector3& v1, 
157                                                 const btVector3& v2)
158 {
159         return  (v1.m_floats[0] * v2.m_floats[0] + 
160                          v1.m_floats[1] * v2.m_floats[1] + 
161                          v1.m_floats[2] * v2.m_floats[2]);
162 }
163
164 #endif //BT_USE_SSE