bsd.cpu.mk revision 204554
152400Sbillf# $FreeBSD: head/share/mk/bsd.cpu.mk 204554 2010-03-02 07:24:47Z imp $
252400Sbillf
352400Sbillf# Set default CPU compile flags and baseline CPUTYPE for each arch.  The
452400Sbillf# compile flags must support the minimum CPU type for each architecture but
552400Sbillf# may tune support for more advanced processors.
652400Sbillf
752400Sbillf.if !defined(CPUTYPE) || empty(CPUTYPE)
8186678Sdougb_CPUCFLAGS =
973651Sdougb. if ${MACHINE_ARCH} == "i386"
1052400SbillfMACHINE_CPU = i486
1152495Sbillf. elif ${MACHINE_ARCH} == "amd64"
1252400SbillfMACHINE_CPU = amd64 sse2 sse
1368507Sdougb. elif ${MACHINE_ARCH} == "ia64"
1452400SbillfMACHINE_CPU = itanium
1552400Sbillf. elif ${MACHINE_ARCH} == "powerpc"
1652533SbillfMACHINE_CPU = aim
1752400Sbillf. elif ${MACHINE_ARCH} == "sparc64"
18114501Sdougb. elif ${MACHINE_ARCH} == "arm"
1967949SdougbMACHINE_CPU = arm
2052400Sbillf. elif ${MACHINE_ARCH} == "mips"
2152400SbillfMACHINE_CPU = mips
2252400Sbillf. endif
2352400Sbillf.else
2452400Sbillf
2552400Sbillf# Handle aliases (not documented in make.conf to avoid user confusion
2652400Sbillf# between e.g. i586 and pentium)
2767949Sdougb
2891193Sdougb. if ${MACHINE_ARCH} == "i386"
2991193Sdougb.  if ${CPUTYPE} == "nocona"
30114501SdougbCPUTYPE = prescott
3152400Sbillf.  elif ${CPUTYPE} == "core" || ${CPUTYPE} == "core2"
3252400SbillfCPUTYPE = prescott
3352400Sbillf.  elif ${CPUTYPE} == "p4"
3452400SbillfCPUTYPE = pentium4
3552400Sbillf.  elif ${CPUTYPE} == "p4m"
36155309SrwatsonCPUTYPE = pentium4m
3767949Sdougb.  elif ${CPUTYPE} == "p3"
38158149SgordonCPUTYPE = pentium3
3952400Sbillf.  elif ${CPUTYPE} == "p3m"
4052400SbillfCPUTYPE = pentium3m
4152400Sbillf.  elif ${CPUTYPE} == "p-m"
4252400SbillfCPUTYPE = pentium-m
4352400Sbillf.  elif ${CPUTYPE} == "p2"
4452400SbillfCPUTYPE = pentium2
4552400Sbillf.  elif ${CPUTYPE} == "i686"
4667859SdougbCPUTYPE = pentiumpro
4767949Sdougb.  elif ${CPUTYPE} == "i586/mmx"
4852400SbillfCPUTYPE = pentium-mmx
4952400Sbillf.  elif ${CPUTYPE} == "i586"
5058910SalfredCPUTYPE = pentium
5158910Salfred.  elif ${CPUTYPE} == "opteron" || ${CPUTYPE} == "athlon64" || \
5258910Salfred     ${CPUTYPE} == "k8"
5367850SdougbCPUTYPE = athlon-mp
5467850Sdougb.  elif ${CPUTYPE} == "k7"
5567850SdougbCPUTYPE = athlon
5667850Sdougb.  endif
5767850Sdougb. elif ${MACHINE_ARCH} == "amd64"
5867850Sdougb.  if ${CPUTYPE} == "prescott" || ${CPUTYPE} == "core2"
5967850SdougbCPUTYPE = nocona
6067850Sdougb.  endif
6167850Sdougb. endif
6267850Sdougb
6367850Sdougb###############################################################################
6467850Sdougb# Logic to set up correct gcc optimization flag.  This must be included
6567949Sdougb# after /etc/make.conf so it can react to the local value of CPUTYPE
6667850Sdougb# defined therein.  Consult:
6767850Sdougb#	http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
6867850Sdougb#	http://gcc.gnu.org/onlinedocs/gcc/IA_002d64-Options.html
6967850Sdougb#	http://gcc.gnu.org/onlinedocs/gcc/RS_002f6000-and-PowerPC-Options.html
7067850Sdougb#	http://gcc.gnu.org/onlinedocs/gcc/MIPS-Options.html
7167850Sdougb#	http://gcc.gnu.org/onlinedocs/gcc/SPARC-Options.html
7267850Sdougb#	http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html
7367850Sdougb
7467859Sdougb. if ${MACHINE_ARCH} == "i386"
7567859Sdougb.  if ${CPUTYPE} == "crusoe"
7658910Salfred_CPUCFLAGS = -march=i686 -falign-functions=0 -falign-jumps=0 -falign-loops=0
7767850Sdougb.  elif ${CPUTYPE} == "k5"
7867850Sdougb_CPUCFLAGS = -march=pentium
7967850Sdougb.  else
8067850Sdougb_CPUCFLAGS = -march=${CPUTYPE}
8167850Sdougb.  endif # GCC on 'i386'
8267850Sdougb.  if ${CPUTYPE} == "crusoe"
8367859Sdougb_ICC_CPUCFLAGS = -tpp6 -xiM
8467850Sdougb.  elif ${CPUTYPE} == "athlon-mp" || ${CPUTYPE} == "athlon-xp" || \
8567859Sdougb    ${CPUTYPE} == "athlon-4"
8667850Sdougb_ICC_CPUCFLAGS = -tpp6 -xiMK
8767850Sdougb.  elif ${CPUTYPE} == "athlon-tbird" || ${CPUTYPE} == "athlon"
8867850Sdougb_ICC_CPUCFLAGS = -tpp6 -xiM
8967850Sdougb.  elif ${CPUTYPE} == "k6-3" || ${CPUTYPE} == "k6-2" || ${CPUTYPE} == "k6"
9067859Sdougb_ICC_CPUCFLAGS = -tpp6 -xi
9167850Sdougb.  elif ${CPUTYPE} == "k5"
9267850Sdougb_ICC_CPUCFLAGS = -tpp5
9367850Sdougb.  elif ${CPUTYPE} == "pentium4" || ${CPUTYPE} == "pentium4m"
9467850Sdougb_ICC_CPUCFLAGS = -tpp7 -xiMKW
9567850Sdougb.  elif ${CPUTYPE} == "pentium3" || ${CPUTYPE} == "pentium3m" || \
9667850Sdougb     ${CPUTYPE} == "pentium-m"
9767850Sdougb_ICC_CPUCFLAGS = -tpp6 -xiMK
9867850Sdougb.  elif ${CPUTYPE} == "pentium2" || ${CPUTYPE} == "pentiumpro"
9967850Sdougb_ICC_CPUCFLAGS = -tpp6 -xiM
10067850Sdougb.  elif ${CPUTYPE} == "pentium-mmx"
10167850Sdougb_ICC_CPUCFLAGS = -tpp5 -xM
10267850Sdougb.  elif ${CPUTYPE} == "pentium"
10367850Sdougb_ICC_CPUCFLAGS = -tpp5
10467850Sdougb.  else
10558910Salfred_ICC_CPUCFLAGS =
10658910Salfred.  endif # ICC on 'i386'
10758910Salfred. elif ${MACHINE_ARCH} == "amd64"
10858910Salfred_CPUCFLAGS = -march=${CPUTYPE}
10958910Salfred. elif ${MACHINE_ARCH} == "arm"
11058910Salfred.  if ${CPUTYPE} == "xscale"
11167850Sdougb#XXX: gcc doesn't seem to like -mcpu=xscale, and dies while rebuilding itself
11258910Salfred#_CPUCFLAGS = -mcpu=xscale
11377323Sdougb_CPUCFLAGS = -march=armv5te -D__XSCALE__
11477323Sdougb.  else
11567949Sdougb_CPUCFLAGS = -mcpu=${CPUTYPE}
116158149Sgordon.  endif
117158149Sgordon. elif ${MACHINE_ARCH} == "powerpc"
118158149Sgordon.  if ${CPUTYPE} == "e500"
119158149SgordonMACHINE_CPU = booke
120158149Sgordon_CPUCFLAGS = -Wa,-me500 -msoft-float
121158149Sgordon.  else
122158149Sgordon_CPUCFLAGS = -mcpu=${CPUTYPE} -mno-powerpc64
123158149Sgordon.  endif
124158149Sgordon. elif ${MACHINE_ARCH} == "mips"
125158149Sgordon.  if ${CPUTYPE} == "mips32"
126158149Sgordon_CPUCFLAGS = -march=mips32
127158149Sgordon.  elif ${CPUTYPE} == "mips32r2"
128158149Sgordon_CPUCFLAGS = -march=mips32r2
129158149Sgordon.  elif ${CPUTYPE} == "mips64"
130158149Sgordon_CPUCFLAGS = -march=mips64
131158149Sgordon.  elif ${CPUTYPE} == "mips64r2"
132158149Sgordon_CPUCFLAGS = -march=mips64r2
133158149Sgordon.  elif ${CPUTYPE} == "mips4kc"
13467850Sdougb_CPUCFLAGS = -march=4kc
13590564Sdougb.  elif ${CPUTYPE} == "mips24kc"
136109993Sdillon_CPUCFLAGS = -march=24kc
137109993Sdillon.  endif
138109993Sdillon. endif
139109993Sdillon
140109993Sdillon# Set up the list of CPU features based on the CPU type.  This is an
141110377Sdougb# unordered list to make it easy for client makefiles to test for the
142109993Sdillon# presence of a CPU feature.
143109993Sdillon
14467850Sdougb. if ${MACHINE_ARCH} == "i386"
14567850Sdougb.  if ${CPUTYPE} == "opteron" || ${CPUTYPE} == "athlon64"
146109993SdillonMACHINE_CPU = athlon-xp athlon k7 3dnow sse2 sse mmx k6 k5 i586 i486 i386
14767850Sdougb.  elif ${CPUTYPE} == "athlon-mp" || ${CPUTYPE} == "athlon-xp" || \
14891193Sdougb    ${CPUTYPE} == "athlon-4"
14967949SdougbMACHINE_CPU = athlon-xp athlon k7 3dnow sse mmx k6 k5 i586 i486 i386
15067949Sdougb.  elif ${CPUTYPE} == "athlon" || ${CPUTYPE} == "athlon-tbird"
15167949SdougbMACHINE_CPU = athlon k7 3dnow mmx k6 k5 i586 i486 i386
15267949Sdougb.  elif ${CPUTYPE} == "k6-3" || ${CPUTYPE} == "k6-2"
15367949SdougbMACHINE_CPU = 3dnow mmx k6 k5 i586 i486 i386
15468507Sdougb.  elif ${CPUTYPE} == "k6"
15567949SdougbMACHINE_CPU = mmx k6 k5 i586 i486 i386
15667949Sdougb.  elif ${CPUTYPE} == "k5"
15767949SdougbMACHINE_CPU = k5 i586 i486 i386
15867949Sdougb.  elif ${CPUTYPE} == "c3"
15967949SdougbMACHINE_CPU = 3dnow mmx i586 i486 i386
16067949Sdougb.  elif ${CPUTYPE} == "c3-2"
16167949SdougbMACHINE_CPU = sse mmx i586 i486 i386
16267949Sdougb.  elif ${CPUTYPE} == "c7"
16367949SdougbMACHINE_CPU = sse3 sse2 sse i686 mmx i586 i486 i386
16467949Sdougb.  elif ${CPUTYPE} == "prescott"
16567949SdougbMACHINE_CPU = sse3 sse2 sse i686 mmx i586 i486 i386
16667949Sdougb.  elif ${CPUTYPE} == "pentium4" || ${CPUTYPE} == "pentium4m" || ${CPUTYPE} == "pentium-m"
16767850SdougbMACHINE_CPU = sse2 sse i686 mmx i586 i486 i386
16867859Sdougb.  elif ${CPUTYPE} == "pentium3" || ${CPUTYPE} == "pentium3m"
16967850SdougbMACHINE_CPU = sse i686 mmx i586 i486 i386
17067850Sdougb.  elif ${CPUTYPE} == "pentium2"
17167850SdougbMACHINE_CPU = i686 mmx i586 i486 i386
17267850Sdougb.  elif ${CPUTYPE} == "pentiumpro"
17377326SdougbMACHINE_CPU = i686 i586 i486 i386
174109993Sdillon.  elif ${CPUTYPE} == "pentium-mmx"
17567850SdougbMACHINE_CPU = mmx i586 i486 i386
17667850Sdougb.  elif ${CPUTYPE} == "pentium"
17767850SdougbMACHINE_CPU = i586 i486 i386
17867850Sdougb.  elif ${CPUTYPE} == "i486"
17967850SdougbMACHINE_CPU = i486 i386
18067859Sdougb.  elif ${CPUTYPE} == "i386"
18167859SdougbMACHINE_CPU = i386
18267859Sdougb.  endif
18367850Sdougb. elif ${MACHINE_ARCH} == "amd64"
18467850Sdougb.  if ${CPUTYPE} == "opteron" || ${CPUTYPE} == "athlon64" || ${CPUTYPE} == "k8"
18567850SdougbMACHINE_CPU = k8 3dnow
18667850Sdougb.  elif ${CPUTYPE} == "nocona"
18767850SdougbMACHINE_CPU = sse3
18867850Sdougb.  endif
18967850SdougbMACHINE_CPU += amd64 sse2 sse mmx
19067850Sdougb. elif ${MACHINE_ARCH} == "ia64"
19167850Sdougb.  if ${CPUTYPE} == "itanium"
19267850SdougbMACHINE_CPU = itanium
19367850Sdougb.  endif
19467850Sdougb. endif
19567850Sdougb.endif
19667850Sdougb
19767850Sdougb.if ${MACHINE_ARCH} == "arm" && defined(TARGET_BIG_ENDIAN)
19867850SdougbCFLAGS += -mbig-endian
19967850SdougbLDFLAGS += -mbig-endian
20067850SdougbLD += -EB
20167850Sdougb.endif
20267850Sdougb
20367850Sdougb.if ${MACHINE_ARCH} == "mips" 
20467850Sdougb. if defined(TARGET_BIG_ENDIAN)
20567850SdougbCFLAGS += -EB
20667850SdougbLD += -EB
20767850Sdougb. else
20867850SdougbCFLAGS += -EL
20967850SdougbLD += -EL
21067850Sdougb. endif
21167850SdougbCFLAGS += -msoft-float -G0 -mabicalls
21267850Sdougb.endif
21367850Sdougb
21467850Sdougb# NB: COPTFLAGS is handled in /usr/src/sys/conf/kern.pre.mk
21567850Sdougb
21667850Sdougb.if !defined(NO_CPU_CFLAGS)
21767850Sdougb. if ${CC} == "icc"
21867850SdougbCFLAGS += ${_ICC_CPUCFLAGS}
21967850Sdougb. else
22067850SdougbCFLAGS += ${_CPUCFLAGS}
22167850Sdougb. endif
22267850Sdougb.endif
22367850Sdougb