Index: third_party/libopenjpeg20/opj_includes.h |
diff --git a/third_party/libopenjpeg20/opj_includes.h b/third_party/libopenjpeg20/opj_includes.h |
index e3d4686488c109b9153388c510c60af9f453160f..f855b7c6694045ebb1108a188971fa28e6d00f0e 100644 |
--- a/third_party/libopenjpeg20/opj_includes.h |
+++ b/third_party/libopenjpeg20/opj_includes.h |
@@ -118,33 +118,65 @@ |
#endif |
#endif |
+ |
+ |
/* MSVC before 2013 and Borland C do not have lrintf */ |
-#if defined(_MSC_VER) && (_MSC_VER < 1800) || defined(__BORLANDC__) |
-static INLINE long lrintf(float f){ |
+#if defined(_MSC_VER) |
+#include <intrin.h> |
+static INLINE long opj_lrintf(float f){ |
#ifdef _M_X64 |
- return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); |
-#else |
+ return _mm_cvt_ss2si(_mm_load_ss(&f)); |
+ |
+ /* commented out line breaks many tests */ |
+ /* return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); */ |
+#elif defined(_M_IX86) |
int i; |
- |
- _asm{ |
+ _asm{ |
fld f |
fistp i |
}; |
return i; |
+#else |
+ return (long)((f>0.0f) ? (f + 0.5f) : (f - 0.5f)); |
#endif |
} |
+#elif defined(__BORLANDC__) |
+static INLINE long opj_lrintf(float f) { |
+#ifdef _M_X64 |
+ return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); |
+#else |
+ int i; |
+ |
+ _asm { |
+ fld f |
+ fistp i |
+ }; |
+ |
+ return i; |
+#endif |
+} |
+#else |
+static INLINE long opj_lrintf(float f) { |
+ return lrintf(f); |
+} |
#endif |
#if defined(_MSC_VER) && (_MSC_VER < 1400) |
#define vsnprintf _vsnprintf |
#endif |
+/* MSVC x86 is really bad at doing int64 = int32 * int32 on its own. Use intrinsic. */ |
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86) |
+# include <intrin.h> |
+# pragma intrinsic(__emul) |
+#endif |
+ |
#include "opj_inttypes.h" |
#include "opj_clock.h" |
#include "opj_malloc.h" |
-#include "function_list.h" |
#include "event.h" |
+#include "function_list.h" |
#include "bio.h" |
#include "cio.h" |