Use SSE intrinsics in a few more places

This commit is contained in:
Chris Robinson
2019-03-18 20:58:48 -07:00
parent 73a43fb19c
commit 3e816de4fb
2 changed files with 22 additions and 8 deletions
+10 -2
View File
@@ -20,6 +20,10 @@
#include "config.h"
#ifdef HAVE_SSE_INTRINSICS
#include <emmintrin.h>
#endif
#include <cmath>
#include <cstdlib>
#include <array>
@@ -48,8 +52,12 @@ using complex_d = std::complex<double>;
inline int double2int(double d)
{
#if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \
!defined(__SSE2_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP < 2)
#if defined(HAVE_SSE_INTRINSICS)
return _mm_cvttsd_si32(_mm_set_sd(d));
#elif ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \
!defined(__SSE2_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP < 2)
int sign, shift;
int64_t mant;
union {
+12 -6
View File
@@ -15,6 +15,9 @@
#ifdef HAVE_INTRIN_H
#include <intrin.h>
#endif
#ifdef HAVE_SSE_INTRINSICS
#include <xmmintrin.h>
#endif
#include <array>
#include <vector>
@@ -196,10 +199,10 @@ struct bs2b;
* change it on its own threads. On some systems, a truncating conversion may
* always be the fastest method.
*/
inline ALint fastf2i(ALfloat f) noexcept
inline int fastf2i(float f) noexcept
{
#if defined(HAVE_INTRIN_H) && ((defined(_M_IX86_FP) && (_M_IX86_FP > 0)) || defined(_M_X64))
return _mm_cvt_ss2si(_mm_set1_ps(f));
#if defined(HAVE_SSE_INTRINSICS)
return _mm_cvt_ss2si(_mm_set_ss(f));
#elif defined(_MSC_VER) && defined(_M_IX86_FP)
@@ -210,7 +213,7 @@ inline ALint fastf2i(ALfloat f) noexcept
#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
ALint i;
int i;
#ifdef __SSE_MATH__
__asm__("cvtss2si %1, %0" : "=r"(i) : "x"(f));
#else
@@ -236,8 +239,11 @@ inline ALint fastf2i(ALfloat f) noexcept
/* Converts float-to-int using standard behavior (truncation). */
inline int float2int(float f) noexcept
{
#if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \
!defined(__SSE_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0)
#if defined(HAVE_SSE_INTRINSICS)
return _mm_cvtt_ss2si(_mm_set_ss(f));
#elif ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \
!defined(__SSE_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0)
ALint sign, shift, mant;
union {
ALfloat f;