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