Skip to content

Commit 440cbbe

Browse files
* Use simpler float-to-integer conversion implementations from VideoVenture
- The resulting machine code is a lot cleaner and smaller
1 parent b229ee5 commit 440cbbe

File tree

1 file changed

+4
-7
lines changed

1 file changed

+4
-7
lines changed

Math.h

+4-7
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ static inline int RoundInt(float const x)
7575
#if 0//_M_IX86_FP > 0
7676
return int(roundf(x));
7777
#elif _M_IX86_FP > 0
78-
register __m128 xx = _mm_load_ss(&x);
79-
return _mm_cvtss_si32(_mm_add_ss(_mm_add_ss(xx, xx), _mm_set_ss(0.5f))) >> 1;
78+
return _mm_cvt_ss2si(_mm_set_ss(x + x + 0.5f)) >> 1;
8079
#else
8180
float const round_nearest = 0.5f;
8281
int i;
@@ -98,8 +97,7 @@ static inline int FloorInt(float const x)
9897
#if 0//_M_IX86_FP > 0
9998
return int(floorf(x));
10099
#elif _M_IX86_FP > 0
101-
register __m128 xx = _mm_load_ss(&x);
102-
return _mm_cvtss_si32(_mm_add_ss(_mm_add_ss(xx, xx), _mm_set_ss(-0.5f))) >> 1;
100+
return _mm_cvt_ss2si(_mm_set_ss(x + x - 0.5f)) >> 1;
103101
#else
104102
float const round_minus_infinity = -0.5f;
105103
int i;
@@ -121,8 +119,7 @@ static inline int CeilingInt(float const x)
121119
#if 0//_M_IX86_FP > 0
122120
return int(ceilf(x));
123121
#elif _M_IX86_FP > 0
124-
register __m128 xx = _mm_load_ss(&x);
125-
return -(_mm_cvtss_si32(_mm_sub_ss(_mm_set_ss(-0.5f), _mm_add_ss(xx, xx))) >> 1);
122+
return -(_mm_cvt_ss2si(_mm_set_ss(-0.5f - (x + x))) >> 1);
126123
#else
127124
float const round_plus_infinity = -0.5f;
128125
int i;
@@ -142,7 +139,7 @@ static inline int CeilingInt(float const x)
142139
static inline int TruncateInt(float const x)
143140
{
144141
#if _M_IX86_FP > 0
145-
return int(x);
142+
return _mm_cvtt_ss2si(_mm_set_ss(x));
146143
#else
147144
float const round_minus_infinity = -0.5f;
148145
int i;

0 commit comments

Comments
 (0)