# Multilibs for SourceryG++ arm-none-eabi

MULTILIB_OPTIONS     = mthumb
MULTILIB_DIRNAMES    = t
MULTILIB_EXCEPTIONS  = 
MULTILIB_MATCHES     =
MULTILIB_ALIASES     =

MULTILIB_OPTIONS      += march=armv7/march=armv7-a/march=armv5te/march=armv6-m
MULTILIB_DIRNAMES     += v7 v7a v5te v6m
MULTILIB_MATCHES      += march?armv7-a=march?armv7a
MULTILIB_MATCHES      += march?armv7=march?armv7r
MULTILIB_MATCHES      += march?armv7=march?armv7m
MULTILIB_MATCHES      += march?armv7=march?armv7-r
MULTILIB_MATCHES      += march?armv7=march?armv7-m
MULTILIB_MATCHES      += march?armv7=march?armv7e-m
MULTILIB_MATCHES      += march?armv7-a=mcpu?cortex-a9
MULTILIB_MATCHES      += march?armv7-a=mcpu?cortex-a8
MULTILIB_MATCHES      += march?armv7-a=mcpu?cortex-a5
MULTILIB_MATCHES      += march?armv7=mcpu?cortex-r4
MULTILIB_MATCHES      += march?armv7=mcpu?cortex-r4f
MULTILIB_MATCHES      += march?armv7=mcpu?cortex-r5
MULTILIB_MATCHES      += march?armv7=mcpu?cortex-m4
MULTILIB_MATCHES      += march?armv7=mcpu?cortex-m3
MULTILIB_MATCHES      += march?armv6-m=mcpu?cortex-m1
MULTILIB_MATCHES      += march?armv6-m=mcpu?cortex-m0
MULTILIB_MATCHES      += march?armv6-m=march?armv6s-m
MULTILIB_MATCHES      += march?armv5te=march?armv6
MULTILIB_MATCHES      += march?armv5te=march?armv6j
MULTILIB_MATCHES      += march?armv5te=march?armv6k
MULTILIB_MATCHES      += march?armv5te=march?armv6z
MULTILIB_MATCHES      += march?armv5te=march?armv6zk
MULTILIB_MATCHES      += march?armv5te=march?armv6t2
MULTILIB_MATCHES      += march?armv5te=march?iwmmxt
MULTILIB_MATCHES      += march?armv5te=march?iwmmxt2
MULTILIB_MATCHES      += march?armv5te=mcpu?arm9e
MULTILIB_MATCHES      += march?armv5te=mcpu?arm946e-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm966e-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm968e-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm10e
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1020e
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1022e
MULTILIB_MATCHES      += march?armv5te=mcpu?xscale
MULTILIB_MATCHES      += march?armv5te=mcpu?iwmmxt
MULTILIB_MATCHES      += march?armv5te=mcpu?iwmmxt2
MULTILIB_MATCHES      += march?armv5te=mcpu?marvell-f
MULTILIB_MATCHES      += march?armv5te=mcpu?arm926ej-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1026ej-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1136j-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1136jf-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1176jz-s
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1176jzf-s
MULTILIB_MATCHES      += march?armv5te=mcpu?mpcorenovfp
MULTILIB_MATCHES      += march?armv5te=mcpu?mpcore
MULTILIB_MATCHES      += march?armv5te=mcpu?arm1156t2-s

MULTILIB_OPTIONS      += mfloat-abi=softfp/mfloat-abi=hard
MULTILIB_DIRNAMES     += softfp hard
MULTILIB_MATCHES      += mfloat-abi?hard=mhard-float

MULTILIB_OPTIONS      += mfpu=neon
MULTILIB_DIRNAMES     += neon
MULTILIB_EXCEPTIONS   += mfpu=neon
MULTILIB_MATCHES      += mfpu?neon=mfpu?neon-fp16
MULTILIB_MATCHES      += mfpu?neon=mfpu?neon-vfpv4

MULTILIB_ALIASES      += mthumb=mthumb/mfpu?neon
MULTILIB_ALIASES      += mthumb=mthumb/march?armv5te/mfpu?neon
MULTILIB_ALIASES      += mbig-endian=mthumb/mfpu?neon/mbig-endian
#MULTILIB_ALIASES      += mfloat-abi?softfp=mthumb/mfloat-abi?softfp/mfpu?neon
#MULTILIB_ALIASES      += mfloat-abi?softfp=mfloat-abi?softfp/mfpu?neon
#MULTILIB_ALIASES      += mfloat-abi?softfp/mbig-endian=mfloat-abi?softfp/mfpu?neon/mbig-endian
#MULTILIB_ALIASES      += mfloat-abi?softfp/mbig-endian=mthumb/mfloat-abi?softfp/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfpu?neon
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += march?armv7-a/mfloat-abi?softfp/mfpu?neon=mthumb/march?armv7-a/mfloat-abi?softfp/mfpu?neon
MULTILIB_ALIASES      += march?armv7-a/mfloat-abi?hard/mfpu?neon=mthumb/march?armv7-a/mfloat-abi?hard/mfpu?neon

MULTILIB_OPTIONS      += mbig-endian
MULTILIB_DIRNAMES     += be
MULTILIB_ALIASES      += mbig-endian=mfpu?neon/mbig-endian

# ARMv6-M  does not have ARM mode.
MULTILIB_EXCEPTIONS   += march=armv6-m

# Some ARMv7 variants have ARM mode.  Use the ARM libraries.
MULTILIB_EXCEPTIONS   += march=armv7 march=armv7/*
MULTILIB_ALIASES      += mbig-endian=march?armv7/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp=march?armv7/mfloat-abi?softfp
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp=march?armv7/mfloat-abi?softfp/mfpu?neon
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7/mfloat-abi?softfp/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7/mfloat-abi?softfp/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mbig-endian=march?armv7/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfloat-abi?softfp/mfpu?neon
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfpu?neon
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7/mfloat-abi?softfp/mfpu?neon/mbig-endian

# ARMv7-A is specially useful used with VFPv3 (enabled by NEON). Rest of the cases behaves as ARMv7.
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a
MULTILIB_ALIASES      += mbig-endian=march?armv7-a/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7-a/mfloat-abi?softfp/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv7-a/mfloat-abi?softfp/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfloat-abi?softfp
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mfloat-abi?softfp/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfloat-abi?softfp             
MULTILIB_ALIASES      += march?armv5te=march?armv7-a
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp=march?armv7-a/mfloat-abi?softfp
MULTILIB_ALIASES      += march?armv5te=march?armv7-a/mfpu?neon
MULTILIB_ALIASES      += mbig-endian=march?armv7-a/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7-a/mfloat-abi?softfp/mfpu?neon/mbig-endian

# ARMv5T thumb uses the ARMv5T ARM libraries (with or without VFP).
MULTILIB_ALIASES      += mthumb=mthumb/march?armv5te
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp=mthumb/march?armv5te/mfloat-abi?softfp
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp=march?armv5te/mfloat-abi?softfp/mfpu?neon
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp=mthumb/march?armv5te/mfloat-abi?softfp/mfpu?neon
MULTILIB_ALIASES      += march?armv5te=march?armv5te/mfpu?neon
MULTILIB_ALIASES      += mbig-endian=march?armv5te/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=march?armv5te/mfloat-abi?softfp/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mbig-endian=mthumb/march?armv5te/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=mthumb/march?armv5te/mfloat-abi?softfp/mfpu?neon/mbig-endian

# ARMv6-M and VFP are incompatible.
# FIXME:  The compiler should probably error.
MULTILIB_EXCEPTIONS   += *march=armv6-m/mfloat-abi=softfp
MULTILIB_ALIASES      += mthumb/march?armv6-m=mthumb/march?armv6-m/mfpu?neon
MULTILIB_EXCEPTIONS   += march=armv6-m*mfpu=neon
MULTILIB_EXCEPTIONS   += mthumb/march=armv6-m/mfloat-abi=softfp/mfpu=neon

# ARMv4t VFP isn't really supported, so use the soft-float libraries.
MULTILIB_EXCEPTIONS   += mfloat-abi?softfp
MULTILIB_EXCEPTIONS   += mfloat-abi?softfp/mfpu?neon
MULTILIB_ALIASES      += mthumb=mthumb/mfloat-abi?softfp
MULTILIB_ALIASES      += mthumb=mthumb/mfloat-abi?softfp/mfpu?neon

MULTILIB_ALIASES      += mbig-endian=mfloat-abi?softfp/mbig-endian
MULTILIB_ALIASES      += mbig-endian=mfloat-abi?softfp/mfpu?neon/mbig-endian
MULTILIB_ALIASES      += mbig-endian=mthumb/mfloat-abi?softfp/mbig-endian
MULTILIB_ALIASES      += mbig-endian=mthumb/mfloat-abi?softfp/mfpu?neon/mbig-endian

# We don't have a big-endian ARMv6-M compatible multilibs.
MULTILIB_EXCEPTIONS   += *march=armv6-m*mbig-endian

# Use the generic libraries for big-endian ARMv5T
MULTILIB_ALIASES      += mbig-endian=march?armv5te/mbig-endian
MULTILIB_ALIASES      += mbig-endian=mfloat-abi?softfp/mbig-endian
MULTILIB_ALIASES      += mbig-endian=mthumb/march?armv5te/mbig-endian
MULTILIB_ALIASES      += march?armv5te/mfloat-abi?softfp/mbig-endian=mthumb/march?armv5te/mfloat-abi?softfp/mbig-endian

# Use ARM libraries for big-endian Thumb.
MULTILIB_ALIASES      += mbig-endian=mthumb/mbig-endian

# Don't bother with big-endian Thumb-2 VFP.  Use the soft-float libraries
# for now.
MULTILIB_ALIASES      += mthumb/march?armv7/mbig-endian=mthumb/march?armv7/mfloat-abi?softfp/mbig-endian

# The only -mfloat-abi=hard libraries provided are for little-endian
# v7-A NEON.
MULTILIB_EXCEPTIONS   += mfloat-abi=hard*
MULTILIB_EXCEPTIONS   += *march=armv5te*mfloat-abi=hard*
MULTILIB_EXCEPTIONS   += *march=armv7/*mfloat-abi=hard*
MULTILIB_EXCEPTIONS   += *march=armv6-m*mfloat-abi=hard*
MULTILIB_EXCEPTIONS   += mthumb/mfloat-abi=hard*
MULTILIB_EXCEPTIONS   += *mfloat-abi=hard*mbig-endian
MULTILIB_EXCEPTIONS   += *mfloat-abi=hard

# FIXME: We need a sane way of doing this.
# This isn't really a multilib, it's a hack to add an extra option
# to the v7-m multilib.
MULTILIB_OPTIONS      += mfix-cortex-m3-ldrd
MULTILIB_DIRNAMES     += broken_ldrd

MULTILIB_EXCEPTIONS   += mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += mthumb/mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *march=armv6-m*mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *march=armv7-a*mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *mcpu=*mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *mbig-endian*mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *mfloat-abi=softfp*mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *march=armv5te*mfix-cortex-m3-ldrd
MULTILIB_EXCEPTIONS   += *mfpu=neon*mfix-cortex-m3-ldrd

MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfix-cortex-m3-ldrd
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7/mfpu?neon/mfix-cortex-m3-ldrd
MULTILIB_ALIASES      += mthumb/march?armv7/mfix-cortex-m3-ldrd=mthumb/march?armv7-a/mfpu?neon/mfix-cortex-m3-ldrd

# As of at least 4.2, gcc passes the wrong -L options if some multilibs are
# omitted from MULTILIB_OSDIRNAMES
MULTILIB_OSDIRNAMES    = mthumb=!thumb
MULTILIB_OSDIRNAMES   += mbig-endian=!be
MULTILIB_OSDIRNAMES   += march.armv5te=!armv5te
MULTILIB_OSDIRNAMES   += march.armv5te/mfloat-abi.softfp=!vfp
MULTILIB_OSDIRNAMES   += march.armv5te/mfloat-abi.softfp/mbig-endian=!vfp-be
MULTILIB_OSDIRNAMES   += mthumb/march.armv7/mfix-cortex-m3-ldrd=!thumb2
MULTILIB_OSDIRNAMES   += march.armv7-a/mfloat-abi.softfp/mfpu.neon=!armv7-a-neon
MULTILIB_OSDIRNAMES   += march.armv7-a/mfloat-abi.hard/mfpu.neon=!armv7-a-hard
MULTILIB_OSDIRNAMES   += mthumb/march.armv7/mbig-endian=!thumb2-be
MULTILIB_OSDIRNAMES   += mthumb/march.armv6-m=!armv6-m
