156 lines
4.2 KiB
Diff
156 lines
4.2 KiB
Diff
diff --git a/lib/meson.build b/lib/meson.build
|
|
index e22aa0f..c28d9b3 100644
|
|
--- a/lib/meson.build
|
|
+++ b/lib/meson.build
|
|
@@ -38,6 +38,8 @@ decoder_sources = files(
|
|
'state.c',
|
|
)
|
|
|
|
+common_arm_sources = files()
|
|
+
|
|
if conf.get('CPU_x86_64', false)
|
|
if cc.get_argument_syntax() != 'msvc'
|
|
encoder_sources += files(
|
|
@@ -105,6 +107,47 @@ elif conf.get('CPU_x86_32', false)
|
|
'x86_vc/x86state.c',
|
|
)
|
|
endif
|
|
+elif cc.get_id() == 'gcc' and conf.get('CPU_arm', false)
|
|
+ # The Arm bits require the Arm -> GNU conversion script
|
|
+
|
|
+ arm2gnu_pl = find_program('arm/arm2gnu.pl', required: true)
|
|
+ arm2gnu_py = find_program('arm/arm2gnu-wrapper.py', required: true)
|
|
+
|
|
+ arm2gnu_gen = generator(
|
|
+ arm2gnu_py,
|
|
+ arguments: ['--program', arm2gnu_pl.full_path(), '@INPUT@'],
|
|
+ capture: true,
|
|
+ output: '@BASENAME@-gnu.S',
|
|
+ )
|
|
+
|
|
+ arm_opts_s = configure_file(
|
|
+ input: 'arm/armopts.s.in',
|
|
+ configuration: conf,
|
|
+ output: 'armopts.S',
|
|
+ )
|
|
+
|
|
+ common_arm_sources += arm2gnu_gen.process(
|
|
+ files('arm/armbits.s', 'arm/armfrag.s', 'arm/armidct.s', 'arm/armloop.s'),
|
|
+ arm_opts_s,
|
|
+ )
|
|
+
|
|
+ encoder_sources += arm2gnu_gen.process(
|
|
+ files(
|
|
+ 'arm/armencfrag.s',
|
|
+ 'arm/armenquant.s',
|
|
+ ),
|
|
+ )
|
|
+
|
|
+ encoder_sources += files(
|
|
+ 'arm/armcpu.c',
|
|
+ 'arm/armenc.c',
|
|
+ 'arm/armstate.c',
|
|
+ )
|
|
+
|
|
+ decoder_sources += files(
|
|
+ 'arm/armcpu.c',
|
|
+ 'arm/armstate.c',
|
|
+ )
|
|
endif
|
|
|
|
decoder_res = files()
|
|
diff --git a/meson.build b/meson.build
|
|
index c122073..49d1edc 100644
|
|
--- a/meson.build
|
|
+++ b/meson.build
|
|
@@ -135,6 +135,7 @@ if mem_constraint.enabled()
|
|
endif
|
|
|
|
asm = not get_option('asm').disabled()
|
|
+enable_asflag_probe = not get_option('asflag-probe').disabled()
|
|
if asm
|
|
if host_machine.cpu_family() == 'x86_64'
|
|
conf.set('CPU_x86_64', true)
|
|
@@ -145,6 +146,64 @@ if asm
|
|
elif host_machine.cpu_family() == 'x86'
|
|
conf.set('CPU_x86_32', true)
|
|
conf.set('OC_X86_ASM', true)
|
|
+ elif host_machine.cpu_family() == 'arm' or host_machine.cpu_family() == 'aarch64'
|
|
+ conf.set('CPU_arm', true)
|
|
+ if cc.get_id() == 'gcc'
|
|
+ conf.set('OC_ARM_ASM', true)
|
|
+ endif
|
|
+ endif
|
|
+
|
|
+ if cc.get_id() == 'gcc' and conf.get('CPU_arm', false)
|
|
+ # The following checks were only designed for GNU AS.
|
|
+ # Perl is needed for the arm2gnu reformatter.
|
|
+ perl_exe = find_program('perl', required: false, disabler: true)
|
|
+
|
|
+ if not perl_exe.found()
|
|
+ warning('*** ARM assembly requires perl -- disabling optimizations')
|
|
+ endif
|
|
+
|
|
+ if enable_asflag_probe and perl_exe.found()
|
|
+ assembler_checks = [
|
|
+ [
|
|
+ ['HAVE_ARM_ASM_NEON', 'OC_ARM_ASM_NEON'],
|
|
+ '''.file "configure"
|
|
+ vorr d0,d0,d0
|
|
+ ''',
|
|
+ ['-mfpu=neon', '-march=armv7-a'],
|
|
+ 'assembler supports NEON instructions on ARM'
|
|
+ ],
|
|
+ [
|
|
+ ['HAVE_ARM_ASM_MEDIA', 'OC_ARM_ASM_MEDIA'],
|
|
+ '''.file "configure"
|
|
+ shadd8 r3,r3,r3
|
|
+ ''',
|
|
+ ['-march=armv6j'],
|
|
+ 'assembler supports ARMv6 media instructions on ARM'],
|
|
+ [
|
|
+ ['HAVE_ARM_ASM_EDSP', 'OC_ARM_ASM_EDSP'],
|
|
+ '''.file "configure"
|
|
+ qadd r3,r3,r3
|
|
+ ''',
|
|
+ ['-march=armv5e'],
|
|
+ 'assembler supports EDSP instructions on ARM'
|
|
+ ]
|
|
+ ]
|
|
+
|
|
+ foreach check : assembler_checks
|
|
+ pass = cc.compiles(check[1],
|
|
+ args: ['-x', 'assembler'],
|
|
+ name: check[3]
|
|
+ ) or cc.compiles(check[1],
|
|
+ args: ['-x', 'assembler'] + check[2],
|
|
+ name: check[3]
|
|
+ )
|
|
+
|
|
+ foreach define : check[0]
|
|
+ conf.set(define, pass)
|
|
+ conf.set(define, pass)
|
|
+ endforeach
|
|
+ endforeach
|
|
+ endif
|
|
endif
|
|
endif
|
|
|
|
diff --git a/meson_options.txt b/meson_options.txt
|
|
index c378660..af88803 100644
|
|
--- a/meson_options.txt
|
|
+++ b/meson_options.txt
|
|
@@ -22,6 +22,12 @@ option(
|
|
value: 'enabled',
|
|
description: 'Enable assembly optimizations',
|
|
)
|
|
+option(
|
|
+ 'asflag-probe',
|
|
+ type: 'feature',
|
|
+ value: 'enabled',
|
|
+ description: 'Enable instructions not supported by the default assembler flags (Arm only).',
|
|
+)
|
|
option(
|
|
'telemetry',
|
|
type: 'feature',
|
|
|