remap: Split remapping functions into s16 and float implementation

The sample format is known when the remap structure is initialized,
no runtime decision needed.

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
This commit is contained in:
Peter Meerwald 2014-04-16 11:58:11 +02:00 committed by Peter Meerwald
parent 9362bdc8a1
commit c0e0e7ea8c
3 changed files with 160 additions and 158 deletions

View file

@ -101,33 +101,26 @@
"4: \n\t"
#if defined (__i386__) || defined (__amd64__)
static void remap_mono_to_stereo_sse2(pa_remap_t *m, void *dst, const void *src, unsigned n) {
static void remap_mono_to_stereo_s16ne_sse2(pa_remap_t *m, void *dst, const void *src, unsigned n) {
pa_reg_x86 temp, temp2;
switch (m->format) {
case PA_SAMPLE_FLOAT32NE:
{
__asm__ __volatile__ (
MONO_TO_STEREO(dq, 4, 15) /* do doubles to quads */
: "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
: "r" ((pa_reg_x86)n)
: "cc"
);
break;
}
case PA_SAMPLE_S16NE:
{
__asm__ __volatile__ (
MONO_TO_STEREO(wd, 5, 31) /* do words to doubles */
: "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
: "r" ((pa_reg_x86)n)
: "cc"
);
break;
}
default:
pa_assert_not_reached();
}
__asm__ __volatile__ (
MONO_TO_STEREO(wd, 5, 31) /* do words to doubles */
: "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
: "r" ((pa_reg_x86)n)
: "cc"
);
}
static void remap_mono_to_stereo_float32ne_sse2(pa_remap_t *m, void *dst, const void *src, unsigned n) {
pa_reg_x86 temp, temp2;
__asm__ __volatile__ (
MONO_TO_STEREO(dq, 4, 15) /* do doubles to quads */
: "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
: "r" ((pa_reg_x86)n)
: "cc"
);
}
/* set the function that will execute the remapping based on the matrices */
@ -140,8 +133,18 @@ static void init_remap_sse2(pa_remap_t *m) {
/* find some common channel remappings, fall back to full matrix operation. */
if (n_ic == 1 && n_oc == 2 &&
m->map_table_i[0][0] == 0x10000 && m->map_table_i[1][0] == 0x10000) {
m->do_remap = (pa_do_remap_func_t) remap_mono_to_stereo_sse2;
pa_log_info("Using SSE2 mono to stereo remapping");
switch (m->format) {
case PA_SAMPLE_S16NE:
m->do_remap = (pa_do_remap_func_t) remap_mono_to_stereo_s16ne_sse2;
break;
case PA_SAMPLE_FLOAT32NE:
m->do_remap = (pa_do_remap_func_t) remap_mono_to_stereo_float32ne_sse2;
break;
default:
pa_assert_not_reached();
}
}
}
#endif /* defined (__i386__) || defined (__amd64__) */