62typedef int64x2_t mp3d_i64x2;
63#define MP3D_V_ZERO64() vdupq_n_s64(0)
64#define MP3D_V_LOAD4(p) vld1q_s32((const int32_t *)(p))
65#define MP3D_V_SPLAT(x) vdupq_n_s32(x)
66#define MP3D_V_PREP(v) (v)
67#define MP3D_V_STORE4(p, v) vst1q_s32((int32_t *)(p), (v))
68#define MP3D_V_MUL_LO(v, s) vmull_s32(vget_low_s32(v), vget_low_s32(s))
69#define MP3D_V_MUL_HI(v, s) vmull_s32(vget_high_s32(v), vget_high_s32(s))
70#define MP3D_V_ADD64(x, y) vaddq_s64((x), (y))
71#define MP3D_V_SUB64(x, y) vsubq_s64((x), (y))
72#define MP3D_V_GET64(x, lane) ((lane) ? vgetq_lane_s64((x), 1) : vgetq_lane_s64((x), 0))
75#define MP3D_SIMD_AVAILABLE() 1
76#define MP3D_SIMD_TARGET
81#define MP3D_V_ADDSAT(a, b) \
82 vmaxq_s32(vqaddq_s32((a), (b)), vdupq_n_s32(MP3D_SAT_MIN))
83#define MP3D_V_SUBSAT(a, b) \
84 vmaxq_s32(vqsubq_s32((a), (b)), vdupq_n_s32(MP3D_SAT_MIN))
94static int32x4_t mp3d_v_narrow(int64x2_t lo, int64x2_t hi,
97 const int64x2_t
round = vdupq_n_s64((int64_t)1 << (shift - 1));
98 const int64x2_t sh = vdupq_n_s64(-shift);
99 lo = vshlq_s64(vaddq_s64(lo,
round), sh);
100 hi = vshlq_s64(vaddq_s64(hi,
round), sh);
101 return vmaxq_s32(vcombine_s32(vqmovn_s64(lo), vqmovn_s64(hi)),
102 vdupq_n_s32(MP3D_SAT_MIN));
105static int32x4_t mp3d_v_mulshift(int32x4_t v,
int32_t coef,
108 const int32x2_t c = vdup_n_s32(coef);
109 return mp3d_v_narrow(vmull_s32(vget_low_s32(v), c),
110 vmull_s32(vget_high_s32(v), c), shift);
112#define MP3D_V_MULSHIFT(v, coef, bits) mp3d_v_mulshift((v), (coef), (bits))
115#define MP3D_V_MULV_LO(a, b) vmull_s32(vget_low_s32(a), vget_low_s32(b))
116#define MP3D_V_MULV_HI(a, b) vmull_s32(vget_high_s32(a), vget_high_s32(b))
117#define MP3D_V_REV4(v) \
118 vcombine_s32(vrev64_s32(vget_high_s32(v)), vrev64_s32(vget_low_s32(v)))
120typedef __m128i mp3d_i64x2;
121#define MP3D_V_ZERO64() _mm_setzero_si128()
122#define MP3D_V_LOAD4(p) _mm_loadu_si128((const __m128i *)(const void *)(p))
123#define MP3D_V_SPLAT(x) _mm_set1_epi32(x)
126#define MP3D_V_PREP(v) _mm_shuffle_epi32((v), _MM_SHUFFLE(3, 1, 2, 0))
127#define MP3D_V_STORE4(p, v) _mm_storeu_si128((__m128i *)(void *)(p), (v))
128#define MP3D_V_MUL_LO(v, s) _mm_mul_epi32((v), (s))
129#define MP3D_V_MUL_HI(v, s) _mm_mul_epi32(_mm_srli_si128((v), 4), (s))
130#define MP3D_V_ADD64(x, y) _mm_add_epi64((x), (y))
131#define MP3D_V_SUB64(x, y) _mm_sub_epi64((x), (y))
133static int64_t mp3d_get_i64(__m128i v,
int lane)
FL_NO_EXCEPT
136 _mm_storeu_si128((__m128i *)(
void *)out, v);
139#define MP3D_V_GET64(x, lane) mp3d_get_i64((x), (lane))
148#if defined(__GNUC__) || defined(__clang__)
149#define MP3D_SIMD_TARGET __attribute__((target("sse4.1")))
151#define MP3D_SIMD_TARGET
158#if defined(__SSE4_1__)
160#elif defined(_MSC_VER)
166 cached = ((info[2] & (1 << 19)) != 0) + 1;
169#elif defined(__GNUC__) || defined(__clang__)
171 unsigned eax, ebx, ecx, edx;
174 cached = (__get_cpuid(1, &eax, &ebx, &ecx, &edx) &&
175 (ecx & (1u << 19))) + 1;
182#define MP3D_SIMD_AVAILABLE() mp3d_have_sse41()
189MP3D_SIMD_TARGET
static __m128i mp3d_v_addsat(__m128i a, __m128i b)
FL_NO_EXCEPT
191 const __m128i sum = _mm_add_epi32(a, b);
196 const __m128i overflow = _mm_srai_epi32(
197 _mm_and_si128(_mm_xor_si128(a, sum), _mm_xor_si128(b, sum)), 31);
198 const __m128i rail = _mm_blendv_epi8(_mm_set1_epi32(MP3D_SAT_MAX),
199 _mm_set1_epi32(MP3D_SAT_MIN),
200 _mm_srai_epi32(a, 31));
201 return _mm_max_epi32(_mm_blendv_epi8(sum, rail, overflow),
202 _mm_set1_epi32(MP3D_SAT_MIN));
205MP3D_SIMD_TARGET
static __m128i mp3d_v_subsat(__m128i a, __m128i b)
FL_NO_EXCEPT
207 const __m128i diff = _mm_sub_epi32(a, b);
208 const __m128i overflow = _mm_srai_epi32(
209 _mm_and_si128(_mm_xor_si128(a, b), _mm_xor_si128(a, diff)), 31);
210 const __m128i rail = _mm_blendv_epi8(_mm_set1_epi32(MP3D_SAT_MAX),
211 _mm_set1_epi32(MP3D_SAT_MIN),
212 _mm_srai_epi32(a, 31));
213 return _mm_max_epi32(_mm_blendv_epi8(diff, rail, overflow),
214 _mm_set1_epi32(MP3D_SAT_MIN));
221MP3D_SIMD_TARGET
static __m128i mp3d_v_narrow(__m128i a01, __m128i a23,
224 const __m128i
round = _mm_set1_epi64x((int64_t)1 << (bits - 1));
225 __m128i p01 = _mm_add_epi64(a01,
round);
226 __m128i p23 = _mm_add_epi64(a23,
round);
227 const __m128i sign01 =
228 _mm_srai_epi32(_mm_shuffle_epi32(p01, _MM_SHUFFLE(3, 3, 1, 1)), 31);
229 const __m128i sign23 =
230 _mm_srai_epi32(_mm_shuffle_epi32(p23, _MM_SHUFFLE(3, 3, 1, 1)), 31);
231 p01 = _mm_or_si128(_mm_srli_epi64(p01, bits),
232 _mm_slli_epi64(sign01, 64 - bits));
233 p23 = _mm_or_si128(_mm_srli_epi64(p23, bits),
234 _mm_slli_epi64(sign23, 64 - bits));
236 const __m128i lo = _mm_castps_si128(
237 _mm_shuffle_ps(_mm_castsi128_ps(p01), _mm_castsi128_ps(p23),
238 _MM_SHUFFLE(2, 0, 2, 0)));
239 const __m128i hi = _mm_castps_si128(
240 _mm_shuffle_ps(_mm_castsi128_ps(p01), _mm_castsi128_ps(p23),
241 _MM_SHUFFLE(3, 1, 3, 1)));
242 const __m128i in_range = _mm_cmpeq_epi32(hi, _mm_srai_epi32(lo, 31));
243 const __m128i rail = _mm_blendv_epi8(_mm_set1_epi32(MP3D_SAT_MAX),
244 _mm_set1_epi32(MP3D_SAT_MIN),
245 _mm_srai_epi32(hi, 31));
246 return _mm_max_epi32(_mm_blendv_epi8(rail, lo, in_range),
247 _mm_set1_epi32(MP3D_SAT_MIN));
250MP3D_SIMD_TARGET
static __m128i mp3d_v_mulshift(__m128i v,
int32_t coef,
253 const __m128i c = _mm_set1_epi32(coef);
254 const __m128i s = _mm_shuffle_epi32(v, _MM_SHUFFLE(3, 1, 2, 0));
255 return mp3d_v_narrow(_mm_mul_epi32(s, c),
256 _mm_mul_epi32(_mm_srli_si128(s, 4), c), bits);
260#define MP3D_V_MULV_LO(a, b) \
261 _mm_mul_epi32(MP3D_V_PREP(a), MP3D_V_PREP(b))
262#define MP3D_V_MULV_HI(a, b) \
263 _mm_mul_epi32(_mm_srli_si128(MP3D_V_PREP(a), 4), \
264 _mm_srli_si128(MP3D_V_PREP(b), 4))
265#define MP3D_V_REV4(v) _mm_shuffle_epi32((v), _MM_SHUFFLE(0, 1, 2, 3))
266#define MP3D_V_ADDSAT(a, b) mp3d_v_addsat((a), (b))
267#define MP3D_V_SUBSAT(a, b) mp3d_v_subsat((a), (b))
268#define MP3D_V_MULSHIFT(v, coef, bits) mp3d_v_mulshift((v), (coef), (bits))
273#if MP3D_HAVE_INT_SIMD
296MP3D_SIMD_TARGET
static void mp3d_imdct36_twiddle_simd(
301 for (i = 0; i <= 4; i += 4)
303 const mp3d_i32x4 cov = MP3D_V_LOAD4(&co[i]);
304 const mp3d_i32x4 siv = MP3D_V_LOAD4(&si[i]);
305 const mp3d_i32x4 tlo = MP3D_V_LOAD4(&
g_twid9_q30[0 + i]);
306 const mp3d_i32x4 thi = MP3D_V_LOAD4(&
g_twid9_q30[9 + i]);
307 const mp3d_i32x4 ovl = MP3D_V_LOAD4(&overlap[i]);
308 const mp3d_i32x4 wlo = MP3D_V_LOAD4(&window[0 + i]);
309 const mp3d_i32x4 whi = MP3D_V_LOAD4(&window[9 + i]);
310 const mp3d_i32x4 sum = mp3d_v_narrow(
311 MP3D_V_ADD64(MP3D_V_MULV_LO(cov, thi), MP3D_V_MULV_LO(siv, tlo)),
312 MP3D_V_ADD64(MP3D_V_MULV_HI(cov, thi), MP3D_V_MULV_HI(siv, tlo)),
314 const mp3d_i32x4 nov = mp3d_v_narrow(
315 MP3D_V_SUB64(MP3D_V_MULV_LO(cov, tlo), MP3D_V_MULV_LO(siv, thi)),
316 MP3D_V_SUB64(MP3D_V_MULV_HI(cov, tlo), MP3D_V_MULV_HI(siv, thi)),
318 const mp3d_i32x4 head = mp3d_v_narrow(
319 MP3D_V_SUB64(MP3D_V_MULV_LO(ovl, wlo), MP3D_V_MULV_LO(sum, whi)),
320 MP3D_V_SUB64(MP3D_V_MULV_HI(ovl, wlo), MP3D_V_MULV_HI(sum, whi)),
322 const mp3d_i32x4 tail = mp3d_v_narrow(
323 MP3D_V_ADD64(MP3D_V_MULV_LO(ovl, whi), MP3D_V_MULV_LO(sum, wlo)),
324 MP3D_V_ADD64(MP3D_V_MULV_HI(ovl, whi), MP3D_V_MULV_HI(sum, wlo)),
328 MP3D_V_STORE4(&overlap[i], nov);
329 MP3D_V_STORE4(&grbuf[i], head);
331 MP3D_V_STORE4(&grbuf[14 - i], MP3D_V_REV4(tail));
334 const int32_t ovl = overlap[8];
335 const int32_t sum = mp3d_narrow_q30(
338 overlap[8] = mp3d_narrow_q30(
341 grbuf[8] = mp3d_narrow_q30(
342 (int64_t)ovl*window[0 + 8] - (int64_t)sum*window[9 + 8]);
343 grbuf[9] = mp3d_narrow_q30(
344 (int64_t)ovl*window[9 + 8] + (int64_t)sum*window[0 + 8]);
350 mp3d_i32x4
t[4][8], *
x;
354 for (
x =
t[0], i = 0; i < 8; i++,
x++)
356 const mp3d_i32x4 x0 = MP3D_V_LOAD4(&
y[i*18]);
357 const mp3d_i32x4 x1 = MP3D_V_LOAD4(&
y[(15 - i)*18]);
358 const mp3d_i32x4 x2 = MP3D_V_LOAD4(&
y[(16 + i)*18]);
359 const mp3d_i32x4 x3 = MP3D_V_LOAD4(&
y[(31 - i)*18]);
360 const mp3d_i32x4 t0 = MP3D_V_ADDSAT(x0, x3);
361 const mp3d_i32x4 t1 = MP3D_V_ADDSAT(x1, x2);
362 const mp3d_i32x4 t2 =
363 MP3D_V_MULSHIFT(MP3D_V_SUBSAT(x1, x2),
g_sec_q27[3*i + 0], 27);
364 const mp3d_i32x4 t3 =
365 MP3D_V_MULSHIFT(MP3D_V_SUBSAT(x0, x3),
g_sec_q27[3*i + 1], 27);
366 x[0] = MP3D_V_ADDSAT(t0, t1);
367 x[8] = MP3D_V_MULSHIFT(MP3D_V_SUBSAT(t0, t1),
g_sec_q27[3*i + 2], 27);
368 x[16] = MP3D_V_ADDSAT(t3, t2);
369 x[24] = MP3D_V_MULSHIFT(MP3D_V_SUBSAT(t3, t2),
g_sec_q27[3*i + 2], 27);
371 for (
x =
t[0], i = 0; i < 4; i++,
x += 8)
373 mp3d_i32x4 x0 =
x[0], x1 =
x[1], x2 =
x[2], x3 =
x[3];
374 mp3d_i32x4 x4 =
x[4], x5 =
x[5], x6 =
x[6], x7 =
x[7], xt;
375 xt = MP3D_V_SUBSAT(x0, x7); x0 = MP3D_V_ADDSAT(x0, x7);
376 x7 = MP3D_V_SUBSAT(x1, x6); x1 = MP3D_V_ADDSAT(x1, x6);
377 x6 = MP3D_V_SUBSAT(x2, x5); x2 = MP3D_V_ADDSAT(x2, x5);
378 x5 = MP3D_V_SUBSAT(x3, x4); x3 = MP3D_V_ADDSAT(x3, x4);
379 x4 = MP3D_V_SUBSAT(x0, x3); x0 = MP3D_V_ADDSAT(x0, x3);
380 x3 = MP3D_V_SUBSAT(x1, x2); x1 = MP3D_V_ADDSAT(x1, x2);
381 x[0] = MP3D_V_ADDSAT(x0, x1);
383 x5 = MP3D_V_ADDSAT(x5, x6);
385 x7 = MP3D_V_ADDSAT(x7, xt);
390 x0 = MP3D_V_SUBSAT(xt, x6); xt = MP3D_V_ADDSAT(xt, x6);
398 for (i = 0; i < 7; i++,
y += 4*18)
400 MP3D_V_STORE4(&
y[0*18],
t[0][i]);
401 MP3D_V_STORE4(&
y[1*18], MP3D_V_ADDSAT(MP3D_V_ADDSAT(
t[2][i],
t[3][i]),
403 MP3D_V_STORE4(&
y[2*18], MP3D_V_ADDSAT(
t[1][i],
t[1][i + 1]));
404 MP3D_V_STORE4(&
y[3*18],
405 MP3D_V_ADDSAT(MP3D_V_ADDSAT(
t[2][i + 1],
t[3][i]),
408 MP3D_V_STORE4(&
y[0*18],
t[0][7]);
409 MP3D_V_STORE4(&
y[1*18], MP3D_V_ADDSAT(
t[2][7],
t[3][7]));
410 MP3D_V_STORE4(&
y[2*18],
t[1][7]);
411 MP3D_V_STORE4(&
y[3*18],
t[3][7]);
426#if MP3D_SIMD_KERNELS_LIVE
427 if (MP3D_SIMD_AVAILABLE())
429 mp3d_imdct36_twiddle_simd(grbuf, overlap, window, co, si);
433 for (i = 0; i < 9; i++)
435 const int32_t ovl = overlap[i];
436 const int32_t sum = mp3d_narrow_q30(
439 overlap[i] = mp3d_narrow_q30(
442 grbuf[i] = mp3d_narrow_q30(
443 (int64_t)ovl*window[0 + i] - (int64_t)sum*window[9 + i]);
444 grbuf[17 - i] = mp3d_narrow_q30(
445 (int64_t)ovl*window[9 + i] + (int64_t)sum*window[0 + i]);
473#if MP3D_HAVE_INT_SIMD
474 if (MP3D_SIMD_AVAILABLE())
476 for (; k + 4 <= n; k += 4)
478 mp3d_dct2_bands4(grbuf, k);
500#define MP3D_DCT_PASS1(I) \
502 const int32_t x0 = y[(I)*18]; \
503 const int32_t x1 = y[(15 - (I))*18]; \
504 const int32_t x2 = y[(16 + (I))*18]; \
505 const int32_t x3 = y[(31 - (I))*18]; \
506 const int32_t t0 = mp3d_add_sat(x0, x3); \
507 const int32_t t1 = mp3d_add_sat(x1, x2); \
508 const int32_t t2 = mp3d_mulshift_k<27, g_sec_q27[3*(I) + 0]>( \
509 mp3d_sub_sat(x1, x2)); \
510 const int32_t t3 = mp3d_mulshift_k<27, g_sec_q27[3*(I) + 1]>( \
511 mp3d_sub_sat(x0, x3)); \
512 t[0][I] = mp3d_add_sat(t0, t1); \
513 t[1][I] = mp3d_mulshift_k<27, g_sec_q27[3*(I) + 2]>( \
514 mp3d_sub_sat(t0, t1)); \
515 t[2][I] = mp3d_add_sat(t3, t2); \
516 t[3][I] = mp3d_mulshift_k<27, g_sec_q27[3*(I) + 2]>( \
517 mp3d_sub_sat(t3, t2)); \
528 for (
x =
t[0], i = 0; i < 4; i++,
x += 8)
530 int32_t x0 =
x[0], x1 =
x[1], x2 =
x[2], x3 =
x[3];
531 int32_t x4 =
x[4], x5 =
x[5], x6 =
x[6], x7 =
x[7], xt;
532 xt = mp3d_sub_sat(x0, x7); x0 = mp3d_add_sat(x0, x7);
533 x7 = mp3d_sub_sat(x1, x6); x1 = mp3d_add_sat(x1, x6);
534 x6 = mp3d_sub_sat(x2, x5); x2 = mp3d_add_sat(x2, x5);
535 x5 = mp3d_sub_sat(x3, x4); x3 = mp3d_add_sat(x3, x4);
536 x4 = mp3d_sub_sat(x0, x3); x0 = mp3d_add_sat(x0, x3);
537 x3 = mp3d_sub_sat(x1, x2); x1 = mp3d_add_sat(x1, x2);
538 x[0] = mp3d_add_sat(x0, x1);
539 x[4] = mp3d_mulshift_k<31, MP3D_Q31_COS_PI_4>(mp3d_sub_sat(x0, x1));
540 x5 = mp3d_add_sat(x5, x6);
541 x6 = mp3d_mulshift_k<31, MP3D_Q31_COS_PI_4>(mp3d_add_sat(x6, x7));
542 x7 = mp3d_add_sat(x7, xt);
543 x3 = mp3d_mulshift_k<31, MP3D_Q31_COS_PI_4>(mp3d_add_sat(x3, x4));
545 x5 = mp3d_sub_sat(x5, mp3d_mulshift_k<31, MP3D_Q31_TAN_PI_16>(x7));
546 x7 = mp3d_add_sat(x7, mp3d_mulshift_k<31, MP3D_Q31_SIN_PI_8>(x5));
547 x5 = mp3d_sub_sat(x5, mp3d_mulshift_k<31, MP3D_Q31_TAN_PI_16>(x7));
548 x0 = mp3d_sub_sat(xt, x6); xt = mp3d_add_sat(xt, x6);
549 x[1] = mp3d_mulshift_k<29, MP3D_Q29_SEC_PI_16>(mp3d_add_sat(xt, x7));
550 x[2] = mp3d_mulshift_k<29, MP3D_Q29_SEC_PI_8>(mp3d_add_sat(x4, x3));
551 x[3] = mp3d_mulshift_k<29, MP3D_Q29_SEC_3PI_16>(mp3d_sub_sat(x0, x5));
552 x[5] = mp3d_mulshift_k<29, MP3D_Q29_SEC_5PI_16>(mp3d_add_sat(x0, x5));
553 x[6] = mp3d_mulshift_k<29, MP3D_Q29_SEC_3PI_8>(mp3d_sub_sat(x4, x3));
554 x[7] = mp3d_mulshift_k<29, MP3D_Q29_SEC_7PI_16>(mp3d_sub_sat(xt, x7));
556 for (i = 0; i < 7; i++,
y += 4*18)
559 y[1*18] = mp3d_add_sat(mp3d_add_sat(
t[2][i],
t[3][i]),
t[3][i + 1]);
560 y[2*18] = mp3d_add_sat(
t[1][i],
t[1][i + 1]);
561 y[3*18] = mp3d_add_sat(mp3d_add_sat(
t[2][i + 1],
t[3][i]),
t[3][i + 1]);
564 y[1*18] = mp3d_add_sat(
t[2][7],
t[3][7]);
603#define MP3D_PCM_HALF ((int64_t)1 << (MINIMP3_FRAC_BITS - 1))
611 if (s > 32767)
return (
int16_t) 32767;
612 if (s < -32768)
return (
int16_t)-32768;
639 a = (int64_t)MP3D_WRAP_SUB(
z[14*64],
z[ 0]) * 29;
640 a += (int64_t)MP3D_WRAP_ADD(
z[ 1*64],
z[13*64]) * 213;
641 a += (int64_t)MP3D_WRAP_SUB(
z[12*64],
z[ 2*64]) * 459;
642 a += (int64_t)MP3D_WRAP_ADD(
z[ 3*64],
z[11*64]) * 2037;
643 a += (int64_t)MP3D_WRAP_SUB(
z[10*64],
z[ 4*64]) * 5153;
644 a += (int64_t)MP3D_WRAP_ADD(
z[ 5*64],
z[ 9*64]) * 6574;
645 a += (int64_t)MP3D_WRAP_SUB(
z[ 8*64],
z[ 6*64]) * 37489;
646 a += (int64_t)
z[ 7*64] * 75038;
650 a = (int64_t)
z[14*64] * 104;
651 a += (int64_t)
z[12*64] * 1567;
652 a += (int64_t)
z[10*64] * 9727;
653 a += (int64_t)
z[ 8*64] * 64019;
654 a += (int64_t)
z[ 6*64] * -9975;
655 a += (int64_t)
z[ 4*64] * -45;
656 a += (int64_t)
z[ 2*64] * 146;
657 a += (int64_t)
z[ 0*64] * -5;
665#if MP3D_HAVE_INT_SIMD
676MP3D_SIMD_TARGET
static void mp3d_synth_taps(
const int32_t *zlin,
680 mp3d_i64x2 alo = MP3D_V_ZERO64(), ahi = MP3D_V_ZERO64();
681 mp3d_i64x2 blo = MP3D_V_ZERO64(), bhi = MP3D_V_ZERO64();
684 for (k = 0; k < 8; k++)
688 const mp3d_i32x4 vz = MP3D_V_PREP(MP3D_V_LOAD4(&zlin[4*i - k*64]));
689 const mp3d_i32x4 vy =
690 MP3D_V_PREP(MP3D_V_LOAD4(&zlin[4*i - (15 - k)*64]));
691 const mp3d_i32x4 s0 = MP3D_V_SPLAT(w0);
692 const mp3d_i32x4 s1 = MP3D_V_SPLAT(w1);
694 blo = MP3D_V_ADD64(blo, MP3D_V_ADD64(MP3D_V_MUL_LO(vz, s1),
695 MP3D_V_MUL_LO(vy, s0)));
696 bhi = MP3D_V_ADD64(bhi, MP3D_V_ADD64(MP3D_V_MUL_HI(vz, s1),
697 MP3D_V_MUL_HI(vy, s0)));
700 alo = MP3D_V_ADD64(alo, MP3D_V_SUB64(MP3D_V_MUL_LO(vy, s1),
701 MP3D_V_MUL_LO(vz, s0)));
702 ahi = MP3D_V_ADD64(ahi, MP3D_V_SUB64(MP3D_V_MUL_HI(vy, s1),
703 MP3D_V_MUL_HI(vz, s0)));
707 alo = MP3D_V_ADD64(alo, MP3D_V_SUB64(MP3D_V_MUL_LO(vz, s0),
708 MP3D_V_MUL_LO(vy, s1)));
709 ahi = MP3D_V_ADD64(ahi, MP3D_V_SUB64(MP3D_V_MUL_HI(vz, s0),
710 MP3D_V_MUL_HI(vy, s1)));
714 a[0] = MP3D_V_GET64(alo, 0); a[1] = MP3D_V_GET64(alo, 1);
715 a[2] = MP3D_V_GET64(ahi, 0); a[3] = MP3D_V_GET64(ahi, 1);
716 b[0] = MP3D_V_GET64(blo, 0); b[1] = MP3D_V_GET64(blo, 1);
717 b[2] = MP3D_V_GET64(bhi, 0); b[3] = MP3D_V_GET64(bhi, 1);
750 int32_t *xr = xl + 576*(nch - 1);
753 static const int32_t g_win[] = {
754 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
755 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
756 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
757 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
758 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
759 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
760 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
761 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
762 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
763 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
764 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
765 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
766 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
767 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
768 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
796#if MP3D_HAVE_INT_SIMD
797 const int use_simd = MP3D_SIMD_AVAILABLE();
800 zlin[4*15] = xl[18*16];
801 zlin[4*15 + 2] = xl[0];
803 zlin[4*31] = xl[1 + 18*16];
804 zlin[4*31 + 2] = xl[1];
808 zlin[4*15 + 1] = xr[18*16];
809 zlin[4*15 + 3] = xr[0];
810 zlin[4*31 + 1] = xr[1 + 18*16];
811 zlin[4*31 + 3] = xr[1];
819 for (i = 14; i >= 0; i--)
846#define LOAD(k) const int32_t w0 = w[2*(k)]; const int32_t w1 = w[2*(k) + 1]; const int32_t *vz = &zlin[4*i + g - (k)*64]; const int32_t *vy = &zlin[4*i + g - (15 - (k))*64];
847#define S0(k, st) { LOAD(k); \
848 b0 = (int64_t)vz[0]*w1 + (int64_t)vy[0]*w0; \
849 a0 = (int64_t)vz[0]*w0 - (int64_t)vy[0]*w1; \
851 b1 = (int64_t)vz[1]*w1 + (int64_t)vy[1]*w0; \
852 a1 = (int64_t)vz[1]*w0 - (int64_t)vy[1]*w1; } }
853#define S1(k, st) { LOAD(k); \
854 b0 += (int64_t)vz[0]*w1 + (int64_t)vy[0]*w0; \
855 a0 += (int64_t)vz[0]*w0 - (int64_t)vy[0]*w1; \
857 b1 += (int64_t)vz[1]*w1 + (int64_t)vy[1]*w0; \
858 a1 += (int64_t)vz[1]*w0 - (int64_t)vy[1]*w1; } }
859#define S2(k, st) { LOAD(k); \
860 b0 += (int64_t)vz[0]*w1 + (int64_t)vy[0]*w0; \
861 a0 += (int64_t)vy[0]*w1 - (int64_t)vz[0]*w0; \
863 b1 += (int64_t)vz[1]*w1 + (int64_t)vy[1]*w0; \
864 a1 += (int64_t)vy[1]*w1 - (int64_t)vz[1]*w0; } }
874#define MP3D_SYNTH_CHAIN(st) \
877 for (g = 0; g < 4; g += 2) \
879 mp3d_sample_t *d = dstl + g*16*nch; \
880 int64_t a0, b0, a1 = 0, b1 = 0; \
881 S0(0, st) S2(1, st) S1(2, st) S2(3, st) \
882 S1(4, st) S2(5, st) S1(6, st) S2(7, st) \
885 d[(15 - i)*nch + 1] = mp3d_scale_pcm(a1); \
886 d[(17 + i)*nch + 1] = mp3d_scale_pcm(b1); \
888 d[(15 - i)*nch] = mp3d_scale_pcm(a0); \
889 d[(17 + i)*nch] = mp3d_scale_pcm(b0); \
893 zlin[4*i] = xl[18*(31 - i)];
894 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
895 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
896 zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
899 zlin[4*i + 1] = xr[18*(31 - i)];
900 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
901 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
902 zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
905#if MP3D_HAVE_INT_SIMD
911 mp3d_synth_taps(zlin, w, i, a, b);
945 for (i = 0; i < nch; i++)
951 for (i = 0; i < nbands; i += 2)
953 mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
955#ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL
958 for (i = 0; i < 15*64; i += 2)
960 qmf_state[i] = lins[nbands*64 + i];
965 memmove(qmf_state, lins + nbands*64,
sizeof(
int32_t)*15*64);
#define MINIMP3_FRAC_BITS
#define MINIMP3_STAGE_DCT2
#define MP3D_Q29_SEC_PI_8
#define MP3D_Q31_COS_PI_4
#define MP3D_Q29_SEC_PI_16
static const int32_t g_twid9_q30[18]
#define MP3D_Q29_SEC_5PI_16
#define MP3D_Q29_SEC_7PI_16
#define MP3D_Q29_SEC_3PI_8
#define MP3D_Q31_SIN_PI_8
#define MP3D_Q29_SEC_3PI_16
static constexpr int32_t g_sec_q27[24]
#define MP3D_Q31_TAN_PI_16
#define MP3D_SYNTH_CHAIN(st)
static MP3D_KERNEL void mp3d_DCT_II(int32_t *grbuf, int n) FL_NO_EXCEPT
static void mp3d_synth_granule(int32_t *qmf_state, int32_t *grbuf, int nbands, int nch, mp3d_sample_t *pcm) FL_NO_EXCEPT
MP3D_HOT void mp3d_synth(int32_t *xl, mp3d_sample_t *dstl, int nch, int32_t *lins) FL_NO_EXCEPT
#define MP3D_DCT_PASS1(I)
static MP3D_KERNEL void mp3d_imdct36_twiddle(int32_t *grbuf, int32_t *overlap, const int32_t *window, const int32_t *co, const int32_t *si) FL_NO_EXCEPT
static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const int32_t *z) FL_NO_EXCEPT
MP3D_LEAF mp3d_sample_t mp3d_scale_pcm(int64_t sample) FL_NO_EXCEPT