5 // Copyright (c) 2011 Apple Inc.
9 #include "LinearMath/btScalar.h"
10 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
13 #include "Test_v3cross.h"
20 #include <LinearMath/btVector3.h>
22 // reference code for testing purposes
23 static btVector3& v3cross_ref(btVector3& v1, btVector3& v2);
25 #define LOOPCOUNT 1024
26 #define NUM_CYCLES 1000
28 int Test_v3cross(void)
38 w = BT_NAN; // w channel NaN
50 btVector3 correct_res, test_res;
54 correct_res.setValue(vNaN, vNaN, vNaN);
55 test_res.setValue(vNaN, vNaN, vNaN);
56 correct_res = v3cross_ref(v1, v2);
57 test_res = v3.cross(v2);
59 if( fabs(correct_res.m_floats[0] - test_res.m_floats[0]) +
60 fabs(correct_res.m_floats[1] - test_res.m_floats[1]) +
61 fabs(correct_res.m_floats[2] - test_res.m_floats[2]) > FLT_EPSILON * 4)
63 vlog( "Error - v3cross result error! "
64 "\ncorrect = (%10.4f, %10.4f, %10.4f) "
65 "\ntested = (%10.4f, %10.4f, %10.4f) \n",
66 correct_res.m_floats[0], correct_res.m_floats[1], correct_res.m_floats[2],
67 test_res.m_floats[0], test_res.m_floats[1], test_res.m_floats[2]);
73 #define DATA_SIZE LOOPCOUNT
75 btVector3 vec3_arr1[DATA_SIZE];
76 btVector3 vec3_arr2[DATA_SIZE];
83 uint64_t startTime, bestTime, currentTime;
87 for (j = 0; j < NUM_CYCLES; j++)
89 for( k = 0; k < DATA_SIZE; k++ )
94 vec3_arr1[k].setValue(x,y,z);
100 vec3_arr2[k].setValue(x,y,z);
101 vec3_arr2[k].setW(w);
104 startTime = ReadTicks();
105 for( k = 0; k < LOOPCOUNT; k++ )
107 vec3_arr1[k] = v3cross_ref(vec3_arr1[k], vec3_arr2[k]);
109 currentTime = ReadTicks() - startTime;
110 scalarTime += currentTime;
111 if( currentTime < bestTime )
112 bestTime = currentTime;
114 if( 0 == gReportAverageTimes )
115 scalarTime = bestTime;
117 scalarTime /= NUM_CYCLES;
121 uint64_t startTime, bestTime, currentTime;
125 for (j = 0; j < NUM_CYCLES; j++)
127 for( k = 0; k < DATA_SIZE; k++ )
132 vec3_arr1[k].setValue(x,y,z);
133 vec3_arr1[k].setW(w);
138 vec3_arr2[k].setValue(x,y,z);
139 vec3_arr2[k].setW(w);
142 startTime = ReadTicks();
143 for( k = 0; k < LOOPCOUNT; k++ )
145 vec3_arr1[k] = vec3_arr1[k].cross(vec3_arr2[k]);
147 currentTime = ReadTicks() - startTime;
148 vectorTime += currentTime;
149 if( currentTime < bestTime )
150 bestTime = currentTime;
152 if( 0 == gReportAverageTimes )
153 vectorTime = bestTime;
155 vectorTime /= NUM_CYCLES;
159 vlog( " \t scalar\t vector\n" );
160 vlog( " \t%10.4f\t%10.4f\n", TicksToCycles( scalarTime ) / LOOPCOUNT,
161 TicksToCycles( vectorTime ) / LOOPCOUNT );
166 static btVector3& v3cross_ref(btVector3& v1, btVector3& v2)
169 x = v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1];
170 y = v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2];
171 z = v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0];