Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Tim-Philipp Müller
Opus
Commits
12c751e0
Unverified
Commit
12c751e0
authored
Jun 13, 2020
by
Marcus Asteborg
Committed by
Jean-Marc Valin
Jun 14, 2020
Browse files
Prefer SSE and ASM implementation of float2int before lrintf for MSVC
Signed-off-by:
Jean-Marc Valin
<
jmvalin@jmvalin.ca
>
parent
da404556
Changes
1
Hide whitespace changes
Inline
Side-by-side
celt/float_cast.h
View file @
12c751e0
...
...
@@ -67,6 +67,38 @@
#include
<xmmintrin.h>
static
OPUS_INLINE
opus_int32
float2int
(
float
x
)
{
return
_mm_cvt_ss2si
(
_mm_set_ss
(
x
));}
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1))
#include
<xmmintrin.h>
static
OPUS_INLINE
opus_int32
float2int
(
float
value
)
{
/* _mm_load_ss will generate same code as _mm_set_ss
** in _MSC_VER >= 1914 /02 so keep __mm_load__ss
** for backward compatibility.
*/
return
_mm_cvtss_si32
(
_mm_load_ss
(
&
value
));
}
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_IX86)
#include
<math.h>
/* Win32 doesn't seem to have these functions.
** Therefore implement OPUS_INLINE versions of these functions here.
*/
static
OPUS_INLINE
opus_int32
float2int
(
float
flt
)
{
int
intgr
;
_asm
{
fld
flt
fistp
intgr
}
;
return
intgr
;
}
#elif defined(HAVE_LRINTF)
/* These defines enable functionality introduced with the 1999 ISO C
...
...
@@ -96,32 +128,6 @@ static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_s
#include
<math.h>
#define float2int(x) lrint(x)
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1))
#include
<xmmintrin.h>
static
__inline
long
int
float2int
(
float
value
)
{
return
_mm_cvtss_si32
(
_mm_load_ss
(
&
value
));
}
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_IX86)
#include
<math.h>
/* Win32 doesn't seem to have these functions.
** Therefore implement OPUS_INLINE versions of these functions here.
*/
static
__inline
long
int
float2int
(
float
flt
)
{
int
intgr
;
_asm
{
fld
flt
fistp
intgr
}
;
return
intgr
;
}
#else
#if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment