lrintf emulation improvments
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 24 Aug 2004 16:33:55 +0000 (16:33 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 24 Aug 2004 16:33:55 +0000 (16:33 +0000)
Originally committed as revision 3412 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/dsputil.h

index 494c6f6..5aaa94c 100644 (file)
@@ -583,11 +583,20 @@ static int name16(void /*MpegEncContext*/ *s, uint8_t *dst, uint8_t *src, int st
 /* XXX: add ISOC specific test to avoid specific BSD testing. */
 /* better than nothing implementation. */
 /* btw, rintf() is existing on fbsd too -- alex */
-static inline long int lrintf(float x)
+static always_inline long int lrintf(float x)
 {
 #ifdef CONFIG_WIN32
+#  ifdef ARCH_X86
+    int32_t i;
+    asm volatile(
+        "fistpl %0\n\t"
+        : "=m" (i) : "t" (x) : "st"
+    );
+    return i;
+#  else
     /* XXX: incorrect, but make it compile */
-    return (int)(x);
+    return (int)(x + (x < 0 ? -0.5 : 0.5));
+#  endif
 #else
     return (int)(rint(x));
 #endif