ref: 60fd217a7e76f72bd552b70c04a29a8f6301940e
parent: 55da78cbeea5fb6757f8df672567714e1e8ca3e9
author: lieff <lieff@users.noreply.github.com>
date: Fri Apr 17 20:07:02 EDT 2020
Optimize mp3d_scale_pcm using ssat instruction.
--- a/minimp3.h
+++ b/minimp3.h
@@ -191,6 +191,16 @@
#define HAVE_SIMD 0
#endif /* !defined(MINIMP3_NO_SIMD) */
+#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__)
+#define HAVE_ARMV6 1
+static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a)
+{
+ int32_t x = 0;
+ __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a));
+ return x;
+}
+#endif
+
typedef struct
{
const uint8_t *buf;
@@ -1407,10 +1417,16 @@
#ifndef MINIMP3_FLOAT_OUTPUT
static int16_t mp3d_scale_pcm(float sample)
{
+#if HAVE_ARMV6
+ int32_t s32 = (int32_t)(sample + .5f);
+ s32 -= (s32 < 0);
+ int16_t s = (int16_t)minimp3_clip_int16_arm(s32);
+#else
if (sample >= 32766.5) return (int16_t) 32767;
if (sample <= -32767.5) return (int16_t)-32768;
int16_t s = (int16_t)(sample + .5f);
s -= (s < 0); /* away from zero, to be compliant */
+#endif
return s;
}
#else /* MINIMP3_FLOAT_OUTPUT */