48 lines
2.9 KiB
C
48 lines
2.9 KiB
C
#ifndef COSMOPOLITAN_DSP_CORE_KS8_H_
|
|
#define COSMOPOLITAN_DSP_CORE_KS8_H_
|
|
#include "libc/macros.h"
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
|
|
/**
|
|
* Performs 16-bit scaled rounded madd w/ eight coefficients or fewer.
|
|
*
|
|
* (Σᵢ₌₀₋₈𝑘ᵢ𝑥ᵢ + 2ᵐ⁻¹)/2ᵐ
|
|
*
|
|
* @note intent is avoiding type promotion
|
|
*/
|
|
#define KS8(M, K1, K2, K3, K4, K5, K6, K7, K8, X1, X2, X3, X4, X5, X6, X7, X8) \
|
|
({ \
|
|
short x1, x2, x3, x4, x5, x6, x7, x8; \
|
|
x1 = X1; \
|
|
x2 = X2; \
|
|
x3 = X3; \
|
|
x4 = X4; \
|
|
x5 = X5; \
|
|
x6 = X6; \
|
|
x7 = X7; \
|
|
x8 = X8; \
|
|
x1 *= K1; \
|
|
x2 *= K2; \
|
|
x3 *= K3; \
|
|
x4 *= K4; \
|
|
x5 *= K5; \
|
|
x6 *= K6; \
|
|
x7 *= K7; \
|
|
x8 *= K8; \
|
|
x1 += x2; \
|
|
x3 += x4; \
|
|
x5 += x6; \
|
|
x7 += x8; \
|
|
x1 += x3; \
|
|
x5 += x7; \
|
|
x1 += x5; \
|
|
if (M) { \
|
|
x1 += 1 << MAX(0, M - 1); \
|
|
x1 >>= M; \
|
|
} \
|
|
x1; \
|
|
})
|
|
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_DSP_CORE_KS8_H_ */
|