ref: ae6b6692e0e24ee434d15ba747fb0435d838611a
parent: 24518a7eea17703041830376d829591d18a768cf
author: Marvin Scholz <epirat07@gmail.com>
date: Tue Sep 25 08:03:34 EDT 2018
Build: x86 asm support
--- a/meson.build
+++ b/meson.build
@@ -29,6 +29,7 @@
dav1d_src_root = meson.current_source_dir()
cdata = configuration_data()
+cdata_asm = configuration_data()
cc = meson.get_compiler('c')
if not meson.is_cross_build()
@@ -75,18 +76,26 @@
if cc.has_argument('-mpreferred-stack-boundary=5')
stackalign_flag = ['-mpreferred-stack-boundary=5']
stackrealign_flag = ['-mincoming-stack-boundary=4']
-# When cross compiling for win64 gcc refuses to use -mpreferred-stack-boundary
-# with a value which isn't 3 or 4. However, when cross compiling with clang, 5 is
-# accepted.
- elif (host_machine.system() == 'windows' and host_machine.cpu_family() == 'x86_64'
- and cc.has_argument('-mpreferred-stack-boundary=4'))
+ cdata_asm.set('STACK_ALIGNMENT', 32)
+ cdata.set('STACK_ALIGNMENT', 32)
+ elif cc.has_argument('-mpreferred-stack-boundary=4')
stackalign_flag = ['-mpreferred-stack-boundary=4']
stackrealign_flag = ['-mincoming-stack-boundary=4']
+ cdata_asm.set('STACK_ALIGNMENT', 16)
+ cdata.set('STACK_ALIGNMENT', 16)
elif cc.has_argument('-mstack-alignment=32')
stackalign_flag = ['-mstack-alignment=32']
stackrealign_flag = ['-mstackrealign']
+ cdata_asm.set('STACK_ALIGNMENT', 32)
+ cdata.set('STACK_ALIGNMENT', 32)
else
- error('Failed to specify stack alignment')
+ if host_machine.cpu_family() == 'x86_64'
+ cdata_asm.set('STACK_ALIGNMENT', 16)
+ cdata.set('STACK_ALIGNMENT', 16)
+ else
+ cdata_asm.set('STACK_ALIGNMENT', 4)
+ cdata.set('STACK_ALIGNMENT', 4)
+ endif
endif
else
stackalign_flag = []
@@ -93,6 +102,31 @@
stackrealign_flag = []
endif
+if host_machine.cpu_family().startswith('x86')
+ cdata.set10('ARCH_X86', true)
+ if host_machine.cpu_family() == 'x86_64'
+ cdata_asm.set10('ARCH_X86_64', true)
+ cdata.set10('ARCH_X86_64', true)
+ cdata_asm.set10('ARCH_X86_32', false)
+ cdata.set10('ARCH_X86_32', false)
+
+ cdata_asm.set10('PIC', true)
+ else
+ cdata_asm.set10('ARCH_X86_64', false)
+ cdata.set10('ARCH_X86_64', false)
+ cdata_asm.set10('ARCH_X86_32', true)
+ cdata.set10('ARCH_X86_32', true)
+ endif
+else
+ cdata.set10('ARCH_X86', false)
+ cdata.set10('ARCH_X86_64', false)
+ cdata.set10('ARCH_X86_32', false)
+endif
+
+if cc.symbols_have_underscore_prefix()
+ cdata_asm.set10('PREFIX', true)
+endif
+
if cc.has_argument('-fvisibility=hidden')
add_project_arguments('-fvisibility=hidden', language: 'c')
else
@@ -122,6 +156,10 @@
cdata.set(f.get(0), f.get(1))
endforeach
+is_asm_enabled = (get_option('build_asm') == true and
+ host_machine.cpu_family().startswith('x86'))
+cdata.set10('HAVE_ASM', is_asm_enabled)
+
#
# Generate config headers
#
@@ -128,6 +166,10 @@
config_h_target = configure_file(output: 'config.h', configuration: cdata)
+if is_asm_enabled
+ config_asm_target = configure_file(output: 'config.asm', output_format: 'nasm', configuration: cdata_asm)
+endif
+
subdir('include')
#
@@ -195,12 +237,48 @@
'src/qm.c',
)
+if is_asm_enabled
+
+ libdav1d_sources_asm = []
+
+ nasm = find_program('nasm')
+
+ if host_machine.system() == 'windows'
+ nasm_format = 'win'
+ elif host_machine.system() == 'darwin'
+ nasm_format = 'macho'
+ else
+ nasm_format = 'elf'
+ endif
+ if host_machine.cpu_family() == 'x86_64'
+ nasm_format += '64'
+ else
+ nasm_format += '32'
+ endif
+
+ nasm_gen = generator(nasm,
+ output: '@BASENAME@.obj',
+ depfile: '@BASENAME@.obj.ndep',
+ arguments: [
+ '-f', nasm_format,
+ '-I', '@CURRENT_SOURCE_DIR@/',
+ '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
+ '@EXTRA_ARGS@',
+ '@INPUT@',
+ '-o', '@OUTPUT@'
+ ])
+
+ nasm_objs = nasm_gen.process(libdav1d_sources_asm)
+else
+ nasm_objs = []
+endif
+
if host_machine.system() == 'windows'
libdav1d_sources += files('src/win32/thread.c')
endif
libdav1d = library('dav1d',
- libdav1d_sources, rev_target,
+ libdav1d_sources, rev_target, nasm_objs,
version: '0.0.1',
objects: [bitdepth_objs, entrypoints_objs],
include_directories: dav1d_inc_dirs,
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -4,3 +4,8 @@
type: 'array',
choices: ['8', '10'],
description: 'Enable only specified bitdepths')
+
+option('build_asm',
+ type: 'boolean',
+ value: true,
+ description: 'Build asm files, if available')