1
0
Fork 0
forked from len0rd/rockbox

libmusepack: add ARMv7-M version of MPC_MULTIPLY_EX

We can't use Operand2 with register based shifts on ARMv7-M as it
isn't supported in the Thumb encoding. Instead, perform the shift
separately.

Change-Id: Ie96aa0a565e98bbca724dffc2ffc6d64fdb5d7c3
This commit is contained in:
Aidan MacDonald 2025-01-16 11:58:54 +00:00
parent c249dea2b7
commit 94c7c908b3

View file

@ -128,7 +128,23 @@
: [x]"r"(X), [y]"r"(Y)); \ : [x]"r"(X), [y]"r"(Y)); \
lo; \ lo; \
}) })
#if defined (CPU_ARM_MICRO)
/* Calculate: result = (X*Y)>>Z */
#define MPC_MULTIPLY_EX(X,Y,Z) \
({ \
MPC_SAMPLE_FORMAT lo; \
MPC_SAMPLE_FORMAT hi; \
asm volatile ( \
"smull %[lo], %[hi], %[x], %[y] \n\t" /* multiply */ \
"mov %[lo], %[lo], lsr %[shr] \n\t" /* lo >>= Z */ \
"lsl %[hi], %[hi], %[shl] \n\t" /* hi <<= 32 - Z */ \
"orr %[lo], %[lo], %[hi] \n\t" /* lo |= hi */ \
: [lo]"=&r"(lo), [hi]"=&r"(hi) \
: [x]"r"(X), [y]"r"(Y), [shr]"r"(Z), [shl]"r"(32-Z)); \
lo; \
})
#else
/* Calculate: result = (X*Y)>>Z */ /* Calculate: result = (X*Y)>>Z */
#define MPC_MULTIPLY_EX(X,Y,Z) \ #define MPC_MULTIPLY_EX(X,Y,Z) \
({ \ ({ \
@ -142,6 +158,7 @@
: [x]"r"(X), [y]"r"(Y), [shr]"r"(Z), [shl]"r"(32-Z)); \ : [x]"r"(X), [y]"r"(Y), [shr]"r"(Z), [shl]"r"(32-Z)); \
lo; \ lo; \
}) })
#endif
#else /* libmusepack standard */ #else /* libmusepack standard */
#define MPC_MULTIPLY_NOTRUNCATE(X,Y) \ #define MPC_MULTIPLY_NOTRUNCATE(X,Y) \