changeset 11937:9eabffb26dd6 draft

x86: Change assembler from YASM to NASM Supports NASM versions 2.13 and greater
author Vignesh Vijayakumar<vignesh@multicorewareinc.com>
date Thu, 02 Nov 2017 09:40:41 +0530
parents 0a446f650128
children b1dfa312234e
files source/CMakeLists.txt source/cmake/CMakeASM_NASMInformation.cmake source/cmake/CMakeASM_YASMInformation.cmake source/cmake/CMakeDetermineASM_NASMCompiler.cmake source/cmake/CMakeDetermineASM_YASMCompiler.cmake source/cmake/CMakeTestASM_NASMCompiler.cmake source/cmake/CMakeTestASM_YASMCompiler.cmake source/cmake/FindNasm.cmake source/cmake/FindYasm.cmake source/common/CMakeLists.txt source/common/x86/x86inc.asm source/test/CMakeLists.txt source/test/checkasm-a.asm
diffstat 13 files changed, 181 insertions(+-), 166 deletions(-) [+]
line wrap: on
line diff
--- a/source/CMakeLists.txt	Thu Nov 02 09:39:58 2017 +0530
+++ b/source/CMakeLists.txt	Thu Nov 02 09:40:41 2017 +0530
@@ -323,15 +323,15 @@ if(GCC)
     execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CC_VERSION)
 endif(GCC)
 
-find_package(Yasm)
+find_package(Nasm)
 if(ARM OR CROSS_COMPILE_ARM)
     option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" ON)
-elseif(YASM_FOUND AND X86)
-    if (YASM_VERSION_STRING VERSION_LESS "1.2.0")
-        message(STATUS "Yasm version ${YASM_VERSION_STRING} is too old. 1.2.0 or later required")
+elseif(NASM_FOUND AND X86)
+    if (NASM_VERSION_STRING VERSION_LESS "2.13.0")
+        message(STATUS "Nasm version ${NASM_VERSION_STRING} is too old. 2.13.0 or later required")
         option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" OFF)
     else()
-        message(STATUS "Found Yasm ${YASM_VERSION_STRING} to build assembly primitives")
+        message(STATUS "Found Nasm ${NASM_VERSION_STRING} to build assembly primitives")
         option(ENABLE_ASSEMBLY "Enable use of assembly coded primitives" ON)
     endif()
 else()
@@ -517,18 +517,18 @@ if((MSVC_IDE OR XCODE OR GCC) AND ENABLE
             list(APPEND ASM_OBJS ${ASM}.${SUFFIX})
             add_custom_command(
                 OUTPUT ${ASM}.${SUFFIX}
-                COMMAND ${YASM_EXECUTABLE} ARGS ${YASM_FLAGS} ${ASM_SRC} -o ${ASM}.${SUFFIX}
+                COMMAND ${NASM_EXECUTABLE} ARGS ${NASM_FLAGS} ${ASM_SRC} -o ${ASM}.${SUFFIX}
                 DEPENDS ${ASM_SRC})
         endforeach()
     endif()
 endif()
 source_group(ASM FILES ${ASM_SRCS})
 if(ENABLE_HDR10_PLUS)
-    add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10> ${ASM_OBJS} ${ASM_SRCS})
+    add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10> ${ASM_OBJS})
     add_library(hdr10plus-static STATIC $<TARGET_OBJECTS:dynamicHDR10>)
     set_target_properties(hdr10plus-static PROPERTIES OUTPUT_NAME hdr10plus)
 else()
-    add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${ASM_OBJS} ${ASM_SRCS})
+    add_library(x265-static STATIC $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${ASM_OBJS})
 endif()
 if(NOT MSVC)
     set_target_properties(x265-static PROPERTIES OUTPUT_NAME x265)
@@ -686,11 +686,11 @@ if(ENABLE_CLI)
         if(ENABLE_HDR10_PLUS)
         add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT}
                         x265.cpp x265.h x265cli.h
-                        $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10> ${ASM_OBJS} ${ASM_SRCS})
+                        $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> $<TARGET_OBJECTS:dynamicHDR10> ${ASM_OBJS})
         else()
             add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT}
                         x265.cpp x265.h x265cli.h
-                        $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${ASM_OBJS} ${ASM_SRCS})
+                        $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${ASM_OBJS})
         endif()
     else()
         add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT} ${X265_RC_FILE}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/cmake/CMakeASM_NASMInformation.cmake	Thu Nov 02 09:40:41 2017 +0530
@@ -0,0 +1,68 @@
+set(ASM_DIALECT "_NASM")
+set(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS asm)
+
+if(X64)
+    list(APPEND ASM_FLAGS -DARCH_X86_64=1 -I ${CMAKE_CURRENT_SOURCE_DIR}/../common/x86/)
+    if(ENABLE_PIC)
+        list(APPEND ASM_FLAGS -DPIC)
+    endif()
+    if(APPLE)
+        set(ARGS -f macho64 -DPREFIX)
+    elseif(UNIX AND NOT CYGWIN)
+        set(ARGS -f elf64)
+    else()
+        set(ARGS -f win64)
+    endif()
+else()
+    list(APPEND ASM_FLAGS -DARCH_X86_64=0 -I ${CMAKE_CURRENT_SOURCE_DIR}/../common/x86/)
+    if(APPLE)
+        set(ARGS -f macho32 -DPREFIX)
+    elseif(UNIX AND NOT CYGWIN)
+        set(ARGS -f elf32)
+    else()
+        set(ARGS -f win32 -DPREFIX)
+    endif()
+endif()
+
+if(GCC)
+    list(APPEND ASM_FLAGS -DHAVE_ALIGNED_STACK=1)
+else()
+    list(APPEND ASM_FLAGS -DHAVE_ALIGNED_STACK=0)
+endif()
+
+if(HIGH_BIT_DEPTH)
+    if(MAIN12)
+        list(APPEND ASM_FLAGS -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=12 -DX265_NS=${X265_NS})
+    else()
+        list(APPEND ASM_FLAGS -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10 -DX265_NS=${X265_NS})
+    endif()
+else()
+    list(APPEND ASM_FLAGS -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8 -DX265_NS=${X265_NS})
+endif()
+
+list(APPEND ASM_FLAGS "${CMAKE_ASM_NASM_FLAGS}")
+
+if(CMAKE_BUILD_TYPE MATCHES Release)
+    list(APPEND ASM_FLAGS "${CMAKE_ASM_NASM_FLAGS_RELEASE}")
+elseif(CMAKE_BUILD_TYPE MATCHES Debug)
+    list(APPEND ASM_FLAGS "${CMAKE_ASM_NASM_FLAGS_DEBUG}")
+elseif(CMAKE_BUILD_TYPE MATCHES MinSizeRel)
+    list(APPEND ASM_FLAGS "${CMAKE_ASM_NASM_FLAGS_MINSIZEREL}")
+elseif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
+    list(APPEND ASM_FLAGS "${CMAKE_ASM_NASM_FLAGS_RELWITHDEBINFO}")
+endif()
+
+set(NASM_FLAGS ${ARGS} ${ASM_FLAGS} PARENT_SCOPE)
+string(REPLACE ";" " " CMAKE_ASM_NASM_COMPILER_ARG1 "${ARGS}")
+
+# This section exists to override the one in CMakeASMInformation.cmake
+# (the default Information file). This removes the <FLAGS>
+# thing so that your C compiler flags that have been set via
+# set_target_properties don't get passed to nasm and confuse it.
+if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT)
+    string(REPLACE ";" " " STR_ASM_FLAGS "${ASM_FLAGS}")
+    set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> ${STR_ASM_FLAGS} -o <OBJECT> <SOURCE>")
+endif()
+
+include(CMakeASMInformation)
+set(ASM_DIALECT)
--- a/source/cmake/CMakeASM_YASMInformation.cmake	Thu Nov 02 09:39:58 2017 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-set(ASM_DIALECT "_YASM")
-set(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS asm)
-
-if(X64)
-    list(APPEND ASM_FLAGS -DARCH_X86_64=1)
-    if(ENABLE_PIC)
-        list(APPEND ASM_FLAGS -DPIC)
-    endif()
-    if(APPLE)
-        set(ARGS -f macho64 -m amd64 -DPREFIX)
-    elseif(UNIX AND NOT CYGWIN)
-        set(ARGS -f elf64 -m amd64)
-    else()
-        set(ARGS -f win64 -m amd64)
-    endif()
-else()
-    list(APPEND ASM_FLAGS -DARCH_X86_64=0)
-    if(APPLE)
-        set(ARGS -f macho -DPREFIX)
-    elseif(UNIX AND NOT CYGWIN)
-        set(ARGS -f elf32)
-    else()
-        set(ARGS -f win32 -DPREFIX)
-    endif()
-endif()
-
-if(GCC)
-    list(APPEND ASM_FLAGS -DHAVE_ALIGNED_STACK=1)
-else()
-    list(APPEND ASM_FLAGS -DHAVE_ALIGNED_STACK=0)
-endif()
-
-if(HIGH_BIT_DEPTH)
-    if(MAIN12)
-        list(APPEND ASM_FLAGS -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=12 -DX265_NS=${X265_NS})
-    else()
-        list(APPEND ASM_FLAGS -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10 -DX265_NS=${X265_NS})
-    endif()
-else()
-    list(APPEND ASM_FLAGS -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8 -DX265_NS=${X265_NS})
-endif()
-
-list(APPEND ASM_FLAGS "${CMAKE_ASM_YASM_FLAGS}")
-
-if(CMAKE_BUILD_TYPE MATCHES Release)
-    list(APPEND ASM_FLAGS "${CMAKE_ASM_YASM_FLAGS_RELEASE}")
-elseif(CMAKE_BUILD_TYPE MATCHES Debug)
-    list(APPEND ASM_FLAGS "${CMAKE_ASM_YASM_FLAGS_DEBUG}")
-elseif(CMAKE_BUILD_TYPE MATCHES MinSizeRel)
-    list(APPEND ASM_FLAGS "${CMAKE_ASM_YASM_FLAGS_MINSIZEREL}")
-elseif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
-    list(APPEND ASM_FLAGS "${CMAKE_ASM_YASM_FLAGS_RELWITHDEBINFO}")
-endif()
-
-set(YASM_FLAGS ${ARGS} ${ASM_FLAGS} PARENT_SCOPE)
-string(REPLACE ";" " " CMAKE_ASM_YASM_COMPILER_ARG1 "${ARGS}")
-
-# This section exists to override the one in CMakeASMInformation.cmake
-# (the default Information file). This removes the <FLAGS>
-# thing so that your C compiler flags that have been set via
-# set_target_properties don't get passed to yasm and confuse it.
-if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT)
-    string(REPLACE ";" " " STR_ASM_FLAGS "${ASM_FLAGS}")
-    set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT "<CMAKE_ASM${ASM_DIALECT}_COMPILER> ${STR_ASM_FLAGS} -o <OBJECT> <SOURCE>")
-endif()
-
-include(CMakeASMInformation)
-set(ASM_DIALECT)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/cmake/CMakeDetermineASM_NASMCompiler.cmake	Thu Nov 02 09:40:41 2017 +0530
@@ -0,0 +1,5 @@
+set(ASM_DIALECT "_NASM")
+set(CMAKE_ASM${ASM_DIALECT}_COMPILER ${NASM_EXECUTABLE})
+set(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT ${_CMAKE_TOOLCHAIN_PREFIX}nasm)
+include(CMakeDetermineASMCompiler)
+set(ASM_DIALECT)
--- a/source/cmake/CMakeDetermineASM_YASMCompiler.cmake	Thu Nov 02 09:39:58 2017 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-set(ASM_DIALECT "_YASM")
-set(CMAKE_ASM${ASM_DIALECT}_COMPILER ${YASM_EXECUTABLE})
-set(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT ${_CMAKE_TOOLCHAIN_PREFIX}yasm)
-include(CMakeDetermineASMCompiler)
-set(ASM_DIALECT)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/cmake/CMakeTestASM_NASMCompiler.cmake	Thu Nov 02 09:40:41 2017 +0530
@@ -0,0 +1,3 @@
+set(ASM_DIALECT "_NASM")
+include(CMakeTestASMCompiler)
+set(ASM_DIALECT)
--- a/source/cmake/CMakeTestASM_YASMCompiler.cmake	Thu Nov 02 09:39:58 2017 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-set(ASM_DIALECT "_YASM")
-include(CMakeTestASMCompiler)
-set(ASM_DIALECT)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/cmake/FindNasm.cmake	Thu Nov 02 09:40:41 2017 +0530
@@ -0,0 +1,25 @@
+include(FindPackageHandleStandardArgs)
+
+# Simple path search with YASM_ROOT environment variable override
+find_program(NASM_EXECUTABLE 
+ NAMES nasm nasm-2.13.0-win32 nasm-2.13.0-win64 nasm nasm-2.13.0-win32 nasm-2.13.0-win64
+ HINTS $ENV{NASM_ROOT} ${NASM_ROOT}
+ PATH_SUFFIXES bin
+)
+
+if(NASM_EXECUTABLE)
+        execute_process(COMMAND ${NASM_EXECUTABLE} -version
+            OUTPUT_VARIABLE nasm_version
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+            )
+    if(nasm_version MATCHES "^NASM version ([0-9\\.]*)")
+        set(NASM_VERSION_STRING "${CMAKE_MATCH_1}")
+    endif()
+    unset(nasm_version)
+endif()
+
+# Provide standardized success/failure messages
+find_package_handle_standard_args(nasm
+    REQUIRED_VARS NASM_EXECUTABLE
+    VERSION_VAR NASM_VERSION_STRING)
--- a/source/cmake/FindYasm.cmake	Thu Nov 02 09:39:58 2017 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-include(FindPackageHandleStandardArgs)
-
-# Simple path search with YASM_ROOT environment variable override
-find_program(YASM_EXECUTABLE 
- NAMES yasm yasm-1.2.0-win32 yasm-1.2.0-win64 yasm yasm-1.3.0-win32 yasm-1.3.0-win64
- HINTS $ENV{YASM_ROOT} ${YASM_ROOT}
- PATH_SUFFIXES bin
-)
-
-if(YASM_EXECUTABLE)
-    execute_process(COMMAND ${YASM_EXECUTABLE} --version
-        OUTPUT_VARIABLE yasm_version
-        ERROR_QUIET
-        OUTPUT_STRIP_TRAILING_WHITESPACE
-        )
-    if(yasm_version MATCHES "^yasm ([0-9\\.]*)")
-        set(YASM_VERSION_STRING "${CMAKE_MATCH_1}")
-    endif()
-    unset(yasm_version)
-endif()
-
-# Provide standardized success/failure messages
-find_package_handle_standard_args(yasm
-    REQUIRED_VARS YASM_EXECUTABLE
-    VERSION_VAR YASM_VERSION_STRING)
--- a/source/common/CMakeLists.txt	Thu Nov 02 09:39:58 2017 +0530
+++ b/source/common/CMakeLists.txt	Thu Nov 02 09:40:41 2017 +0530
@@ -72,12 +72,12 @@ if(ENABLE_ASSEMBLY AND X86)
     endif()
 
     if(MSVC_IDE OR XCODE)
-        # MSVC requires custom build rules in the main cmake script for yasm
-        set(MSVC_ASMS "${A_SRCS}" CACHE INTERNAL "yasm sources")
+        # MSVC requires custom build rules in the main cmake script for nasm
+        set(MSVC_ASMS "${A_SRCS}" CACHE INTERNAL "nasm sources")
         set(A_SRCS)
     endif()
 
-    enable_language(ASM_YASM)
+    enable_language(ASM_NASM)
 
     foreach(SRC ${A_SRCS} ${C_SRCS})
         set(ASM_PRIMITIVES ${ASM_PRIMITIVES} x86/${SRC})
--- a/source/common/x86/x86inc.asm	Thu Nov 02 09:39:58 2017 +0530
+++ b/source/common/x86/x86inc.asm	Thu Nov 02 09:40:41 2017 +0530
@@ -66,6 +66,15 @@
     %endif
 %endif
 
+%define FORMAT_ELF 0
+%ifidn __OUTPUT_FORMAT__,elf
+    %define FORMAT_ELF 1
+%elifidn __OUTPUT_FORMAT__,elf32
+    %define FORMAT_ELF 1
+%elifidn __OUTPUT_FORMAT__,elf64
+    %define FORMAT_ELF 1
+%endif
+
 %ifdef PREFIX
     %define mangle(x) _ %+ x
 %else
@@ -88,6 +97,10 @@
     default rel
 %endif
 
+%ifdef __NASM_VER__
+    %use smartalign
+%endif
+
 ; Macros to eliminate most code duplication between x86_32 and x86_64:
 ; Currently this works only for leaf functions which load all their arguments
 ; into registers at the start, and make no other use of the stack. Luckily that
@@ -685,7 +698,7 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
         CAT_XDEFINE cglobaled_, %2, 1
     %endif
     %xdefine current_function %2
-    %ifidn __OUTPUT_FORMAT__,elf
+    %if FORMAT_ELF
         global %2:function %%VISIBILITY
     %else
         global %2
@@ -711,14 +724,16 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
 
 ; like cextern, but without the prefix
 %macro cextern_naked 1
-    %xdefine %1 mangle(%1)
+    %ifdef PREFIX
+        %xdefine %1 mangle(%1)
+    %endif
     CAT_XDEFINE cglobaled_, %1, 1
     extern %1
 %endmacro
 
 %macro const 1-2+
     %xdefine %1 mangle(private_prefix %+ _ %+ %1)
-    %ifidn __OUTPUT_FORMAT__,elf
+    %if FORMAT_ELF
         global %1:data hidden
     %else
         global %1
@@ -727,9 +742,8 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
     %1: %2
 %endmacro
 
-; This is needed for ELF, otherwise the GNU linker assumes the stack is
-; executable by default.
-%ifidn __OUTPUT_FORMAT__,elf
+; This is needed for ELF, otherwise the GNU linker assumes the stack is executable by default.
+%if FORMAT_ELF
     [SECTION .note.GNU-stack noalloc noexec nowrite progbits]
 %endif
 
@@ -801,9 +815,17 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
     %endif
 
     %if ARCH_X86_64 || cpuflag(sse2)
-        CPU amdnop
+        %ifdef __NASM_VER__
+            ALIGNMODE p6
+        %else
+            CPU amdnop
+        %endif
     %else
-        CPU basicnop
+        %ifdef __NASM_VER__
+            ALIGNMODE nop
+        %else
+            CPU basicnop
+        %endif
     %endif
 %endmacro
 
@@ -1467,7 +1489,7 @@ FMA_INSTR pmadcswd, pmaddwd, paddd
                 v%5%6 %1, %2, %3, %4
             %elifidn %1, %2
                 ; If %3 or %4 is a memory operand it needs to be encoded as the last operand.
-                %ifid %3
+                %ifnum sizeof%3
                     v%{5}213%6 %2, %3, %4
                 %else
                     v%{5}132%6 %2, %4, %3
@@ -1491,14 +1513,3 @@ FMA4_INSTR fmsub,    pd, ps, sd, ss
 FMA4_INSTR fmsubadd, pd, ps
 FMA4_INSTR fnmadd,   pd, ps, sd, ss
 FMA4_INSTR fnmsub,   pd, ps, sd, ss
-
-; workaround: vpbroadcastq is broken in x86_32 due to a yasm bug (fixed in 1.3.0)
-%if __YASM_VERSION_ID__ < 0x01030000 && ARCH_X86_64 == 0
-    %macro vpbroadcastq 2
-        %if sizeof%1 == 16
-            movddup %1, %2
-        %else
-            vbroadcastsd %1, %2
-        %endif
-    %endmacro
-%endif
--- a/source/test/CMakeLists.txt	Thu Nov 02 09:39:58 2017 +0530
+++ b/source/test/CMakeLists.txt	Thu Nov 02 09:40:41 2017 +0530
@@ -7,37 +7,37 @@ endif()
 
 # add X86 assembly files
 if(X86)
-enable_language(ASM_YASM)
+enable_language(ASM_NASM)
 
 if(MSVC_IDE)
-    set(YASM_SRC checkasm-a.obj)
+    set(NASM_SRC checkasm-a.obj)
     add_custom_command(
         OUTPUT checkasm-a.obj
-        COMMAND ${YASM_EXECUTABLE}
-        ARGS ${YASM_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/checkasm-a.asm -o checkasm-a.obj
+        COMMAND ${NASM_EXECUTABLE}
+        ARGS ${NASM_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/checkasm-a.asm -o checkasm-a.obj
         DEPENDS checkasm-a.asm)
 else()
-    set(YASM_SRC checkasm-a.asm)
+    set(NASM_SRC checkasm-a.asm)
 endif()
 endif(X86)
 
 # add ARM assembly files
 if(ARM OR CROSS_COMPILE_ARM)
     enable_language(ASM)
-    set(YASM_SRC checkasm-arm.S)
+    set(NASM_SRC checkasm-arm.S)
     add_custom_command(
         OUTPUT checkasm-arm.obj
         COMMAND ${CMAKE_CXX_COMPILER}
-        ARGS ${YASM_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/checkasm-arm.S -o checkasm-arm.obj
+        ARGS ${NASM_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/checkasm-arm.S -o checkasm-arm.obj
         DEPENDS checkasm-arm.S)
 endif(ARM OR CROSS_COMPILE_ARM)
 
 # add PowerPC assembly files
 if(POWER)
-    set(YASM_SRC)
+    set(NASM_SRC)
 endif(POWER)
 
-add_executable(TestBench ${YASM_SRC}
+add_executable(TestBench ${NASM_SRC}
     testbench.cpp testharness.h
     pixelharness.cpp pixelharness.h
     mbdstharness.cpp mbdstharness.h
--- a/source/test/checkasm-a.asm	Thu Nov 02 09:39:58 2017 +0530
+++ b/source/test/checkasm-a.asm	Thu Nov 02 09:40:41 2017 +0530
@@ -26,7 +26,7 @@
 ;* For more information, contact us at license @ x265.com.
 ;*****************************************************************************
 
-%include "../common/x86/x86inc.asm"
+%include "x86inc.asm"
 
 SECTION_RODATA
 
@@ -35,24 +35,24 @@ error_message: db "failed to preserve re
 %if ARCH_X86_64
 ; just random numbers to reduce the chance of incidental match
 ALIGN 16
-x6:  ddq 0x79445c159ce790641a1b2550a612b48c
-x7:  ddq 0x86b2536fcd8cf6362eed899d5a28ddcd
-x8:  ddq 0x3f2bf84fc0fcca4eb0856806085e7943
-x9:  ddq 0xd229e1f5b281303facbd382dcf5b8de2
-x10: ddq 0xab63e2e11fa38ed971aeaff20b095fd9
-x11: ddq 0x77d410d5c42c882d89b0c0765892729a
-x12: ddq 0x24b3c1d2a024048bc45ea11a955d8dd5
-x13: ddq 0xdd7b8919edd427862e8ec680de14b47c
-x14: ddq 0x11e53e2b2ac655ef135ce6888fa02cbf
-x15: ddq 0x6de8f4c914c334d5011ff554472a7a10
-n7:   dq 0x21f86d66c8ca00ce
-n8:   dq 0x75b6ba21077c48ad
-n9:   dq 0xed56bb2dcb3c7736
-n10:  dq 0x8bda43d3fd1a7e06
-n11:  dq 0xb64a9c9e5d318408
-n12:  dq 0xdf9a54b303f1d3a3
-n13:  dq 0x4a75479abd64e097
-n14:  dq 0x249214109d5d1c88
+x6:  dq 0x1a1b2550a612b48c,0x79445c159ce79064
+x7:  dq 0x2eed899d5a28ddcd,0x86b2536fcd8cf636
+x8:  dq 0xb0856806085e7943,0x3f2bf84fc0fcca4e
+x9:  dq 0xacbd382dcf5b8de2,0xd229e1f5b281303f
+x10: dq 0x71aeaff20b095fd9,0xab63e2e11fa38ed9
+x11: dq 0x89b0c0765892729a,0x77d410d5c42c882d
+x12: dq 0xc45ea11a955d8dd5,0x24b3c1d2a024048b
+x13: dq 0x2e8ec680de14b47c,0xdd7b8919edd42786
+x14: dq 0x135ce6888fa02cbf,0x11e53e2b2ac655ef
+x15: dq 0x011ff554472a7a10,0x6de8f4c914c334d5
+n7:  dq 0x21f86d66c8ca00ce
+n8:  dq 0x75b6ba21077c48ad
+n9:  dq 0xed56bb2dcb3c7736
+n10: dq 0x8bda43d3fd1a7e06
+n11: dq 0xb64a9c9e5d318408
+n12: dq 0xdf9a54b303f1d3a3
+n13: dq 0x4a75479abd64e097
+n14: dq 0x249214109d5d1c88
 %endif
 
 SECTION .text
@@ -70,14 +70,14 @@ cextern_naked puts
 ;-----------------------------------------------------------------------------
 cglobal checkasm_stack_clobber, 1,2
     ; Clobber the stack with junk below the stack pointer
-    %define size (max_args+6)*8
-    SUB  rsp, size
-    mov   r1, size-8
+    %define argsize (max_args+6)*8
+    SUB  rsp, argsize
+    mov   r1, argsize-8
 .loop:
     mov [rsp+r1], r0
     sub   r1, 8
     jge .loop
-    ADD  rsp, size
+    ADD  rsp, argsize
     RET
 
 %if WIN64
@@ -156,7 +156,11 @@ cglobal checkasm_call, 2,15,16,max_args*
     mov  r9, rax
     mov r10, rdx
     lea  r0, [error_message]
+%if FORMAT_ELF
+    call puts wrt ..plt
+%else
     call puts
+%endif
     mov  r1, [rsp+max_args*8]
     mov  dword [r1], 0
     mov  rdx, r10