mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
Merge pull request #86 from notaz/arm_linux
Arm linux/NEON improvements
This commit is contained in:
commit
6294ce7025
11
Makefile
11
Makefile
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;}
|
||||
|
@ -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 "
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user