> On Feb 5, 2024, at 10:10 PM, Wathsala Wathawana Vithanage > <wathsala.vithan...@arm.com> wrote: > > Hi Pavan, > >> The compiler options march and mtune are a subset of mcpu and will lead to >> conflicts if improper march is chosen for a given mcpu. >> To avoid conflicts, force part number march when mcpu is available and is >> supported by the compiler. > > Why would one force the march specified in the part number when mcpu for > that part number is also available and supported by the compiler? > It would be good to explain the use case or the problem being faced.
>> >> Example: >> march = armv9-a >> mcpu = neoverse-n2 >> >> mcpu supported, march supported >> machine_args = ['-mcpu=neoverse-n2', '-march=armv9-a'] > > -march restricts the compiler to baseline architecture of the -mcpu. > For instance, Neoverse-n1's baseline architecture is armv8.2-a, > but it has some extensions from armv8.3-a, armv8.4-a, and armv8.5-a. > By setting -march to armv8.2-a the compiler will strictly omit extensions > from 8.3, 8.4 and 8.5 resulting in a suboptimal outcome. > >> >> mcpu supported, march not supported >> machine_args = ['-mcpu=neoverse-n2'] > > This will result in the best outcome. > >> >> mcpu not supported, march supported >> machine_args = ['-march=armv9-a'] > > This too may result in a suboptimal outcome as optimization space > is limited to the given march (not using extensions from later > architectures when available). > >> >> mcpu not supported, march not supported >> machine_args = ['-march=armv8.6-a'] > > Compiler knows nothing about the target CPU or the architecture. > I think it's better to exit the build process with an error. > >> >> Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com> >> --- >> v2 Changes: >> - Cleanup march inconsistencies. (Juraj Linkes) >> - Unify fallback march selection. (Juraj Linkes) >> - Tag along ARM WFE patch. >> v3 Changes: >> - Fix missing 'fallback_march' key check. >> >> config/arm/meson.build | 108 +++++++++++++++++++++++++--------------- >> - >> 1 file changed, 66 insertions(+), 42 deletions(-) >> >> diff --git a/config/arm/meson.build b/config/arm/meson.build index >> 36f21d22599a..ba859bd060b5 100644 >> --- a/config/arm/meson.build >> +++ b/config/arm/meson.build >> @@ -58,18 +58,18 @@ implementer_generic = { } >> >> part_number_config_arm = { >> - '0xd03': {'compiler_options': ['-mcpu=cortex-a53']}, >> - '0xd04': {'compiler_options': ['-mcpu=cortex-a35']}, >> - '0xd05': {'compiler_options': ['-mcpu=cortex-a55']}, >> - '0xd07': {'compiler_options': ['-mcpu=cortex-a57']}, >> - '0xd08': {'compiler_options': ['-mcpu=cortex-a72']}, >> - '0xd09': {'compiler_options': ['-mcpu=cortex-a73']}, >> - '0xd0a': {'compiler_options': ['-mcpu=cortex-a75']}, >> - '0xd0b': {'compiler_options': ['-mcpu=cortex-a76']}, >> + '0xd03': {'mcpu': 'cortex-a53'}, >> + '0xd04': {'mcpu': 'cortex-a35'}, >> + '0xd05': {'mcpu': 'cortex-a55'}, >> + '0xd07': {'mcpu': 'cortex-a57'}, >> + '0xd08': {'mcpu': 'cortex-a72'}, >> + '0xd09': {'mcpu': 'cortex-a73'}, >> + '0xd0a': {'mcpu': 'cortex-a75'}, >> + '0xd0b': {'mcpu': 'cortex-a76'}, >> '0xd0c': { >> 'march': 'armv8.2-a', >> 'march_features': ['crypto', 'rcpc'], >> - 'compiler_options': ['-mcpu=neoverse-n1'], >> + 'mcpu': 'neoverse-n1', >> 'flags': [ >> ['RTE_MACHINE', '"neoverse-n1"'], >> ['RTE_ARM_FEATURE_ATOMICS', true], @@ -81,7 +81,7 @@ >> part_number_config_arm = { >> '0xd40': { >> 'march': 'armv8.4-a', >> 'march_features': ['sve'], >> - 'compiler_options': ['-mcpu=neoverse-v1'], >> + 'mcpu': 'neoverse-v1', >> 'flags': [ >> ['RTE_MACHINE', '"neoverse-v1"'], >> ['RTE_ARM_FEATURE_ATOMICS', true], @@ -92,8 +92,9 @@ >> part_number_config_arm = { >> 'march': 'armv8.4-a', >> }, >> '0xd49': { >> + 'march': 'armv9-a', >> 'march_features': ['sve2'], >> - 'compiler_options': ['-mcpu=neoverse-n2'], >> + 'mcpu': 'neoverse-n2', >> 'flags': [ >> ['RTE_MACHINE', '"neoverse-n2"'], >> ['RTE_ARM_FEATURE_ATOMICS', true], @@ -127,21 +128,23 @@ >> implementer_cavium = { >> ], >> 'part_number_config': { >> '0xa1': { >> - 'compiler_options': ['-mcpu=thunderxt88'], >> + 'mcpu': 'thunderxt88', >> 'flags': flags_part_number_thunderx >> }, >> '0xa2': { >> - 'compiler_options': ['-mcpu=thunderxt81'], >> + 'mcpu': 'thunderxt81', >> 'flags': flags_part_number_thunderx >> }, >> '0xa3': { >> - 'compiler_options': ['-march=armv8-a+crc', '-mcpu=thunderxt83'], >> + 'march': 'armv8-a', >> + 'march_features': ['crc'], >> + 'mcpu': 'thunderxt83', >> 'flags': flags_part_number_thunderx >> }, >> '0xaf': { >> 'march': 'armv8.1-a', >> 'march_features': ['crc', 'crypto'], >> - 'compiler_options': ['-mcpu=thunderx2t99'], >> + 'mcpu': 'thunderx2t99', >> 'flags': [ >> ['RTE_MACHINE', '"thunderx2"'], >> ['RTE_ARM_FEATURE_ATOMICS', true], @@ -153,7 +156,7 @@ >> implementer_cavium = { >> '0xb2': { >> 'march': 'armv8.2-a', >> 'march_features': ['crc', 'crypto', 'lse'], >> - 'compiler_options': ['-mcpu=octeontx2'], >> + 'mcpu': 'octeontx2', >> 'flags': [ >> ['RTE_MACHINE', '"cn9k"'], >> ['RTE_ARM_FEATURE_ATOMICS', true], @@ -176,7 +179,7 @@ >> implementer_ampere = { >> '0x0': { >> 'march': 'armv8-a', >> 'march_features': ['crc', 'crypto'], >> - 'compiler_options': ['-mtune=emag'], >> + 'mcpu': 'emag', >> 'flags': [ >> ['RTE_MACHINE', '"eMAG"'], >> ['RTE_MAX_LCORE', 32], >> @@ -186,7 +189,7 @@ implementer_ampere = { >> '0xac3': { >> 'march': 'armv8.6-a', >> 'march_features': ['crc', 'crypto'], >> - 'compiler_options': ['-mcpu=ampere1'], >> + 'mcpu': 'ampere1', >> 'flags': [ >> ['RTE_MACHINE', '"AmpereOne"'], >> ['RTE_MAX_LCORE', 320], @@ -206,7 +209,7 @@ >> implementer_hisilicon = { >> '0xd01': { >> 'march': 'armv8.2-a', >> 'march_features': ['crypto'], >> - 'compiler_options': ['-mtune=tsv110'], >> + 'mcpu': 'tsv110', >> 'flags': [ >> ['RTE_MACHINE', '"Kunpeng 920"'], >> ['RTE_ARM_FEATURE_ATOMICS', true], @@ -695,11 +698,21 @@ if >> update_flags >> >> machine_args = [] # Clear previous machine args >> >> + candidate_mcpu = '' >> + if part_number_config.has_key('mcpu') >> + mcpu = part_number_config['mcpu'] >> + if (cc.has_argument('-mcpu=' + mcpu)) >> + candidate_mcpu = mcpu >> + endif >> + endif >> + >> # probe supported archs and their features >> candidate_march = '' >> if part_number_config.has_key('march') >> - if part_number_config.get('force_march', false) >> - candidate_march = part_number_config['march'] >> + if part_number_config.get('force_march', false) or candidate_mcpu >> != '' >> + if cc.has_argument('-march=' + part_number_config['march']) >> + candidate_march = part_number_config['march'] >> + endif >> else >> supported_marchs = ['armv8.6-a', 'armv8.5-a', 'armv8.4-a', >> 'armv8.3- >> a', >> 'armv8.2-a', 'armv8.1-a', 'armv8-a'] @@ >> -717,32 +730,43 >> @@ if update_flags >> endif >> endforeach >> endif >> - if candidate_march == '' >> - error('No suitable armv8 march version found.') >> - endif >> + >> if candidate_march != part_number_config['march'] >> - warning('Configuration march version is ' + >> - '@0@, but the compiler supports only @1@.' >> - .format(part_number_config['march'], candidate_march)) >> + warning('Configuration march version is @0@, not supported.' >> + .format(part_number_config['march'])) >> + if candidate_march != '' >> + warning('Using march version @0@.'.format(candidate_march)) >> + endif >> endif >> - candidate_march = '-march=' + candidate_march >> >> - march_features = [] >> - if part_number_config.has_key('march_features') >> - march_features += part_number_config['march_features'] >> - endif >> - if soc_config.has_key('extra_march_features') >> - march_features += soc_config['extra_march_features'] >> + if candidate_march == '' and candidate_mcpu == '' >> + error('No suitable ARM march/mcpu version found.') >> endif >> - foreach feature: march_features >> - if cc.has_argument('+'.join([candidate_march, feature])) >> - candidate_march = '+'.join([candidate_march, feature]) >> - else >> - warning('The compiler does not support feature @0@' >> - .format(feature)) >> + >> + if candidate_march != '' >> + candidate_march = '-march=' + candidate_march >> + march_features = [] >> + if part_number_config.has_key('march_features') >> + march_features += part_number_config['march_features'] >> endif >> - endforeach >> - machine_args += candidate_march >> + if soc_config.has_key('extra_march_features') >> + march_features += soc_config['extra_march_features'] >> + endif >> + foreach feature: march_features >> + if cc.has_argument('+'.join([candidate_march, feature])) >> + candidate_march = '+'.join([candidate_march, feature]) >> + else >> + warning('The compiler does not support feature @0@' >> + .format(feature)) >> + endif >> + endforeach >> + machine_args += candidate_march >> + endif >> + endif >> + >> + if candidate_mcpu != '' >> + candidate_mcpu = '-mcpu=' + candidate_mcpu >> + machine_args += candidate_mcpu >> endif >> >> # apply supported compiler options >> -- >> 2.43.0 >