5 // Copyright (c) 2011 Apple Inc.
10 #include "LinearMath/btScalar.h"
11 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
13 #include "Test_qtdot.h"
20 #include <LinearMath/btQuaternion.h>
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);
26 static inline btScalar qtdot_ref(btQuaternion& q1, btQuaternion& q2)
35 #define LOOPCOUNT 1024
36 #define NUM_CYCLES 1000
41 float x, y, z, w, vNaN;
42 vNaN = BT_NAN; // w channel NaN
57 btScalar correct_res, test_res;
62 correct_res = qtdot_ref(q1, q2);
63 test_res = BT_OP(q1,q2);
65 if( fabsf(correct_res - test_res) > FLT_EPSILON*4 )
67 vlog( "Error - qtdot result error! "
69 "\ntested = %10.4f \n",
70 correct_res, test_res);
76 #define DATA_SIZE LOOPCOUNT
78 btQuaternion qt_arr1[DATA_SIZE];
79 btQuaternion qt_arr2[DATA_SIZE];
80 btScalar res_arr[DATA_SIZE];
86 for( k = 0; k < DATA_SIZE; k++ )
92 qt_arr1[k].setValue(x,y,z,w);
98 qt_arr2[k].setValue(x,y,z,w);
102 uint64_t startTime, bestTime, currentTime;
106 for (j = 0; j < NUM_CYCLES; j++)
108 startTime = ReadTicks();
109 for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
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]);
117 currentTime = ReadTicks() - startTime;
118 scalarTime += currentTime;
119 if( currentTime < bestTime )
120 bestTime = currentTime;
122 if( 0 == gReportAverageTimes )
123 scalarTime = bestTime;
125 scalarTime /= NUM_CYCLES;
129 uint64_t startTime, bestTime, currentTime;
133 for (j = 0; j < NUM_CYCLES; j++)
135 startTime = ReadTicks();
136 for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
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++;
144 currentTime = ReadTicks() - startTime;
145 vectorTime += currentTime;
146 if( currentTime < bestTime )
147 bestTime = currentTime;
149 if( 0 == gReportAverageTimes )
150 vectorTime = bestTime;
152 vectorTime /= NUM_CYCLES;
156 vlog( " \t scalar\t vector\n" );
157 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT,
158 TicksToCycles( vectorTime ) / LOOPCOUNT );