mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-02-23 13:10:41 +00:00
Make number of sinc taps variable in NEON.
This commit is contained in:
parent
a38293caad
commit
e19555d394
10
audio/sinc.c
10
audio/sinc.c
@ -224,15 +224,13 @@ static void process_sinc(rarch_sinc_resampler_t *resamp, float *out_buffer)
|
|||||||
}
|
}
|
||||||
#elif defined(HAVE_NEON)
|
#elif defined(HAVE_NEON)
|
||||||
|
|
||||||
#if TAPS != 16
|
|
||||||
#error "NEON sinc is for now only implemented with 16 taps. Cannot continue."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Need to make this function pointer as Android doesn't have built-in targets
|
// Need to make this function pointer as Android doesn't have built-in targets
|
||||||
// for NEON and plain ARMv7a.
|
// for NEON and plain ARMv7a.
|
||||||
static void (*process_sinc_func)(rarch_sinc_resampler_t *resamp, float *out_buffer);
|
static void (*process_sinc_func)(rarch_sinc_resampler_t *resamp, float *out_buffer);
|
||||||
|
|
||||||
void process_sinc_neon_asm(float *out, const float *left, const float *right, const float *coeff);
|
// Assumes that taps >= 8, and that taps is a multiple of 8.
|
||||||
|
void process_sinc_neon_asm(float *out, const float *left, const float *right, const float *coeff, unsigned taps);
|
||||||
|
|
||||||
static void process_sinc_neon(rarch_sinc_resampler_t *resamp, float *out_buffer)
|
static void process_sinc_neon(rarch_sinc_resampler_t *resamp, float *out_buffer)
|
||||||
{
|
{
|
||||||
const float *buffer_l = resamp->buffer_l + resamp->ptr;
|
const float *buffer_l = resamp->buffer_l + resamp->ptr;
|
||||||
@ -241,7 +239,7 @@ static void process_sinc_neon(rarch_sinc_resampler_t *resamp, float *out_buffer)
|
|||||||
unsigned phase = resamp->time >> SUBPHASE_BITS;
|
unsigned phase = resamp->time >> SUBPHASE_BITS;
|
||||||
const float *phase_table = resamp->phase_table[phase];
|
const float *phase_table = resamp->phase_table[phase];
|
||||||
|
|
||||||
process_sinc_neon_asm(out_buffer, buffer_l, buffer_r, phase_table);
|
process_sinc_neon_asm(out_buffer, buffer_l, buffer_r, phase_table, TAPS);
|
||||||
}
|
}
|
||||||
#else // Plain ol' C99
|
#else // Plain ol' C99
|
||||||
#define process_sinc_func process_sinc_C
|
#define process_sinc_func process_sinc_C
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* RetroArch - A frontend for libretro.
|
/* RetroArch - A frontend for libretro.
|
||||||
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
|
* Copyright (C) 2010-2013 - Hans-Kristian Arntzen
|
||||||
*
|
*
|
||||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU General Public License as published by the Free Software Found-
|
* of the GNU General Public License as published by the Free Software Found-
|
||||||
@ -16,37 +16,39 @@
|
|||||||
.arm
|
.arm
|
||||||
.align 4
|
.align 4
|
||||||
.global process_sinc_neon_asm
|
.global process_sinc_neon_asm
|
||||||
# void process_sinc_neon(float *out, const float *left, const float *right, const float *coeff)
|
# void process_sinc_neon(float *out, const float *left, const float *right, const float *coeff, unsigned taps)
|
||||||
# Hardcoded to 16 taps.
|
# Assumes taps is >= 8, and a multiple of 8.
|
||||||
process_sinc_neon_asm:
|
process_sinc_neon_asm:
|
||||||
|
|
||||||
|
push {r4, lr}
|
||||||
|
vmov.f32 q0, #0.0
|
||||||
|
vmov.f32 q8, #0.0
|
||||||
|
|
||||||
|
# Taps argument (r4) goes on stack in armeabi.
|
||||||
|
ldr r4, [sp, #8]
|
||||||
|
|
||||||
|
1:
|
||||||
# Left
|
# Left
|
||||||
vld1.f32 {q0-q1}, [r1]!
|
vld1.f32 {q2-q3}, [r1]!
|
||||||
vld1.f32 {q2-q3}, [r1]!
|
|
||||||
# Right
|
# Right
|
||||||
vld1.f32 {q8-q9}, [r2]!
|
|
||||||
vld1.f32 {q10-q11}, [r2]!
|
vld1.f32 {q10-q11}, [r2]!
|
||||||
# Coeff
|
# Coeff
|
||||||
vld1.f32 {q12-q13}, [r3, :128]!
|
vld1.f32 {q12-q13}, [r3, :128]!
|
||||||
vld1.f32 {q14-q15}, [r3, :128]!
|
|
||||||
|
|
||||||
# Left
|
# Left / Right
|
||||||
vmul.f32 q0, q0, q12
|
vmla.f32 q0, q2, q12
|
||||||
vmul.f32 q1, q1, q13
|
vmla.f32 q8, q10, q12
|
||||||
vmla.f32 q0, q2, q14
|
vmla.f32 q0, q3, q13
|
||||||
vmla.f32 q1, q3, q15
|
vmla.f32 q8, q11, q13
|
||||||
|
|
||||||
# Right
|
subs r4, r4, #8
|
||||||
vmul.f32 q8, q8, q12
|
bne 1b
|
||||||
vmul.f32 q9, q9, q13
|
|
||||||
vmla.f32 q8, q10, q14
|
|
||||||
vmla.f32 q9, q11, q15
|
|
||||||
|
|
||||||
# Add everything together
|
# Add everything together
|
||||||
vadd.f32 q0, q0, q1
|
|
||||||
vadd.f32 q8, q8, q9
|
|
||||||
vadd.f32 d0, d0, d1
|
vadd.f32 d0, d0, d1
|
||||||
vadd.f32 d16, d16, d17
|
vadd.f32 d16, d16, d17
|
||||||
vpadd.f32 d0, d0, d16
|
vpadd.f32 d0, d0, d16
|
||||||
vst1.f32 d0, [r0]
|
vst1.f32 d0, [r0]
|
||||||
|
|
||||||
bx lr
|
pop {r4, pc}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* RetroArch - A frontend for libretro.
|
/* RetroArch - A frontend for libretro.
|
||||||
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
|
* Copyright (C) 2010-2013 - Hans-Kristian Arntzen
|
||||||
*
|
*
|
||||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU General Public License as published by the Free Software Found-
|
* of the GNU General Public License as published by the Free Software Found-
|
||||||
|
Loading…
x
Reference in New Issue
Block a user