Hi Jules, do you think you could add the following two methods to FloatVectorOperations? It maintains completeness with those in MathsFunctions.h and are useful for tasks like metering. Cheers.
[code] /** Finds the miniumum value in the given array. /
static float JUCE_CALLTYPE findMinimum (const float src, int numValues) noexcept;
/** Finds the maximum value in the given array. */
static float JUCE_CALLTYPE findMaximum (const float* src, int numValues) noexcept;
[/code]
[code]float JUCE_CALLTYPE FloatVectorOperations::findMinimum (const float* src, int num) noexcept
{
#if JUCE_USE_SSE_INTRINSICS
const int numLongOps = num / 4;
if (numLongOps > 1 && FloatVectorHelpers::isSSE2Available())
{
__m128 mn;
#define JUCE_MIN_SSE_LOOP(loadOp) \
mn = loadOp (src); \
src += 4; \
for (int i = 1; i < numLongOps; ++i) \
{ \
const __m128 s = loadOp (src); \
mn = _mm_min_ps (mn, s); \
src += 4; \
}
if (FloatVectorHelpers::isAligned (src)) { JUCE_MIN_SSE_LOOP (_mm_load_ps) }
else { JUCE_MIN_SSE_LOOP (_mm_loadu_ps) }
float localMin;
{
float mns[4];
_mm_storeu_ps (mns, mn);
FloatVectorHelpers::mmEmpty();
localMin = jmin (mns[0], mns[1], mns[2], mns[3]);
}
num &= 3;
if (num != 0)
{
for (int i = 0; i < num; ++i)
{
const float s = src[i];
localMin = jmin (localMin, s);
}
}
return localMin;
}
#endif
return juce::findMinimum (src, num);
}
float JUCE_CALLTYPE FloatVectorOperations::findMaximum (const float* src, int num) noexcept
{
#if JUCE_USE_SSE_INTRINSICS
const int numLongOps = num / 4;
if (numLongOps > 1 && FloatVectorHelpers::isSSE2Available())
{
__m128 mx;
#define JUCE_MAX_SSE_LOOP(loadOp) \
mx = loadOp (src); \
src += 4; \
for (int i = 1; i < numLongOps; ++i) \
{ \
const __m128 s = loadOp (src); \
mx = _mm_max_ps (mx, s); \
src += 4; \
}
if (FloatVectorHelpers::isAligned (src)) { JUCE_MAX_SSE_LOOP (_mm_load_ps) }
else { JUCE_MAX_SSE_LOOP (_mm_loadu_ps) }
float localMax;
{
float mxs[4];
_mm_storeu_ps (mxs, mx);
FloatVectorHelpers::mmEmpty();
localMax = jmax (mxs[0], mxs[1], mxs[2], mxs[3]);
}
num &= 3;
if (num != 0)
{
for (int i = 0; i < num; ++i)
{
const float s = src[i];
localMax = jmax (localMax, s);
}
}
return localMax;
}
#endif
return juce::findMaximum (src, num);
}[/code]