build: Prefer NASM assembler over YASM
NASM is more actively maintained and permits generating dependency information as a sideeffect of assembling, thus cutting build times in half.
This commit is contained in:
parent
f54037da8a
commit
57b753b445
@ -6,7 +6,7 @@ os:
|
|||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
- yasm
|
- nasm
|
||||||
- diffutils
|
- diffutils
|
||||||
compiler:
|
compiler:
|
||||||
- clang
|
- clang
|
||||||
@ -17,7 +17,7 @@ cache:
|
|||||||
before_install:
|
before_install:
|
||||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update --all; fi
|
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update --all; fi
|
||||||
install:
|
install:
|
||||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install yasm; fi
|
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install nasm; fi
|
||||||
script:
|
script:
|
||||||
- mkdir -p libav-samples
|
- mkdir -p libav-samples
|
||||||
- ./configure --samples=libav-samples --cc=$CC
|
- ./configure --samples=libav-samples --cc=$CC
|
||||||
|
@ -9,6 +9,8 @@ version <next>:
|
|||||||
- config.log and other configuration files moved into avbuild/ directory
|
- config.log and other configuration files moved into avbuild/ directory
|
||||||
- VAAPI-accelerated MPEG-2 and VP8 encoding
|
- VAAPI-accelerated MPEG-2 and VP8 encoding
|
||||||
- Apple Pixlet decoder
|
- Apple Pixlet decoder
|
||||||
|
- The x86 assembler default switched from yasm to nasm, pass
|
||||||
|
--x86asmexe=yasm to configure to restore the old behavior.
|
||||||
|
|
||||||
|
|
||||||
version 12:
|
version 12:
|
||||||
|
6
configure
vendored
6
configure
vendored
@ -2563,7 +2563,7 @@ shlibdir_default="$libdir_default"
|
|||||||
ar_default="ar"
|
ar_default="ar"
|
||||||
cc_default="gcc"
|
cc_default="gcc"
|
||||||
host_cc_default="gcc"
|
host_cc_default="gcc"
|
||||||
x86asmexe_default="yasm"
|
x86asmexe_default="nasm"
|
||||||
ln_s="ln -s -f"
|
ln_s="ln -s -f"
|
||||||
nm_default="nm -g"
|
nm_default="nm -g"
|
||||||
pkg_config_default=pkg-config
|
pkg_config_default=pkg-config
|
||||||
@ -4493,7 +4493,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ! disabled_any asm mmx x86asm; then
|
if ! disabled_any asm mmx x86asm; then
|
||||||
for program in $x86asmexe yasm nasm; do
|
for program in $x86asmexe nasm yasm; do
|
||||||
probe_x86asm $program
|
probe_x86asm $program
|
||||||
test -n "$x86asm_type" && break
|
test -n "$x86asm_type" && break
|
||||||
done
|
done
|
||||||
@ -4505,7 +4505,7 @@ EOF
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
check_x86asm "movbe ecx, [5]" && enable x86asm ||
|
check_x86asm "movbe ecx, [5]" && enable x86asm ||
|
||||||
die "yasm/nasm not found or too old. Use --disable-x86asm for a crippled build."
|
die "nasm/yasm not found or too old. Use --disable-x86asm for a crippled build."
|
||||||
check_x86asm "vextracti128 xmm0, ymm0, 0" || disable avx2_external
|
check_x86asm "vextracti128 xmm0, ymm0, 0" || disable avx2_external
|
||||||
check_x86asm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
|
check_x86asm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
|
||||||
check_x86asm "vfmadd132ps ymm0, ymm1, ymm2" || disable fma3_external
|
check_x86asm "vfmadd132ps ymm0, ymm1, ymm2" || disable fma3_external
|
||||||
|
@ -161,8 +161,8 @@ do{
|
|||||||
For x86, mark registers that are clobbered in your asm. This means both
|
For x86, mark registers that are clobbered in your asm. This means both
|
||||||
general x86 registers (e.g. eax) as well as XMM registers. This last one is
|
general x86 registers (e.g. eax) as well as XMM registers. This last one is
|
||||||
particularly important on Win64, where xmm6-15 are callee-save, and not
|
particularly important on Win64, where xmm6-15 are callee-save, and not
|
||||||
restoring their contents leads to undefined results. In external asm (e.g.
|
restoring their contents leads to undefined results. In external asm,
|
||||||
yasm), you do this by using:
|
you do this by using:
|
||||||
cglobal function_name, num_args, num_regs, num_xmm_regs
|
cglobal function_name, num_args, num_regs, num_xmm_regs
|
||||||
In inline asm, you specify clobbered registers at the end of your asm:
|
In inline asm, you specify clobbered registers at the end of your asm:
|
||||||
__asm__(".." ::: "%eax").
|
__asm__(".." ::: "%eax").
|
||||||
@ -194,12 +194,12 @@ The latter requires a good optimizing compiler which gcc is not.
|
|||||||
Inline asm vs. external asm
|
Inline asm vs. external asm
|
||||||
---------------------------
|
---------------------------
|
||||||
Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
|
Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
|
||||||
and external asm (.s or .asm files, handled by an assembler such as yasm/nasm)
|
and external asm (.s or .asm files, handled by an assembler such as nasm/yasm)
|
||||||
are accepted in Libav. Which one to use differs per specific case.
|
are accepted in Libav. Which one to use differs per specific case.
|
||||||
|
|
||||||
- if your code is intended to be inlined in a C function, inline asm is always
|
- if your code is intended to be inlined in a C function, inline asm is always
|
||||||
better, because external asm cannot be inlined
|
better, because external asm cannot be inlined
|
||||||
- if your code calls external functions, yasm is always better
|
- if your code calls external functions, external asm is always better
|
||||||
- if your code takes huge and complex structs as function arguments (e.g.
|
- if your code takes huge and complex structs as function arguments (e.g.
|
||||||
MpegEncContext; note that this is not ideal and is discouraged if there
|
MpegEncContext; note that this is not ideal and is discouraged if there
|
||||||
are alternatives), then inline asm is always better, because predicting
|
are alternatives), then inline asm is always better, because predicting
|
||||||
|
@ -69,9 +69,9 @@ OS X on PowerPC or ARM (iPhone) requires a preprocessor from
|
|||||||
assembly functions. Put the Perl script somewhere
|
assembly functions. Put the Perl script somewhere
|
||||||
in your PATH, Libav's configure will pick it up automatically.
|
in your PATH, Libav's configure will pick it up automatically.
|
||||||
|
|
||||||
OS X on AMD64 and x86 requires @command{yasm} to build most of the
|
OS X on AMD64 and x86 requires @command{nasm} to build most of the
|
||||||
optimized assembly functions @url{http://mxcl.github.com/homebrew/, Homebrew},
|
optimized assembly functions @url{http://mxcl.github.com/homebrew/, Homebrew},
|
||||||
@url{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix}
|
@url{https://wiki.gentoo.org/wiki/Project:Prefix, Gentoo Prefix}
|
||||||
or @url{http://www.macports.org, MacPorts} can easily provide it.
|
or @url{http://www.macports.org, MacPorts} can easily provide it.
|
||||||
|
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ them under @command{MinGW-w64 Win64 Shell} and @command{MinGW-w64 Win32 Shell}.
|
|||||||
pacman -S make pkgconf diffutils
|
pacman -S make pkgconf diffutils
|
||||||
|
|
||||||
# mingw-w64 packages and toolchains
|
# mingw-w64 packages and toolchains
|
||||||
pacman -S mingw-w64-x86_64-yasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL
|
pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
To target 32 bits replace @code{x86_64} with @code{i686} in the command above.
|
To target 32 bits replace @code{x86_64} with @code{i686} in the command above.
|
||||||
@ -152,14 +152,14 @@ You will need the following prerequisites:
|
|||||||
@item @uref{http://code.google.com/p/msinttypes/, msinttypes}
|
@item @uref{http://code.google.com/p/msinttypes/, msinttypes}
|
||||||
(if using MSVC 2012 or earlier)
|
(if using MSVC 2012 or earlier)
|
||||||
@item @uref{http://msys2.github.io/, MSYS2}
|
@item @uref{http://msys2.github.io/, MSYS2}
|
||||||
@item @uref{http://yasm.tortall.net/, YASM}
|
@item @uref{http://www.nasm.us/, NASM}
|
||||||
(Also available via MSYS2's package manager.)
|
(Also available via MSYS2's package manager.)
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from
|
To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from
|
||||||
the Visual Studio or Intel Compiler command prompt.
|
the Visual Studio or Intel Compiler command prompt.
|
||||||
|
|
||||||
Place @code{yasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or
|
Place @code{nasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or
|
||||||
earlier, place @code{c99wrap.exe} and @code{c99conv.exe} somewhere in your
|
earlier, place @code{c99wrap.exe} and @code{c99conv.exe} somewhere in your
|
||||||
@code{PATH} as well.
|
@code{PATH} as well.
|
||||||
|
|
||||||
@ -307,7 +307,7 @@ These library packages are only available from
|
|||||||
@uref{http://sourceware.org/cygwinports/, Cygwin Ports}:
|
@uref{http://sourceware.org/cygwinports/, Cygwin Ports}:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
yasm, libSDL-devel, libfaac-devel, libgsm-devel, libmp3lame-devel,
|
nasm, libSDL-devel, libfaac-devel, libgsm-devel, libmp3lame-devel,
|
||||||
libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel
|
libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user