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