[2/2] config/arm: add support for fallback march

Message ID 20240121093653.2890-2-pbhagavatula@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series [1/2] config/arm: avoid mcpu and march conflicts |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/loongarch-compilation success Compilation OK
ci/loongarch-unit-testing success Unit Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-compile-amd64-testing success Testing PASS
ci/github-robot: build success github build: passed
ci/iol-unit-amd64-testing success Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/intel-Functional success Functional PASS
ci/iol-unit-arm64-testing success Testing PASS
ci/iol-sample-apps-testing success Testing PASS
ci/iol-compile-arm64-testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS

Commit Message

Pavan Nikhilesh Bhagavatula Jan. 21, 2024, 9:36 a.m. UTC
  From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Some ARM CPUs have specific march requirements and
are not compatible with the supported march list.
Add fallback march in case the mcpu and the march
advertised in the part_number_config are not supported
by the compiler.

Example
	mcpu = neoverse-n2
	march = armv9-a
	fallback_march = armv8.5-a

	mcpu, march not supported
	machine_args = ['-march=armv8.5-a']

	mcpu, march, fallback_march not supported
	least march supported = armv8-a

	machine_args = ['-march=armv8-a']

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
 config/arm/meson.build | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

--
2.25.1
  

Comments

Ruifeng Wang Jan. 22, 2024, 6:30 a.m. UTC | #1
+Cc

On 2024/1/21 5:36 PM, pbhagavatula@marvell.com wrote:
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> 
> Some ARM CPUs have specific march requirements and
> are not compatible with the supported march list.
> Add fallback march in case the mcpu and the march
> advertised in the part_number_config are not supported
> by the compiler.
> 
> Example
> 	mcpu = neoverse-n2
> 	march = armv9-a
> 	fallback_march = armv8.5-a
> 
> 	mcpu, march not supported
> 	machine_args = ['-march=armv8.5-a']
> 
> 	mcpu, march, fallback_march not supported
> 	least march supported = armv8-a
> 
> 	machine_args = ['-march=armv8-a']
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
>   config/arm/meson.build | 15 +++++++++++++--
>   1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/config/arm/meson.build b/config/arm/meson.build
> index 8c8cfccca0..2aaf78a81a 100644
> --- a/config/arm/meson.build
> +++ b/config/arm/meson.build
> @@ -94,6 +94,7 @@ part_number_config_arm = {
>       '0xd49': {
>           'march': 'armv9-a',
>           'march_features': ['sve2'],
> +        'fallback_march': 'armv8.5-a',
>           'mcpu': 'neoverse-n2',
>           'flags': [
>               ['RTE_MACHINE', '"neoverse-n2"'],
> @@ -709,14 +710,14 @@ if update_flags
> 
>       # probe supported archs and their features
>       candidate_march = ''
> +    supported_marchs = ['armv9-a', 'armv8.6-a', 'armv8.5-a', 'armv8.4-a',
> +                        'armv8.3-a', 'armv8.2-a', 'armv8.1-a', 'armv8-a']
>       if part_number_config.has_key('march')
>           if part_number_config.get('force_march', false) or support_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']
>               check_compiler_support = false
>               foreach supported_march: supported_marchs
>                   if supported_march == part_number_config['march']
> @@ -733,6 +734,16 @@ if update_flags
>           endif
> 
>           if candidate_march != part_number_config['march']
> +            if part_number_config.has_key('fallback_march') and not support_mcpu
> +                fallback_march = part_number_config['fallback_march']
> +                foreach supported_march: supported_marchs
> +                    if (supported_march == fallback_march
> +                        and cc.has_argument('-march=' + supported_march))
> +                        candidate_march = supported_march
> +                        break
> +                    endif
> +                endforeach
> +            endif
>               warning('Configuration march version is @0@, not supported.'
>                       .format(part_number_config['march']))
>               if candidate_march != ''
> --
> 2.25.1
>
  
Juraj Linkeš Jan. 22, 2024, 11:04 a.m. UTC | #2
On Sun, Jan 21, 2024 at 10:37 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Some ARM CPUs have specific march requirements and
> are not compatible with the supported march list.
> Add fallback march in case the mcpu and the march
> advertised in the part_number_config are not supported
> by the compiler.
>

It's not clear to me what this patch adds. We already have a fallback
mechanism and this basically does the same thing, but there's some
extra logic that's not clear to me. Looks like there are some extra
conditions around mcpu. In that case, all of the mcpu/march processing
should be done first and then we should do a common fallback.

> Example
>         mcpu = neoverse-n2
>         march = armv9-a
>         fallback_march = armv8.5-a
>
>         mcpu, march not supported
>         machine_args = ['-march=armv8.5-a']
>
>         mcpu, march, fallback_march not supported
>         least march supported = armv8-a
>
>         machine_args = ['-march=armv8-a']
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
>  config/arm/meson.build | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/config/arm/meson.build b/config/arm/meson.build
> index 8c8cfccca0..2aaf78a81a 100644
> --- a/config/arm/meson.build
> +++ b/config/arm/meson.build
> @@ -94,6 +94,7 @@ part_number_config_arm = {
>      '0xd49': {
>          'march': 'armv9-a',
>          'march_features': ['sve2'],
> +        'fallback_march': 'armv8.5-a',
>          'mcpu': 'neoverse-n2',
>          'flags': [
>              ['RTE_MACHINE', '"neoverse-n2"'],
> @@ -709,14 +710,14 @@ if update_flags
>
>      # probe supported archs and their features
>      candidate_march = ''
> +    supported_marchs = ['armv9-a', 'armv8.6-a', 'armv8.5-a', 'armv8.4-a',
> +                        'armv8.3-a', 'armv8.2-a', 'armv8.1-a', 'armv8-a']
>      if part_number_config.has_key('march')
>          if part_number_config.get('force_march', false) or support_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']
>              check_compiler_support = false
>              foreach supported_march: supported_marchs
>                  if supported_march == part_number_config['march']
> @@ -733,6 +734,16 @@ if update_flags
>          endif
>
>          if candidate_march != part_number_config['march']
> +            if part_number_config.has_key('fallback_march') and not support_mcpu
> +                fallback_march = part_number_config['fallback_march']
> +                foreach supported_march: supported_marchs
> +                    if (supported_march == fallback_march
> +                        and cc.has_argument('-march=' + supported_march))
> +                        candidate_march = supported_march
> +                        break
> +                    endif
> +                endforeach
> +            endif
>              warning('Configuration march version is @0@, not supported.'
>                      .format(part_number_config['march']))
>              if candidate_march != ''
> --
> 2.25.1
>
  
Pavan Nikhilesh Bhagavatula Jan. 22, 2024, 12:16 p.m. UTC | #3
> On Sun, Jan 21, 2024 at 10:37 AM <pbhagavatula@marvell.com> wrote:
> >
> > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> >
> > Some ARM CPUs have specific march requirements and
> > are not compatible with the supported march list.
> > Add fallback march in case the mcpu and the march
> > advertised in the part_number_config are not supported
> > by the compiler.
> >
> 
> It's not clear to me what this patch adds. We already have a fallback
> mechanism and this basically does the same thing, but there's some
> extra logic that's not clear to me. Looks like there are some extra
> conditions around mcpu. In that case, all of the mcpu/march processing
> should be done first and then we should do a common fallback.
> 

The current fallback does a simple reverse compatibility check with the compiler
when force march is not enabled. 
But this is not true for neoverse-n2 case, as it is based on armv9-a which is a super set of 
armv8.5-a and other features[1]
In the current fallback path if both march neoverse-n2 and mcpu armv9-a are not supported
then it would fallback to armv8.6-a but this not correct as neoverse-n2 is not based on armv8.5-a

The fallback march armv8.5-a kicks in (if supported) when neoverse-n2 and armv9-a are not supported.


[1] https://github.com/gcc-mirror/gcc/blob/615e25c82de97acc17ab438f88d6788cf7ffe1d6/gcc/config/arm/arm-cpus.in#L306
 

> > Example
> >         mcpu = neoverse-n2
> >         march = armv9-a
> >         fallback_march = armv8.5-a
> >
> >         mcpu, march not supported
> >         machine_args = ['-march=armv8.5-a']
> >
> >         mcpu, march, fallback_march not supported
> >         least march supported = armv8-a
> >
> >         machine_args = ['-march=armv8-a']
> >
> > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > ---
> >  config/arm/meson.build | 15 +++++++++++++--
> >  1 file changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/config/arm/meson.build b/config/arm/meson.build
> > index 8c8cfccca0..2aaf78a81a 100644
> > --- a/config/arm/meson.build
> > +++ b/config/arm/meson.build
> > @@ -94,6 +94,7 @@ part_number_config_arm = {
> >      '0xd49': {
> >          'march': 'armv9-a',
> >          'march_features': ['sve2'],
> > +        'fallback_march': 'armv8.5-a',
> >          'mcpu': 'neoverse-n2',
> >          'flags': [
> >              ['RTE_MACHINE', '"neoverse-n2"'],
> > @@ -709,14 +710,14 @@ if update_flags
> >
> >      # probe supported archs and their features
> >      candidate_march = ''
> > +    supported_marchs = ['armv9-a', 'armv8.6-a', 'armv8.5-a', 'armv8.4-a',
> > +                        'armv8.3-a', 'armv8.2-a', 'armv8.1-a', 'armv8-a']
> >      if part_number_config.has_key('march')
> >          if part_number_config.get('force_march', false) or support_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']
> >              check_compiler_support = false
> >              foreach supported_march: supported_marchs
> >                  if supported_march == part_number_config['march']
> > @@ -733,6 +734,16 @@ if update_flags
> >          endif
> >
> >          if candidate_march != part_number_config['march']
> > +            if part_number_config.has_key('fallback_march') and not
> support_mcpu
> > +                fallback_march = part_number_config['fallback_march']
> > +                foreach supported_march: supported_marchs
> > +                    if (supported_march == fallback_march
> > +                        and cc.has_argument('-march=' + supported_march))
> > +                        candidate_march = supported_march
> > +                        break
> > +                    endif
> > +                endforeach
> > +            endif
> >              warning('Configuration march version is @0@, not supported.'
> >                      .format(part_number_config['march']))
> >              if candidate_march != ''
> > --
> > 2.25.1
> >
  
Juraj Linkeš Jan. 22, 2024, 4:29 p.m. UTC | #4
On Mon, Jan 22, 2024 at 1:16 PM Pavan Nikhilesh Bhagavatula
<pbhagavatula@marvell.com> wrote:
>
> > On Sun, Jan 21, 2024 at 10:37 AM <pbhagavatula@marvell.com> wrote:
> > >
> > > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > >
> > > Some ARM CPUs have specific march requirements and
> > > are not compatible with the supported march list.
> > > Add fallback march in case the mcpu and the march
> > > advertised in the part_number_config are not supported
> > > by the compiler.
> > >
> >
> > It's not clear to me what this patch adds. We already have a fallback
> > mechanism and this basically does the same thing, but there's some
> > extra logic that's not clear to me. Looks like there are some extra
> > conditions around mcpu. In that case, all of the mcpu/march processing
> > should be done first and then we should do a common fallback.
> >
>
> The current fallback does a simple reverse compatibility check with the compiler
> when force march is not enabled.
> But this is not true for neoverse-n2 case, as it is based on armv9-a which is a super set of
> armv8.5-a and other features[1]
> In the current fallback path if both march neoverse-n2 and mcpu armv9-a are not supported
> then it would fallback to armv8.6-a but this not correct as neoverse-n2 is not based on armv8.5-a
>
> The fallback march armv8.5-a kicks in (if supported) when neoverse-n2 and armv9-a are not supported.
>

Can the two fallback mechanisms be combined? They seem very similar.

>
> [1] https://github.com/gcc-mirror/gcc/blob/615e25c82de97acc17ab438f88d6788cf7ffe1d6/gcc/config/arm/arm-cpus.in#L306
>
>
> > > Example
> > >         mcpu = neoverse-n2
> > >         march = armv9-a
> > >         fallback_march = armv8.5-a
> > >
> > >         mcpu, march not supported
> > >         machine_args = ['-march=armv8.5-a']
> > >
> > >         mcpu, march, fallback_march not supported
> > >         least march supported = armv8-a
> > >
> > >         machine_args = ['-march=armv8-a']
> > >
> > > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > > ---
> > >  config/arm/meson.build | 15 +++++++++++++--
> > >  1 file changed, 13 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/config/arm/meson.build b/config/arm/meson.build
> > > index 8c8cfccca0..2aaf78a81a 100644
> > > --- a/config/arm/meson.build
> > > +++ b/config/arm/meson.build
> > > @@ -94,6 +94,7 @@ part_number_config_arm = {
> > >      '0xd49': {
> > >          'march': 'armv9-a',
> > >          'march_features': ['sve2'],
> > > +        'fallback_march': 'armv8.5-a',
> > >          'mcpu': 'neoverse-n2',
> > >          'flags': [
> > >              ['RTE_MACHINE', '"neoverse-n2"'],
> > > @@ -709,14 +710,14 @@ if update_flags
> > >
> > >      # probe supported archs and their features
> > >      candidate_march = ''
> > > +    supported_marchs = ['armv9-a', 'armv8.6-a', 'armv8.5-a', 'armv8.4-a',
> > > +                        'armv8.3-a', 'armv8.2-a', 'armv8.1-a', 'armv8-a']
> > >      if part_number_config.has_key('march')
> > >          if part_number_config.get('force_march', false) or support_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']
> > >              check_compiler_support = false
> > >              foreach supported_march: supported_marchs
> > >                  if supported_march == part_number_config['march']
> > > @@ -733,6 +734,16 @@ if update_flags
> > >          endif
> > >
> > >          if candidate_march != part_number_config['march']
> > > +            if part_number_config.has_key('fallback_march') and not
> > support_mcpu
> > > +                fallback_march = part_number_config['fallback_march']
> > > +                foreach supported_march: supported_marchs
> > > +                    if (supported_march == fallback_march
> > > +                        and cc.has_argument('-march=' + supported_march))
> > > +                        candidate_march = supported_march
> > > +                        break
> > > +                    endif
> > > +                endforeach
> > > +            endif
> > >              warning('Configuration march version is @0@, not supported.'
> > >                      .format(part_number_config['march']))
> > >              if candidate_march != ''
> > > --
> > > 2.25.1
> > >
  
Pavan Nikhilesh Bhagavatula Jan. 24, 2024, 3:25 p.m. UTC | #5
> -----Original Message-----
> From: Juraj Linkeš <juraj.linkes@pantheon.tech>
> Sent: Monday, January 22, 2024 9:59 PM
> To: Pavan Nikhilesh Bhagavatula <pbhagavatula@marvell.com>
> Cc: Jerin Jacob <jerinj@marvell.com>; Ruifeng.Wang@arm.com;
> nd@arm.com; Bruce Richardson <bruce.richardson@intel.com>;
> dev@dpdk.org
> Subject: Re: [EXT] Re: [PATCH 2/2] config/arm: add support for fallback march
> 
> On Mon, Jan 22, 2024 at 1:16 PM Pavan Nikhilesh Bhagavatula
> <pbhagavatula@marvell.com> wrote:
> >
> > > On Sun, Jan 21, 2024 at 10:37 AM <pbhagavatula@marvell.com> wrote:
> > > >
> > > > From: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > > >
> > > > Some ARM CPUs have specific march requirements and
> > > > are not compatible with the supported march list.
> > > > Add fallback march in case the mcpu and the march
> > > > advertised in the part_number_config are not supported
> > > > by the compiler.
> > > >
> > >
> > > It's not clear to me what this patch adds. We already have a fallback
> > > mechanism and this basically does the same thing, but there's some
> > > extra logic that's not clear to me. Looks like there are some extra
> > > conditions around mcpu. In that case, all of the mcpu/march processing
> > > should be done first and then we should do a common fallback.
> > >
> >
> > The current fallback does a simple reverse compatibility check with the
> compiler
> > when force march is not enabled.
> > But this is not true for neoverse-n2 case, as it is based on armv9-a which is a
> super set of
> > armv8.5-a and other features[1]
> > In the current fallback path if both march neoverse-n2 and mcpu armv9-a
> are not supported
> > then it would fallback to armv8.6-a but this not correct as neoverse-n2 is
> not based on armv8.5-a
> >
> > The fallback march armv8.5-a kicks in (if supported) when neoverse-n2 and
> armv9-a are not supported.
> >
> 
> Can the two fallback mechanisms be combined? They seem very similar.

I will try to combine them in the next version.

Thanks,
Pavan.

> 
> >
> > [1] https://urldefense.proofpoint.com/v2/url?u=https-
> 3A__github.com_gcc-
> 2Dmirror_gcc_blob_615e25c82de97acc17ab438f88d6788cf7ffe1d6_gcc_confi
> g_arm_arm-2Dcpus.in-
> 23L306&d=DwIFaQ&c=nKjWec2b6R0mOyPaz7xtfQ&r=E3SgYMjtKCMVsB-
> fmvgGV3o-g_fjLhk5Pupi9ijohpc&m=-
> Xknjo5NapybFKTREn10YXl4HKVFwvwF7ZNL_2ks7_DxKC9Xynna3Ms2DLynVO
> Fh&s=o_Pt0fUjpeoar7QSgqshIXDxOZVUSNQYcCtRJWhNS8I&e=
> >
> >
> > > > Example
> > > >         mcpu = neoverse-n2
> > > >         march = armv9-a
> > > >         fallback_march = armv8.5-a
> > > >
> > > >         mcpu, march not supported
> > > >         machine_args = ['-march=armv8.5-a']
> > > >
> > > >         mcpu, march, fallback_march not supported
> > > >         least march supported = armv8-a
> > > >
> > > >         machine_args = ['-march=armv8-a']
> > > >
> > > > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> > > > ---
> > > >  config/arm/meson.build | 15 +++++++++++++--
> > > >  1 file changed, 13 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/config/arm/meson.build b/config/arm/meson.build
> > > > index 8c8cfccca0..2aaf78a81a 100644
> > > > --- a/config/arm/meson.build
> > > > +++ b/config/arm/meson.build
> > > > @@ -94,6 +94,7 @@ part_number_config_arm = {
> > > >      '0xd49': {
> > > >          'march': 'armv9-a',
> > > >          'march_features': ['sve2'],
> > > > +        'fallback_march': 'armv8.5-a',
> > > >          'mcpu': 'neoverse-n2',
> > > >          'flags': [
> > > >              ['RTE_MACHINE', '"neoverse-n2"'],
> > > > @@ -709,14 +710,14 @@ if update_flags
> > > >
> > > >      # probe supported archs and their features
> > > >      candidate_march = ''
> > > > +    supported_marchs = ['armv9-a', 'armv8.6-a', 'armv8.5-a', 'armv8.4-a',
> > > > +                        'armv8.3-a', 'armv8.2-a', 'armv8.1-a', 'armv8-a']
> > > >      if part_number_config.has_key('march')
> > > >          if part_number_config.get('force_march', false) or support_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']
> > > >              check_compiler_support = false
> > > >              foreach supported_march: supported_marchs
> > > >                  if supported_march == part_number_config['march']
> > > > @@ -733,6 +734,16 @@ if update_flags
> > > >          endif
> > > >
> > > >          if candidate_march != part_number_config['march']
> > > > +            if part_number_config.has_key('fallback_march') and not
> > > support_mcpu
> > > > +                fallback_march = part_number_config['fallback_march']
> > > > +                foreach supported_march: supported_marchs
> > > > +                    if (supported_march == fallback_march
> > > > +                        and cc.has_argument('-march=' + supported_march))
> > > > +                        candidate_march = supported_march
> > > > +                        break
> > > > +                    endif
> > > > +                endforeach
> > > > +            endif
> > > >              warning('Configuration march version is @0@, not supported.'
> > > >                      .format(part_number_config['march']))
> > > >              if candidate_march != ''
> > > > --
> > > > 2.25.1
> > > >
  

Patch

diff --git a/config/arm/meson.build b/config/arm/meson.build
index 8c8cfccca0..2aaf78a81a 100644
--- a/config/arm/meson.build
+++ b/config/arm/meson.build
@@ -94,6 +94,7 @@  part_number_config_arm = {
     '0xd49': {
         'march': 'armv9-a',
         'march_features': ['sve2'],
+        'fallback_march': 'armv8.5-a',
         'mcpu': 'neoverse-n2',
         'flags': [
             ['RTE_MACHINE', '"neoverse-n2"'],
@@ -709,14 +710,14 @@  if update_flags

     # probe supported archs and their features
     candidate_march = ''
+    supported_marchs = ['armv9-a', 'armv8.6-a', 'armv8.5-a', 'armv8.4-a',
+                        'armv8.3-a', 'armv8.2-a', 'armv8.1-a', 'armv8-a']
     if part_number_config.has_key('march')
         if part_number_config.get('force_march', false) or support_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']
             check_compiler_support = false
             foreach supported_march: supported_marchs
                 if supported_march == part_number_config['march']
@@ -733,6 +734,16 @@  if update_flags
         endif

         if candidate_march != part_number_config['march']
+            if part_number_config.has_key('fallback_march') and not support_mcpu
+                fallback_march = part_number_config['fallback_march']
+                foreach supported_march: supported_marchs
+                    if (supported_march == fallback_march
+                        and cc.has_argument('-march=' + supported_march))
+                        candidate_march = supported_march
+                        break
+                    endif
+                endforeach
+            endif
             warning('Configuration march version is @0@, not supported.'
                     .format(part_number_config['march']))
             if candidate_march != ''