Fixes for 64-bit platforms; use of SSE builtin when available (patches by Gwenole Beauchesne).
This commit is contained in:
parent
155c22b93a
commit
b1c040ce19
2 changed files with 24 additions and 4 deletions
|
@ -1,3 +1,11 @@
|
|||
2007-08-21 Tomas Frydrych <tf@openedhand.com>
|
||||
|
||||
* clutter/clutter-fixed.c:
|
||||
(clutter_sqrti):
|
||||
|
||||
Fixes for 64-bit platforms; use of SSE builtin when available
|
||||
(patches by Gwenole Beauchesne).
|
||||
|
||||
2007-08-20 Emmanuele Bassi <ebassi@openedhand.com>
|
||||
|
||||
* clutter/Makefile.am:
|
||||
|
|
|
@ -539,7 +539,12 @@ clutter_sqrtx (ClutterFixed x)
|
|||
/* make even (2n) */
|
||||
bit &= 0xfffffffe;
|
||||
#else
|
||||
/* TODO -- add i386 branch using bshr */
|
||||
/* TODO -- add i386 branch using bshr
|
||||
*
|
||||
* NB: it's been said that the bshr instruction is poorly implemented
|
||||
* and that it is possible to write a faster code in C using binary
|
||||
* search -- at some point we should explore this
|
||||
*/
|
||||
int bit = 30;
|
||||
while (bit >= 0)
|
||||
{
|
||||
|
@ -610,6 +615,12 @@ clutter_sqrtx (ClutterFixed x)
|
|||
gint
|
||||
clutter_sqrti (gint number)
|
||||
{
|
||||
#if defined __SSE2__
|
||||
/* The GCC built-in with SSE2 (sqrtsd) is up to twice as fast as
|
||||
* the pure integer code below. It is also more accurate.
|
||||
*/
|
||||
return __builtin_sqrt (number);
|
||||
#else
|
||||
/* This is a fixed point implementation of the Quake III sqrt algorithm,
|
||||
* described, for example, at
|
||||
* http://www.codemaestro.com/reviews/review00000105.html
|
||||
|
@ -626,13 +637,13 @@ clutter_sqrti (gint number)
|
|||
* elsewhere in clutter is not good enough, and 10.22 is used instead.
|
||||
*/
|
||||
ClutterFixed x;
|
||||
unsigned long y_1; /* 10.22 fixed point */
|
||||
unsigned long f = 0x600000; /* '1.5' as 10.22 fixed */
|
||||
guint32 y_1; /* 10.22 fixed point */
|
||||
guint32 f = 0x600000; /* '1.5' as 10.22 fixed */
|
||||
|
||||
union
|
||||
{
|
||||
float f;
|
||||
unsigned long i;
|
||||
guint32 i;
|
||||
} flt, flt2;
|
||||
|
||||
flt.f = number;
|
||||
|
@ -669,6 +680,7 @@ clutter_sqrti (gint number)
|
|||
* better results than 0x200000.
|
||||
*/
|
||||
return (number * flt2.i + 0x1e3c68) >> 22;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue