u_math: add x86 optimized version of ifloor
This is copied from the one in src/mesa/main/imports.h, which is the same otherwise. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3024>
This commit is contained in:
@@ -185,6 +185,23 @@ util_fast_pow(float x, float y)
|
||||
static inline int
|
||||
util_ifloor(float f)
|
||||
{
|
||||
#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
|
||||
/*
|
||||
* IEEE floor for computers that round to nearest or even.
|
||||
* 'f' must be between -4194304 and 4194303.
|
||||
* This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1",
|
||||
* but uses some IEEE specific tricks for better speed.
|
||||
* Contributed by Josh Vanderhoof
|
||||
*/
|
||||
int ai, bi;
|
||||
double af, bf;
|
||||
af = (3 << 22) + 0.5 + (double)f;
|
||||
bf = (3 << 22) + 0.5 - (double)f;
|
||||
/* GCC generates an extra fstp/fld without this. */
|
||||
__asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
|
||||
__asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
|
||||
return (ai - bi) >> 1;
|
||||
#else
|
||||
int ai, bi;
|
||||
double af, bf;
|
||||
union fi u;
|
||||
@@ -193,6 +210,7 @@ util_ifloor(float f)
|
||||
u.f = (float) af; ai = u.i;
|
||||
u.f = (float) bf; bi = u.i;
|
||||
return (ai - bi) >> 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user