Merge pull request #86 from notaz/arm_linux

Arm linux/NEON improvements
This commit is contained in:
Hans-Kristian Arntzen 2012-12-09 09:34:42 -08:00
commit 6294ce7025
8 changed files with 77 additions and 37 deletions

View File

@ -285,10 +285,17 @@ endif
ifeq ($(HAVE_SINC), 1)
OBJ += audio/sinc.o
ifeq ($(HAVE_NEON),1)
OBJ += audio/sinc_neon.o
endif
else
OBJ += audio/hermite.o
endif
OBJ += audio/utils.o
ifeq ($(HAVE_NEON),1)
OBJ += audio/utils_neon.o
endif
ifneq ($(V),1)
Q := @
@ -338,6 +345,10 @@ endif
$(Q)$(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
@$(if $(Q), $(shell echo echo CC $<),)
%.o: %.S config.h config.mk $(HEADERS)
$(Q)$(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $<
@$(if $(Q), $(shell echo echo CC $<),)
install: $(TARGET)
mkdir -p $(DESTDIR)$(PREFIX)/bin 2>/dev/null || /bin/true
mkdir -p $(DESTDIR)/etc 2>/dev/null || /bin/true

View File

@ -23,30 +23,30 @@ process_sinc_neon_asm:
vld1.f32 {q0-q1}, [r1]!
vld1.f32 {q2-q3}, [r1]!
# Right
vld1.f32 {q4-q5}, [r2]!
vld1.f32 {q6-q7}, [r2]!
vld1.f32 {q8-q9}, [r2]!
vld1.f32 {q10-q11}, [r2]!
# Coeff
vld1.f32 {q8-q9}, [r3, :128]!
vld1.f32 {q10-q11}, [r3, :128]!
vld1.f32 {q12-q13}, [r3, :128]!
vld1.f32 {q14-q15}, [r3, :128]!
# Left
vmul.f32 q0, q0, q8
vmul.f32 q1, q1, q9
vmla.f32 q0, q2, q10
vmla.f32 q1, q3, q11
vmul.f32 q0, q0, q12
vmul.f32 q1, q1, q13
vmla.f32 q0, q2, q14
vmla.f32 q1, q3, q15
# Right
vmul.f32 q4, q4, q8
vmul.f32 q5, q5, q9
vmla.f32 q4, q6, q10
vmla.f32 q5, q7, q11
vmul.f32 q8, q8, q12
vmul.f32 q9, q9, q13
vmla.f32 q8, q10, q14
vmla.f32 q9, q11, q15
# Add everything together
vadd.f32 q0, q0, q1
vadd.f32 q4, q4, q5
vadd.f32 q8, q8, q9
vadd.f32 d0, d0, d1
vadd.f32 d8, d8, d9
vpadd.f32 d0, d0, d8
vadd.f32 d16, d16, d17
vpadd.f32 d0, d0, d16
vst1.f32 d0, [r0]
bx lr

View File

@ -19,6 +19,10 @@
#include <stdint.h>
#include <stddef.h>
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#if defined(__SSE2__)
#define audio_convert_s16_to_float audio_convert_s16_to_float_SSE2
#define audio_convert_float_to_s16 audio_convert_float_to_s16_SSE2

View File

@ -22,11 +22,11 @@ audio_convert_s16_float_asm:
# Hacky way to get a constant of 2^-15.
# Might be faster to just load a constant from memory.
# It's just done once however ...
vmov.f32 q5, #0.25
vmul.f32 q5, q5, q5
vmul.f32 q5, q5, q5
vmul.f32 q5, q5, q5
vadd.f32 q5, q5, q5
vmov.f32 q8, #0.25
vmul.f32 q8, q8, q8
vmul.f32 q8, q8, q8
vmul.f32 q8, q8, q8
vadd.f32 q8, q8, q8
1:
# Preload here?
@ -37,13 +37,13 @@ audio_convert_s16_float_asm:
vmovl.s16 q2, d1
# Convert to float
vcvt.f32.s32 q3, q1
vcvt.f32.s32 q4, q2
vcvt.f32.s32 q1, q1
vcvt.f32.s32 q2, q2
vmul.f32 q3, q3, q5
vmul.f32 q4, q4, q5
vmul.f32 q1, q1, q8
vmul.f32 q2, q2, q8
vst1.f32 {q3-q4}, [r0]!
vst1.f32 {q1-q2}, [r0]!
# Guaranteed to get samples in multiples of 8.
subs r2, r2, #8
@ -57,18 +57,18 @@ audio_convert_s16_float_asm:
audio_convert_float_s16_asm:
# Hacky way to get a constant of 2^15.
# ((2^4)^2)^2 * 0.5 = 2^15
vmov.f32 q5, #16.0
vmov.f32 q6, #0.5
vmul.f32 q5, q5, q5
vmul.f32 q5, q5, q5
vmul.f32 q5, q5, q6
vmov.f32 q8, #16.0
vmov.f32 q9, #0.5
vmul.f32 q8, q8, q8
vmul.f32 q8, q8, q8
vmul.f32 q8, q8, q9
1:
# Preload here?
vld1.f32 {q0-q1}, [r1]!
vmul.f32 q0, q0, q5
vmul.f32 q1, q1, q5
vmul.f32 q0, q0, q8
vmul.f32 q1, q1, q8
vcvt.s32.f32 q0, q0
vcvt.s32.f32 q1, q1

View File

@ -4,9 +4,9 @@ check_switch_c NOUNUSED -Wno-unused-result
add_define_make NOUNUSED "$HAVE_NOUNUSED"
# There are still broken 64-bit Linux distros out there. :)
[ -d /usr/lib64 ] && add_library_dirs /usr/lib64
[ -z "$CROSS_COMPILE" ] && [ -d /usr/lib64 ] && add_library_dirs /usr/lib64
[ -d /opt/local/lib ] && add_library_dirs /opt/local/lib
[ -z "$CROSS_COMPILE" ] && [ -d /opt/local/lib ] && add_library_dirs /opt/local/lib
if [ "$OS" = 'BSD' ]; then DYLIB=-lc; else DYLIB=-ldl; fi
[ "$OS" = 'Darwin' ] && HAVE_X11=no # X11 breaks on recent OSXes even if present.
@ -183,9 +183,11 @@ check_lib STRL -lc strlcpy
check_pkgconf PYTHON python3
check_macro NEON __ARM_NEON__
add_define_make OS "$OS"
# Creates config.mk and config.h.
VARS="ALSA OSS OSS_BSD OSS_LIB AL RSOUND ROAR JACK COREAUDIO PULSE SDL OPENGL GLES VG EGL KMS GBM DRM DYLIB GETOPT_LONG THREADS CG XML SDL_IMAGE LIBPNG DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL SWSCALE CONFIGFILE FREETYPE XVIDEO X11 XEXT XF86VM XINERAMA NETPLAY NETWORK_CMD STDIN_CMD COMMAND SOCKET_LEGACY FBO STRL PYTHON FFMPEG_ALLOC_CONTEXT3 FFMPEG_AVCODEC_OPEN2 FFMPEG_AVIO_OPEN FFMPEG_AVFORMAT_WRITE_HEADER FFMPEG_AVFORMAT_NEW_STREAM FFMPEG_AVCODEC_ENCODE_AUDIO2 FFMPEG_AVCODEC_ENCODE_VIDEO2 SINC BSV_MOVIE VIDEOCORE"
VARS="ALSA OSS OSS_BSD OSS_LIB AL RSOUND ROAR JACK COREAUDIO PULSE SDL OPENGL GLES VG EGL KMS GBM DRM DYLIB GETOPT_LONG THREADS CG XML SDL_IMAGE LIBPNG DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL SWSCALE CONFIGFILE FREETYPE XVIDEO X11 XEXT XF86VM XINERAMA NETPLAY NETWORK_CMD STDIN_CMD COMMAND SOCKET_LEGACY FBO STRL PYTHON FFMPEG_ALLOC_CONTEXT3 FFMPEG_AVCODEC_OPEN2 FFMPEG_AVIO_OPEN FFMPEG_AVFORMAT_WRITE_HEADER FFMPEG_AVFORMAT_NEW_STREAM FFMPEG_AVCODEC_ENCODE_AUDIO2 FFMPEG_AVCODEC_ENCODE_VIDEO2 SINC BSV_MOVIE VIDEOCORE NEON"
create_config_make config.mk $VARS
create_config_header config.h $VARS

View File

@ -24,7 +24,7 @@ if [ "$USE_LANG_C" = 'yes' ]; then
#include <stdio.h>
int main(void) { puts("Hai world!"); return 0; }
EOF
for CC in ${CC:=$(which gcc cc)} ''; do
for CC in ${CC:=$(which ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc)} ''; do
"$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && break
done
[ "$CC" ] || { echo "$ECHOBUF ... Not found. Exiting."; exit 1;}
@ -40,7 +40,7 @@ if [ "$USE_LANG_CXX" = 'yes' ]; then
#include <iostream>
int main() { std::cout << "Hai guise" << std::endl; return 0; }
EOF
for CXX in ${CXX:=$(which g++ c++)} ''; do
for CXX in ${CXX:=$(which ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++)} ''; do
"$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && break
done
[ "$CXX" ] || { echo "$ECHOBUF ... Not found. Exiting."; exit 1;}

View File

@ -144,6 +144,27 @@ EOF
}
}
check_macro() #$1 = HAVE_$1 $2 = macro name
{ tmpval="$(eval echo \$HAVE_$1)"
[ "$tmpval" = 'no' ] && return 0
ECHOBUF="Checking presence of predefined macro $2"
# echo -n "Checking presence of predefined macro $2"
cat << EOF > "$TEMP_C"
#ifndef $2
#error $2 is not defined
#endif
int main(void) { return 0; }
EOF
answer='no'
"$CC" -o "$TEMP_EXE" "$TEMP_C" $CFLAGS $INCLUDE_DIRS >>config.log 2>&1 && answer='yes'
eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer"
rm "$TEMP_C" "$TEMP_EXE" >/dev/null 2>&1
[ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && {
echo "Build assumed that $2 is defined, but it's not. Exiting ..."
exit 1
}
}
check_switch_c() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty]
{ ECHOBUF="Checking for availability of switch $2 in $CC"
# echo -n "Checking for availability of switch $2 in $CC "

View File

@ -16,6 +16,7 @@ LDFLAGS: Linker flags
General options:
--prefix=\$path: Install path prefix
--host=HOST: cross-compile to build programs to run on HOST
--help: Show this help
Custom options:
@ -50,6 +51,7 @@ parse_input() # Parse stuff :V
while [ "$1" ]; do
case "$1" in
--prefix=*) PREFIX=${1##--prefix=};;
--host=*) CROSS_COMPILE=${1##--host=}-;;
--enable-*)
opt_exists "${1##--enable-}"
eval "HAVE_$opt=yes"