NASM is more actively maintained and permits generating dependency information
as a sideeffect of assembling, thus cutting build times in half.
(Cherry-picked from libav commit 57b753b445)
Signed-off-by: James Almer <jamrial@gmail.com>
tags/n3.4
| @@ -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 ffmpeg-samples | - mkdir -p ffmpeg-samples | ||||
| - ./configure --samples=ffmpeg-samples --cc=$CC | - ./configure --samples=ffmpeg-samples --cc=$CC | ||||
| @@ -22,6 +22,8 @@ version <next>: | |||||
| - headphone audio filter | - headphone audio filter | ||||
| - superequalizer audio filter | - superequalizer audio filter | ||||
| - roberts video filter | - roberts video filter | ||||
| - The x86 assembler default switched from yasm to nasm, pass | |||||
| --x86asmexe=yasm to configure to restore the old behavior. | |||||
| version 3.3: | version 3.3: | ||||
| - CrystalHD decoder moved to new decode API | - CrystalHD decoder moved to new decode API | ||||
| @@ -3258,7 +3258,7 @@ pkg_config_default=pkg-config | |||||
| ranlib_default="ranlib" | ranlib_default="ranlib" | ||||
| strip_default="strip" | strip_default="strip" | ||||
| version_script='--version-script' | version_script='--version-script' | ||||
| x86asmexe_default="yasm" | |||||
| x86asmexe_default="nasm" | |||||
| windres_default="windres" | windres_default="windres" | ||||
| nvcc_default="nvcc" | nvcc_default="nvcc" | ||||
| nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2" | nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2" | ||||
| @@ -5506,7 +5506,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 | ||||
| @@ -5518,7 +5518,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 "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external | check_x86asm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_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. | |||||
| yasm), you do this by using: | |||||
| restoring their contents leads to undefined results. In external asm, | |||||
| 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"). | ||||
| @@ -199,12 +199,12 @@ actual lines causing issues. | |||||
| 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 FFmpeg. Which one to use differs per specific case. | are accepted in FFmpeg. 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 | ||||
| @@ -71,9 +71,9 @@ Mac 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, FFmpeg's configure will pick it up automatically. | in your PATH, FFmpeg's configure will pick it up automatically. | ||||
| Mac OS X on amd64 and x86 requires @command{yasm} to build most of the | |||||
| Mac OS X on amd64 and x86 requires @command{nasm} to build most of the | |||||
| optimized assembly functions. @uref{http://www.finkproject.org/, Fink}, | optimized assembly functions. @uref{http://www.finkproject.org/, Fink}, | ||||
| @uref{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix}, | |||||
| @uref{https://wiki.gentoo.org/wiki/Project:Prefix, Gentoo Prefix}, | |||||
| @uref{https://mxcl.github.com/homebrew/, Homebrew} | @uref{https://mxcl.github.com/homebrew/, Homebrew} | ||||
| or @uref{http://www.macports.org, MacPorts} can easily provide it. | or @uref{http://www.macports.org, MacPorts} can easily provide it. | ||||
| @@ -141,7 +141,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-SDL2 | |||||
| @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. | ||||
| @@ -159,7 +159,7 @@ 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 | ||||