# Copyright 2017 The Meson development team # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from .. import mesonlib, compilers, mlog from . import ExtensionModule from ..interpreterbase import FeatureNew class SimdModule(ExtensionModule): @FeatureNew('SIMD module', '0.42.0') def __init__(self, interpreter): super().__init__(interpreter) # FIXME add Altivec and AVX512. self.isets = ('mmx', 'sse', 'sse2', 'sse3', 'ssse3', 'sse41', 'sse42', 'avx', 'avx2', 'neon', ) self.methods.update({ 'check': self.check, }) def check(self, state, args, kwargs): result = [] if len(args) != 1: raise mesonlib.MesonException('Check requires one argument, a name prefix for checks.') prefix = args[0] if not isinstance(prefix, str): raise mesonlib.MesonException('Argument must be a string.') if 'compiler' not in kwargs: raise mesonlib.MesonException('Must specify compiler keyword') if 'sources' in kwargs: raise mesonlib.MesonException('SIMD module does not support the "sources" keyword') basic_kwargs = {} for key, value in kwargs.items(): if key not in self.isets and key != 'compiler': basic_kwargs[key] = value compiler = kwargs['compiler'].compiler if not isinstance(compiler, compilers.compilers.Compiler): raise mesonlib.MesonException('Compiler argument must be a compiler object.') cdata = self.interpreter.func_configuration_data(None, [], {}) conf = cdata.held_object for iset in self.isets: if iset not in kwargs: continue iset_fname = kwargs[iset] # Might also be an array or Files. static_library will validate. args = compiler.get_instruction_set_args(iset) if args is None: mlog.log('Compiler supports %s:' % iset, mlog.red('NO')) continue if args: if not compiler.has_multi_arguments(args, state.environment)[0]: mlog.log('Compiler supports %s:' % iset, mlog.red('NO')) continue mlog.log('Compiler supports %s:' % iset, mlog.green('YES')) conf.values['HAVE_' + iset.upper()] = ('1', 'Compiler supports %s.' % iset) libname = prefix + '_' + iset lib_kwargs = {'sources': iset_fname, } lib_kwargs.update(basic_kwargs) langarg_key = compiler.get_language() + '_args' old_lang_args = mesonlib.extract_as_list(lib_kwargs, langarg_key) all_lang_args = old_lang_args + args lib_kwargs[langarg_key] = all_lang_args result.append(self.interpreter.func_static_lib(None, [libname], lib_kwargs)) return [result, cdata] def initialize(*args, **kwargs): return SimdModule(*args, **kwargs)