Rewrite bsd.cpu.gcc50.mk (new cpus types; i386 removed)
authorJohn Marino <draco@marino.st>
Fri, 4 Mar 2016 09:35:13 +0000 (10:35 +0100)
committerJohn Marino <draco@marino.st>
Fri, 4 Mar 2016 10:02:03 +0000 (11:02 +0100)
The bsd.cpu.gcc50.mk should have been reworked when gcc50 came into
base.  The gcc47 version was such an unmaintainable mess (despite putting
a lot of time into it) that the gcc50 version was just copied from it as
a "good enough" solution that required work later.  It's time to pay the
piper.  I've almost rewritten it from scratch with a goal of comprehension
and maintainability.

- All 32-bit architectures were removed
- CPU types are formally defined per architecture.  If somebody tries to
  define CPUTYPE to an unrecognized value, the native march flag will be
  set with generic features for that architecture.  It will not propagate
  values that gcc50 doesn't understand (as it did previously)
- Support for several new cpus have been added.
- For x86_64 (the only arch currently supported on DF), the recognized
  CPUTYPE values are:
    * athlon64       (aka k8, opteron, athlon-fx)
    * athlon64-sse3  (aka k8-sse3, opteron-sse3)
    * barcelona      (aka amdfam10)
    * bdver(1|2|3|4)
    * bonnell
    * broadwell
    * btver(1|2)
    * core2
    * haswell
    * ivybridge
    * knl
    * nocona
    * nehalem
    * sandybridge
    * silvermont
    * skylake
    * skylake-avx512
    * westmere
    * znver1
- The method for defining CPU features was reworked.  The new method
  removes a ton of repetition by allowing CPU features to be build on
  other CPUs.  It's more readable and easy to add new ones.  The trade-off
  is that when CPUTYPE is defined to a legal value, the mk file will
  define features for all CPUs internal (OTOH, condition chain is gone).
- CPU feature has been made fully complete based on GCC 5.3 documention
- Adding new architectures will be easy using x86_64 as a template
- General makefile improvements were made

When CPUTYPE is not defined (which is the default), this version of the
makefile is functionally identical to the previous versions.  Most of the
improvements are only executed when CPUTYPE type is defined in arguments
or /etc/make.conf

share/mk/bsd.cpu.gcc50.mk

index 839c92c..79ca278 100644 (file)
 # compile flags must support the minimum CPU type for each architecture but
 # may tune support for more advanced processors.
 
+generic_x86_64=        x86_64 mmx sse sse2
+
 .if !defined(CPUTYPE) || empty(CPUTYPE) || ${CPUTYPE} == "native"
 
-. if defined(CPUTYPE) && !empty(CPUTYPE) && ${CPUTYPE} == "native"
-_CPUCFLAGS = -march=native
+. if defined(CPUTYPE) && ${CPUTYPE:Mnative}
+_CPUCFLAGS=    -march=native
 . else
-_CPUCFLAGS =
+_CPUCFLAGS=
 . endif
 
-. if ${MACHINE_ARCH} == "i386"
-MACHINE_CPU = i486 i386
-. elif ${MACHINE_ARCH} == "x86_64"
-MACHINE_CPU = x86_64 sse2 sse mmx
-. endif
+MACHINE_CPU=   ${generic_${MACHINE_ARCH}}
 
 .else
 
-_CPUCFLAGS_FIXUP =
-
-# Old CPUTYPE compat shim
-. if ${CPUTYPE} == "i586" \
-  || ${CPUTYPE} == "k5"
-CPUTYPE = pentium
-. elif ${CPUTYPE} == "i586/mmx"
-CPUTYPE = pentium-mmx
-. elif ${CPUTYPE} == "p2"
-CPUTYPE = pentium2
-. elif ${CPUTYPE} == "pentium3m" \
-    || ${CPUTYPE} == "p3m" \
-    || ${CPUTYPE} == "p3" \
-    || ${CPUTYPE} == "c3-2"
-CPUTYPE = pentium3
-. elif ${CPUTYPE} == "pentium4m" \
-    || ${CPUTYPE} == "pentium-m" \
-    || ${CPUTYPE} == "p-m" \
-    || ${CPUTYPE} == "p4"\
-    || ${CPUTYPE} == "p4m"
-CPUTYPE = pentium4
-. elif ${CPUTYPE} == "crusoe"
-CPUTYPE = pentiumpro
-_CPUCFLAGS_FIXUP = -falign-functions=0 -falign-jumps=0 -falign-loops=0
-. elif ${CPUTYPE} == "i686"
-CPUTYPE = pentiumpro
-. elif ${CPUTYPE} == "k6-2"
-CPUTYPE = k6-3
-. elif ${CPUTYPE} == "k7" \
-    || ${CPUTYPE} == "athlon-tbird"
-CPUTYPE = athlon
-. elif ${CPUTYPE} == "athlon-mp" \
-    || ${CPUTYPE} == "athlon-4"
-CPUTYPE = athlon-xp
-. elif ${CPUTYPE} == "k8" \
-    || ${CPUTYPE} == "opteron" \
-    || ${CPUTYPE} == "athlon-fx"
-CPUTYPE = athlon64
+###############################################################################
+# Logic to set up correct gcc optimization flag.  This must be included
+# after /etc/make.conf so it can react to the local value of CPUTYPE
+# defined therein.  Consult:
+#      https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/x86-Options.html
+###############################################################################
+
+# Some GCC cpu-types have aliases, rename them to a single identifier
+# If the value for cpu-type is not recognized, throw it away and use -native
+
+. if ${CPUTYPE} == "k8" \
+  || ${CPUTYPE} == "opteron" \
+  || ${CPUTYPE} == "athlon-fx"
+CT2=   athlon64
 . elif ${CPUTYPE} == "k8-sse3" \
     || ${CPUTYPE} == "opteron-sse3"
-CPUTYPE = athlon64-sse3
+CT2=   athlon64-sse3
 . elif ${CPUTYPE} == "amdfam10"
-CPUTYPE = barcelona
-. elif ${CPUTYPE} == "c3"
-CPUTYPE = winchip2
-. elif ${CPUTYPE} == "core"
-CPUTYPE = nocona
-. elif ${CPUTYPE} == "corei7-avx" \
-    || ${CPUTYPE} == "corei7-avx-i" \
-    || ${CPUTYPE} == "corei7-avx2"
-CPUTYPE = corei7
-. elif ${CPUTYPE} == "atom"
-CPUTYPE = core2
-. elif ${CPUTYPE} == "bdver2"
-CPUTYPE = bdver1
-. elif ${CPUTYPE} == "btver1"
-CPUTYPE = barcelona
+CT2=   barcelona
+. else
+CT2=   ${CPUTYPE}
 . endif
 
-###############################################################################
-# Logic to set up correct gcc optimization flag.  This must be included
-# after /etc/make.conf so it can react to the local value of CPUTYPE
-# defined therein.  Consult:
-#      http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86-64-Options.html
+known_x86_64=  athlon64 \
+               athlon64-sse3 \
+               barcelona \
+               bdver1 bdver2 bdver3 bdver4 \
+               bonnell \
+               broadwell \
+               btver1 btver2 \
+               core2 \
+               haswell \
+               ivybridge \
+               knl \
+               nocona \
+               nehalem \
+               sandybridge \
+               silvermont \
+               skylake \
+               skylake-avx512 \
+               westmere \
+               znver1
 
-_CPUCFLAGS = -march=${CPUTYPE} ${_CPUCFLAGS_FIXUP}
+. if defined(known_${MACHINE_ARCH}) && \
+     !empty(known_${MACHINE_ARCH}:M${CT2})             # CID: Check CPUTYPE
 
 # Set up the list of CPU features based on the CPU type.  This is an
 # unordered list to make it easy for client makefiles to test for the
 # presence of a CPU feature.
 
-. if ${MACHINE_ARCH} == "i386"
-.  if ${CPUTYPE} == "bdver1"
-MACHINE_CPU = abm 3dnow mmx sse4.2 sse4.1 sse3 sse2 sse \
-       athlon-xp athlon k7 k6 k5 i586
-.  elif ${CPUTYPE} == "barcelona"
-MACHINE_CPU = abm 3dnow mmx sse4a sse3 sse2 sse \
-       athlon-xp athlon k7 k6 k5 i586
-.  elif ${CPUTYPE} == "athlon64-sse3"
-MACHINE_CPU = 3dnow mmx sse3 sse2 sse athlon-xp athlon k7 k6 k5 i586
-.  elif ${CPUTYPE} == "athlon64"
-MACHINE_CPU = 3dnow mmx sse2 sse athlon-xp athlon k7 k6 k5 i586
-.  elif ${CPUTYPE} == "athlon-xp"
-MACHINE_CPU = 3dnow mmx sse athlon-xp athlon k7 k6 k5 i586
-.  elif ${CPUTYPE} == "athlon"
-MACHINE_CPU = 3dnow mmx athlon k7 k6 k5 i586
-.  elif ${CPUTYPE} == "k6-3"
-MACHINE_CPU = 3dnow mmx k6 k5 i586
-.  elif ${CPUTYPE} == "k6"
-MACHINE_CPU = mmx k6 k5 i586
-.  elif ${CPUTYPE} == "geode"
-MACHINE_CPU = 3dnow mmx i686 i586
-.  elif ${CPUTYPE} == "corei7"
-MACHINE_CPU = sse4.2 sse4.1 ssse3 sse3 sse2 sse mmx i686 i586
-.  elif ${CPUTYPE} == "core2"
-MACHINE_CPU = ssse3 sse3 sse2 sse mmx i686 i586
-.  elif ${CPUTYPE} == "nocona"
-MACHINE_CPU = sse3 sse2 sse mmx i686 i586
-.  elif ${CPUTYPE} == "prescott"
-MACHINE_CPU = sse3 sse2 sse mmx i686 i586
-.  elif ${CPUTYPE} == "pentium4"
-MACHINE_CPU = sse2 sse mmx i686 i586
-.  elif ${CPUTYPE} == "pentium3"
-MACHINE_CPU = sse mmx i686 i586
-.  elif ${CPUTYPE} == "pentium2"
-MACHINE_CPU = mmx i686 i586
-.  elif ${CPUTYPE} == "pentiumpro"
-MACHINE_CPU = i686 i586
-.  elif ${CPUTYPE} == "winchip2"
-MACHINE_CPU = 3dnow mmx
-.  elif ${CPUTYPE} == "winchip-c6"
-MACHINE_CPU = mmx
-.  elif ${CPUTYPE} == "pentium-mmx"
-MACHINE_CPU = mmx i586
-.  elif ${CPUTYPE} == "pentium"
-MACHINE_CPU = i586
-.  endif
-MACHINE_CPU += i386 i486
-. elif ${MACHINE_ARCH} == "x86_64"
-.  if ${CPUTYPE} == "bdver1"
-MACHINE_CPU = k8 abm 3dnow sse4.2 sse4.1 sse3
-.  elif ${CPUTYPE} == "barcelona"
-MACHINE_CPU = k8 abm 3dnow sse4a sse3
-.  elif ${CPUTYPE} == "athlon64-sse3"
-MACHINE_CPU = k8 3dnow sse3
-.  elif ${CPUTYPE} == "athlon64"
-MACHINE_CPU = k8 3dnow
-.  elif ${CPUTYPE} == "corei7"
-MACHINE_CPU = sse4.2 sse4.1 ssse3 sse3
-.  elif ${CPUTYPE} == "core2"
-MACHINE_CPU = ssse3 sse3
-.  elif ${CPUTYPE} == "nocona"
-MACHINE_CPU = sse3
-.  endif
-MACHINE_CPU += sse2 sse mmx x86_64
-. endif
+.  if ${MACHINE_ARCH} == "x86_64"
+C_nocona=      ${generic_x86_64} sse3
+C_core2=       ${C_nocona} ssse3
+C_nehalem=     ${C_core2} sse41 sse42 popcnt
+C_westmere=    ${C_nehalem} aes pclmul
+C_sandybridge= ${C_westmere} avx
+C_ivybridge=   ${C_sandybridge} fsgsbase rdrnd f16c
+C_haswell=     ${C_ivybridge} movbe avx2 fma bmi bmi2
+C_broadwell=   ${C_haswell} rdseed adcx prefetchw
+C_skylake=     ${C_broadwell} xsavec xsaves clflushop
+C_knl=         ${C_broadwell} avx512f avx512pf avx512er avx512cd
+C_bonnell=     ${C_core2} movbe
+C_silvermont=  ${C_westmere} movbe rdrnd
+C_skylakeavx512=${C_skylake} pku avx512f avx512vl avx512bw avx512dq avx512cd
+C_athlon64=    ${generic_x86_64} 3dnow
+C_athlon64sse3=        ${C_athlon64} sse3
+C_barcelona=   ${C_athlon64sse3} sse4a abm
+C_bdver1=      ${C_core2} sse4a sse41 sse42 abm fma4 avx xop lwp aes \
+               pclmul cx16
+C_bdver2=      ${C_bdver1} bmi f16c fma tbm
+C_bdver3=      ${C_bdver2} fsgsbase
+C_bdver4=      ${C_bdver3} bmi2 avx2 movbe
+C_znver1=      ${C_core2} bmi bmi2 f16c fma fsgsbase avx avx2 adcx rdseed \
+               mwaitx sha clzero aes pclmul cx16 movbe sse4a sse41 sse42 \
+               abm xsavec xsaves clflushop popcnt
+C_btver1=      ${C_barcelona} cx16
+C_btver2=      ${C_btver1} movbe f16c bmi avx pclmul aes sse41 sse42
+
+.  endif       # end of x86_64 feature list
+
+_CPUCFLAGS=    -march=${CT2}
+MACHINE_CPU=   ${C_${CT2:S|-||}}
+
+. else                                                 # CID: Check CPUTYPE
+
+# CPUTYPE was defined and was not empty, but the value does not match known
+# CPU types of the defined MACHINE_ARCH.  Set -march to native and define
+# generic features based on MACHINE_ARCH
+
+_CPUCFLAGS=    -march=native
+MACHINE_CPU=   ${generic_${MACHINE_ARCH}}
+
+. endif                                                        # CID: Check CPUTYPE
 
 .endif