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_v3dot.h"
20 #include <LinearMath/btVector3.h>
22 // reference code for testing purposes
28 #define LOOPCOUNT 1000
29 #define NUM_CYCLES 10000
41 w = BT_NAN; // w channel NaN
51 float correctDot0, testDot0;
56 correctDot0 = v3dot_ref(v1, v2);
57 testDot0 = v1.dot(v2);
59 if( fabsf(correctDot0 - testDot0) > FLT_EPSILON * 4 )
61 vlog( "Error - v3dot result error! %f != %f \n", correctDot0, testDot0);
67 #define DATA_SIZE 1024
69 btVector3 vec3_arr1[DATA_SIZE];
70 btVector3 vec3_arr2[DATA_SIZE];
71 btScalar res_arr[DATA_SIZE];
77 for( k = 0; k < DATA_SIZE; k++ )
82 vec3_arr1[k].setValue(x,y,z);
88 vec3_arr2[k].setValue(x,y,z);
95 uint64_t startTime, bestTime, currentTime;
99 for (j = 0; j < NUM_CYCLES; j++)
101 startTime = ReadTicks();
102 for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
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]);
110 currentTime = ReadTicks() - startTime;
111 scalarTime += currentTime;
112 if( currentTime < bestTime )
113 bestTime = currentTime;
115 if( 0 == gReportAverageTimes )
116 scalarTime = bestTime;
118 scalarTime /= NUM_CYCLES;
122 uint64_t startTime, bestTime, currentTime;
126 for (j = 0; j < NUM_CYCLES; j++)
128 startTime = ReadTicks();
129 for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
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]);
137 currentTime = ReadTicks() - startTime;
138 vectorTime += currentTime;
139 if( currentTime < bestTime )
140 bestTime = currentTime;
142 if( 0 == gReportAverageTimes )
143 vectorTime = bestTime;
145 vectorTime /= NUM_CYCLES;
149 vlog( " \t scalar\t vector\n" );
150 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT, TicksToCycles( vectorTime ) / LOOPCOUNT );
156 static btScalar v3dot_ref(const btVector3& v1,
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]);