void* memalign_alloc_aligned(size_t size) { #if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) return memalign_alloc(64, size); #elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(GEKKO) return memalign_alloc(32, size); #else return memalign_alloc(32, size); #endif }
static void *resampler_sinc_new(const struct resampler_config *config, double bandwidth_mod, resampler_simd_mask_t mask) { double cutoff; size_t phase_elems, elems; rarch_sinc_resampler_t *re = (rarch_sinc_resampler_t*) calloc(1, sizeof(*re)); if (!re) return NULL; (void)config; re->taps = TAPS; cutoff = CUTOFF; /* Downsampling, must lower cutoff, and extend number of * taps accordingly to keep same stopband attenuation. */ if (bandwidth_mod < 1.0) { cutoff *= bandwidth_mod; re->taps = (unsigned)ceil(re->taps / bandwidth_mod); } /* Be SIMD-friendly. */ #if (defined(__AVX__) && ENABLE_AVX) || (defined(__ARM_NEON__)) re->taps = (re->taps + 7) & ~7; #else re->taps = (re->taps + 3) & ~3; #endif phase_elems = (1 << PHASE_BITS) * re->taps; #if SINC_COEFF_LERP phase_elems *= 2; #endif elems = phase_elems + 4 * re->taps; re->main_buffer = (float*)memalign_alloc(128, sizeof(float) * elems); if (!re->main_buffer) goto error; re->phase_table = re->main_buffer; re->buffer_l = re->main_buffer + phase_elems; re->buffer_r = re->buffer_l + 2 * re->taps; init_sinc_table(re, cutoff, re->phase_table, 1 << PHASE_BITS, re->taps, SINC_COEFF_LERP); #if defined(__ARM_NEON__) process_sinc_func = mask & RESAMPLER_SIMD_NEON ? process_sinc_neon : process_sinc_C; #endif return re; error: resampler_sinc_free(re); return NULL; }