Add CPU detection code to activate the various optimisations.
Move some method definitions around.
Use compatibility macros when we can.
#ifdef HAVE_DBUS
#include <pulsecore/dbus-shared.h>
#endif
+#include <pulsecore/cpu-x86.h>
#include "cmdline.h"
#include "cpulimit.h"
pa_memtrap_install();
- pa_volume_func_init_mmx();
- pa_volume_func_init_sse();
+ pa_cpu_init_x86();
pa_assert_se(mainloop = pa_mainloop_new());
pa_do_volume_func_t pa_get_volume_func(pa_sample_format_t f);
void pa_set_volume_func(pa_sample_format_t f, pa_do_volume_func_t func);
-void pa_volume_func_init_mmx(void);
-void pa_volume_func_init_sse(void);
-
#define PA_CHANNEL_POSITION_MASK_LEFT \
(PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_FRONT_LEFT) \
| PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_REAR_LEFT) \
#include <pulsecore/g711.h>
#include <pulsecore/core-util.h>
+#include "cpu-x86.h"
+
#include "sample-util.h"
#include "endianmacros.h"
static void
pa_volume_s16ne_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsigned length)
{
- int64_t channel, temp;
+ pa_reg_x86 channel, temp;
/* the max number of samples we process at a time, this is also the max amount
* we overread the volume array, which should have enough padding. */
"6: \n\t"
" emms \n\t"
- : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((int64_t)channel), "=&r" (temp)
- : "r" ((int64_t)channels)
+ : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
+ : "r" ((pa_reg_x86)channels)
: "cc"
);
}
static void
pa_volume_s16re_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsigned length)
{
- int64_t channel, temp;
+ pa_reg_x86 channel, temp;
/* the max number of samples we process at a time, this is also the max amount
* we overread the volume array, which should have enough padding. */
"6: \n\t"
" emms \n\t"
- : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((int64_t)channel), "=&r" (temp)
- : "r" ((int64_t)channels)
+ : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
+ : "r" ((pa_reg_x86)channels)
: "cc"
);
}
}
#endif
-#define RUN_TEST
+#undef RUN_TEST
#ifdef RUN_TEST
#define CHANNELS 2
}
#endif
-void pa_volume_func_init_mmx (void) {
+void pa_volume_func_init_mmx (pa_cpu_x86_flag_t flags) {
pa_log_info("Initialising MMX optimized functions.");
#ifdef RUN_TEST
#include <pulsecore/g711.h>
#include <pulsecore/core-util.h>
+#include "cpu-x86.h"
+
#include "sample-util.h"
#include "endianmacros.h"
static void
pa_volume_s16ne_sse (int16_t *samples, int32_t *volumes, unsigned channels, unsigned length)
{
- int64_t channel;
- int64_t temp;
+ pa_reg_x86 channel, temp;
/* the max number of samples we process at a time, this is also the max amount
* we overread the volume array, which should have enough padding. */
"8: \n\t"
: "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp)
- : "r" ((int64_t)channels)
+ : "r" ((pa_reg_x86)channels)
: "cc"
);
}
static void
pa_volume_s16re_sse (int16_t *samples, int32_t *volumes, unsigned channels, unsigned length)
{
- int64_t channel;
- int64_t temp;
+ pa_reg_x86 channel, temp;
/* the max number of samples we process at a time, this is also the max amount
* we overread the volume array, which should have enough padding. */
"8: \n\t"
: "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp)
- : "r" ((int64_t)channels)
+ : "r" ((pa_reg_x86)channels)
: "cc"
);
}
}
#endif
-#define RUN_TEST
+#undef RUN_TEST
#ifdef RUN_TEST
#define CHANNELS 2
}
#endif
-void pa_volume_func_init_sse (void) {
+void pa_volume_func_init_sse (pa_cpu_x86_flag_t flags) {
pa_log_info("Initialising SSE optimized functions.");
#ifdef RUN_TEST