[FFmpeg-devel] [PATCH 5/5] build: Prefer NASM assembler over YASM

James Almer jamrial at gmail.com
Wed Jun 21 01:49:59 EEST 2017

From: Diego Biurrun <diego at biurrun.de>

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 57b753b445e23363c997a8ec1c556e0b0f6e9da3)

Signed-off-by: James Almer <jamrial at gmail.com>
 .travis.yml          | 4 ++--
 Changelog            | 2 ++
 configure            | 6 +++---
 doc/optimization.txt | 8 ++++----
 doc/platform.texi    | 8 ++++----
 5 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index e541ee1608..40f01f94c2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,7 +6,7 @@ os:
-      - yasm
+      - nasm
       - diffutils
   - clang
@@ -17,7 +17,7 @@ cache:
   - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update --all; fi
-  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install yasm; fi
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install nasm; fi
   - mkdir -p ffmpeg-samples
   - ./configure --samples=ffmpeg-samples --cc=$CC
diff --git a/Changelog b/Changelog
index a893efa4f0..4f46edaddb 100644
--- a/Changelog
+++ b/Changelog
@@ -22,6 +22,8 @@ version <next>:
 - headphone audio filter
 - superequalizer audio 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:
 - CrystalHD decoder moved to new decode API
diff --git a/configure b/configure
index a1957b2843..f4ba6405ff 100755
--- a/configure
+++ b/configure
@@ -3258,7 +3258,7 @@ pkg_config_default=pkg-config
 nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
@@ -5505,7 +5505,7 @@ EOF
     if ! disabled_any asm mmx x86asm; then
-        for program in $x86asmexe yasm nasm; do
+        for program in $x86asmexe nasm yasm; do
             probe_x86asm $program
             test -n "$x86asm_type" && break
@@ -5517,7 +5517,7 @@ EOF
         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 "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
         check_x86asm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
diff --git a/doc/optimization.txt b/doc/optimization.txt
index c39e1e37b9..974e2f9af2 100644
--- a/doc/optimization.txt
+++ b/doc/optimization.txt
@@ -161,8 +161,8 @@ do{
 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
 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
 In inline asm, you specify clobbered registers at the end of your asm:
 __asm__(".." ::: "%eax").
@@ -199,12 +199,12 @@ actual lines causing issues.
 Inline asm vs. external asm
 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.
 - if your code is intended to be inlined in a C function, inline asm is always
    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.
    MpegEncContext; note that this is not ideal and is discouraged if there
    are alternatives), then inline asm is always better, because predicting
diff --git a/doc/platform.texi b/doc/platform.texi
index 32d97cc58b..185bda5a07 100644
--- a/doc/platform.texi
+++ b/doc/platform.texi
@@ -71,9 +71,9 @@ Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
 assembly functions. Put the Perl script somewhere
 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},
- at uref{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix},
+ at uref{{https://wiki.gentoo.org/wiki/Project:Prefix, Gentoo Prefix},
 @uref{https://mxcl.github.com/homebrew/, Homebrew}
 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
 # 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
 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}
 (if using MSVC 2012 or earlier)
 @item @uref{http://msys2.github.io/, MSYS2}
- at item @uref{http://yasm.tortall.net/, YASM}
+ at item @uref{http://www.nasm.us/, NASM}
 (Also available via MSYS2's package manager.)
 @end itemize

More information about the ffmpeg-devel mailing list