# Copyright (C) 2012-2017 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# This is a target makefile fragment that attempts to get
# multilibs built for the range of CPU's, FPU's and ABI's that
# are relevant for the A-profile architecture.  It should
# not be used in conjunction with another make file fragment and
# assumes --with-arch, --with-cpu, --with-fpu, --with-float, --with-mode
# have their default values during the configure step.  We enforce
# this during the top-level configury.

# Arch and FPU variants to build libraries with

MULTI_ARCH_OPTS_A       = march=armv7-a/march=armv7ve/march=armv8-a
MULTI_ARCH_DIRS_A       = v7-a v7ve v8-a

MULTI_FPU_OPTS_A        = mfpu=vfpv3-d16/mfpu=neon/mfpu=vfpv4-d16/mfpu=neon-vfpv4/mfpu=neon-fp-armv8
MULTI_FPU_DIRS_A        = fpv3 simdv1 fpv4 simdvfpv4 simdv8


# Option combinations to build library with

# Default CPU/Arch (ARM is implicitly included because it uses the default
# multilib)
MULTILIB_REQUIRED      += mthumb

# ARMv7-A
MULTILIB_REQUIRED      += *march=armv7-a
MULTILIB_REQUIRED      += *march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=*
MULTILIB_REQUIRED      += *march=armv7-a/mfpu=neon/mfloat-abi=*

# ARMv7VE
MULTILIB_REQUIRED      += *march=armv7ve
MULTILIB_REQUIRED      += *march=armv7ve/mfpu=vfpv4-d16/mfloat-abi=*
MULTILIB_REQUIRED      += *march=armv7ve/mfpu=neon-vfpv4/mfloat-abi=*

# ARMv8-A
MULTILIB_REQUIRED      += *march=armv8-a
MULTILIB_REQUIRED      += *march=armv8-a/mfpu=neon-fp-armv8/mfloat-abi=*


# Matches

# CPU Matches
MULTILIB_MATCHES       += march?armv7-a=mcpu?marvell-pj4
MULTILIB_MATCHES       += march?armv7-a=mcpu?generic-armv7-a
MULTILIB_MATCHES       += march?armv7-a=mcpu?cortex-a8
MULTILIB_MATCHES       += march?armv7-a=mcpu?cortex-a9
MULTILIB_MATCHES       += march?armv7-a=mcpu?cortex-a5
MULTILIB_MATCHES       += march?armv7ve=mcpu?cortex-a7
MULTILIB_MATCHES       += march?armv7ve=mcpu?cortex-a15
MULTILIB_MATCHES       += march?armv7ve=mcpu?cortex-a12
MULTILIB_MATCHES       += march?armv7ve=mcpu?cortex-a17
MULTILIB_MATCHES       += march?armv7ve=mcpu?cortex-a15.cortex-a7
MULTILIB_MATCHES       += march?armv7ve=mcpu?cortex-a17.cortex-a7
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a32
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a35
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a53
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a57
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a57.cortex-a53
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a72
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a72.cortex-a53
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a73
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a73.cortex-a35
MULTILIB_MATCHES       += march?armv8-a=mcpu?cortex-a73.cortex-a53
MULTILIB_MATCHES       += march?armv8-a=mcpu?exynos-m1
MULTILIB_MATCHES       += march?armv8-a=mcpu?falkor
MULTILIB_MATCHES       += march?armv8-a=mcpu?qdf24xx
MULTILIB_MATCHES       += march?armv8-a=mcpu?xgene1

# Arch Matches
MULTILIB_MATCHES       += march?armv8-a=march?armv8-a+crc
MULTILIB_MATCHES       += march?armv8-a=march?armv8.1-a
MULTILIB_MATCHES       += march?armv8-a=march?armv8.1-a+crc
MULTILIB_MATCHES       += march?armv8-a=march?armv8.2-a
MULTILIB_MATCHES       += march?armv8-a=march?armv8.2-a+fp16

# FPU matches
MULTILIB_MATCHES       += mfpu?vfpv3-d16=mfpu?vfpv3
MULTILIB_MATCHES       += mfpu?vfpv3-d16=mfpu?vfpv3-fp16
MULTILIB_MATCHES       += mfpu?vfpv3-d16=mfpu?vfpv3-d16-fp16
MULTILIB_MATCHES       += mfpu?neon=mfpu?neon-fp16
MULTILIB_MATCHES       += mfpu?vfpv4-d16=mfpu?vfpv4
MULTILIB_MATCHES       += mfpu?vfpv4-d16=mfpu?fpv5-d16
MULTILIB_MATCHES       += mfpu?vfpv4-d16=mfpu?fp-armv8
MULTILIB_MATCHES       += mfpu?neon-fp-armv8=mfpu?crypto-neon-fp-armv8
MULTILIB_MATCHES       += mfpu?vfp=mfpu?vfpv2
MULTILIB_MATCHES       += mfpu?neon=mfpu?neon-vfpv3


# Map all requests for vfpv3 with a later CPU to vfpv3-d16 v7-a.
# So if new CPUs are added above at the newer architecture levels,
# do something to map them below here.
# We take the approach of mapping down to v7-a regardless of what
# the fp option is if the integer architecture brings things down.
# This applies to any similar combination at the v7ve and v8-a arch
# levels.

MULTILIB_REUSE	      += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv7ve/mfpu.vfpv3-d16/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv7ve/mfpu.vfpv3-d16/mfloat-abi.softfp
MULTILIB_REUSE	      += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.softfp
MULTILIB_REUSE	      += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.softfp


MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv7ve/mfpu.neon/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv7ve/mfpu.neon/mfloat-abi.softfp
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv8-a/mfpu.neon/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv8-a/mfpu.neon/mfloat-abi.softfp
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.softfp
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.hard=march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7-a/mfpu.neon/mfloat-abi.softfp=march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.softfp


MULTILIB_REUSE	      += march.armv7ve/mfpu.vfpv4-d16/mfloat-abi.hard=march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7ve/mfpu.vfpv4-d16/mfloat-abi.softfp=march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.softfp


MULTILIB_REUSE	      += march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.hard=march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.softfp=march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.softfp
MULTILIB_REUSE	      += march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.hard=march.armv7ve/mfpu.neon-fp-armv8/mfloat-abi.hard
MULTILIB_REUSE	      += march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.softfp=march.armv7ve/mfpu.neon-fp-armv8/mfloat-abi.softfp



# And again for mthumb.

MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv7ve/mfpu.vfpv3-d16/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv7ve/mfpu.vfpv3-d16/mfloat-abi.softfp
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.vfpv3-d16/mfloat-abi.softfp
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.vfpv3-d16/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.vfpv4-d16/mfloat-abi.softfp


MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv7ve/mfpu.neon/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv7ve/mfpu.neon/mfloat-abi.softfp
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.neon/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.neon/mfloat-abi.softfp
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.neon-vfpv4/mfloat-abi.softfp
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.hard=mthumb/march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7-a/mfpu.neon/mfloat-abi.softfp=mthumb/march.armv7-a/mfpu.neon-fp-armv8/mfloat-abi.softfp


MULTILIB_REUSE	      += mthumb/march.armv7ve/mfpu.vfpv4-d16/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7ve/mfpu.vfpv4-d16/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.vfpv4-d16/mfloat-abi.softfp


MULTILIB_REUSE	      += mthumb/march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.hard=mthumb/march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.softfp=mthumb/march.armv8-a/mfpu.neon-vfpv4/mfloat-abi.softfp
MULTILIB_REUSE	      += mthumb/march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.hard=mthumb/march.armv7ve/mfpu.neon-fp-armv8/mfloat-abi.hard
MULTILIB_REUSE	      += mthumb/march.armv7ve/mfpu.neon-vfpv4/mfloat-abi.softfp=mthumb/march.armv7ve/mfpu.neon-fp-armv8/mfloat-abi.softfp
