5 // Copyright (c) 2011 Apple Inc.
10 #include "LinearMath/btScalar.h"
11 #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
14 #include "Test_v3sdiv.h"
21 #include <LinearMath/btVector3.h>
23 // reference code for testing purposes
25 btVector3& v3sdiv_ref(
29 #define LOOPCOUNT 2048
30 #define NUM_CYCLES 1000
43 w = BT_NAN; // w channel NaN
52 btVector3 correct_res, test_res;
56 correct_res.setValue(vNaN, vNaN, vNaN);
57 test_res.setValue(vNaN, vNaN, vNaN);
58 correct_res = v3sdiv_ref(v1, s);
61 if( fabs(correct_res.m_floats[0] - test_res.m_floats[0]) +
62 fabs(correct_res.m_floats[1] - test_res.m_floats[1]) +
63 fabs(correct_res.m_floats[2] - test_res.m_floats[2]) > FLT_EPSILON * 4)
65 vlog( "Error - v3sdiv result error! "
66 "\ncorrect = (%10.4f, %10.4f, %10.4f) "
67 "\ntested = (%10.4f, %10.4f, %10.4f) \n",
68 correct_res.m_floats[0], correct_res.m_floats[1], correct_res.m_floats[2],
69 test_res.m_floats[0], test_res.m_floats[1], test_res.m_floats[2]);
75 #define DATA_SIZE LOOPCOUNT
77 btVector3 vec3_arr[DATA_SIZE];
78 btScalar s_arr[DATA_SIZE];
85 uint64_t startTime, bestTime, currentTime;
87 bestTime = uint64_t(-1LL);
89 for (j = 0; j < NUM_CYCLES; j++)
91 for( k = 0; k < DATA_SIZE; k++ )
96 vec3_arr[k].setValue(x,y,z);
102 startTime = ReadTicks();
103 for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
105 v3sdiv_ref( vec3_arr[k], s_arr[k]);
106 v3sdiv_ref( vec3_arr[k+1], s_arr[k+1]);
107 v3sdiv_ref( vec3_arr[k+2], s_arr[k+2]);
108 v3sdiv_ref( vec3_arr[k+3], s_arr[k+3]);
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 for( k = 0; k < DATA_SIZE; k++ )
133 vec3_arr[k].setValue(x,y,z);
139 startTime = ReadTicks();
140 for( k = 0; k+4 <= LOOPCOUNT; k+=4 )
142 vec3_arr[k] /= s_arr[k];
143 vec3_arr[k+1] /= s_arr[k+1];
144 vec3_arr[k+2] /= s_arr[k+2];
145 vec3_arr[k+3] /= s_arr[k+3];
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 );
172 btScalar recip = btScalar(1.0) / s;
174 v.m_floats[0] *= recip;
175 v.m_floats[1] *= recip;
176 v.m_floats[2] *= recip;