#!/bin/sh
# $NetBSD: cpuflags.NetBSD,v 1.21 2002/04/11 11:14:31 abs Exp $

if [ -x /sbin/sysctl ] ;then
    SYSCTL=/sbin/sysctl
else
    SYSCTL=/usr/sbin/sysctl	# NetBSD 1.3
fi

hw_machine=`$SYSCTL -n hw.machine`
hw_machine_arch=`$SYSCTL -n hw.machine_arch`
hw_model=`$SYSCTL -n hw.model`

# We're almost certainly crosscompiling
if [ -n "$MACHINE" -a $hw_machine != "$MACHINE" ]; then
    echo
    exit
fi

case $hw_machine_arch in

    alpha)
	# cpu0 at mainbus0: ID 0 (primary), 21164A-0 (unknown ...
	if egrep -q '^cpu0.*21164A' /var/run/dmesg.boot 2>/dev/null ; then
	    FLAGS="-mcpu=21164a"
	fi ;;

    arm | arm32) case $hw_model in
	ARM610*)		FLAGS="-mcpu=arm610"		;; # risc pc
	ARM710*)		FLAGS="-mcpu=arm710"		;; # risc pc
	SA-110*)	
	    case $hw_machine in			 # arm32 split post 1.5
		cats|shark|hpcarm|netwinder)
		    FLAGS="-mcpu=strongarm110" ;;
		acorn32)
		    FLAGS="-march=armv3m -mtune=strongarm" ;;
		*)
		    # memorybus in strongarm risc pc machines cannot support
		    # certain strongarm instructions, but in 1.5 and earlier
		    # all strongarm machines are 'arm32', so uname and sysctl
		    # no use
		    if egrep -q 'ofbus0|footbridge0' /var/run/dmesg.boot \
							    2>/dev/null ; then
			FLAGS="-mcpu=strongarm110"		   # shark/cats
		    else
			FLAGS="-march=armv3m -mtune=strongarm"	   # risc pc
		    fi
	    esac ;;
	esac ;;

    i386) case $hw_model in
	*386-class*)	FLAGS='-march=i386'		;;
	*486-class*)	FLAGS='-march=i486'		;;
	*AMD\ K6*)	FLAGS='-march=k6'		;;
	*586-class*)	FLAGS='-march=pentium'		;;
	*686-class*)	FLAGS='-march=pentiumpro'	;;
    esac ;;

    m68k) case $hw_model in
	*\(68020\))		FLAGS='-m68020'			;; # Untested
	*\(68030\))		FLAGS='-m68030'			;; # Mac LC III
	*\(68040\))		FLAGS='-m68040'			;; # Untested
	*\(68060\))		FLAGS='-m68060'			;; # Untested
    esac ;;

    powerpc) case $hw_model in
	601\ *)		   	FLAGS='-mcpu=601'		;; # Untested
	602\ *)		   	FLAGS='-mcpu=602'		;; # Untested
	603\ *)		   	FLAGS='-mcpu=603'		;; # Untested
	603ev\ *)		FLAGS='-mcpu=603e'		;; # PM 4400
	604\ *)		   	FLAGS='-mcpu=604'		;; # Mac 8500
	604ev\ *)		FLAGS='-mcpu=604e'		;; # upgr B&W G3
	750\ *)		   	FLAGS='-mcpu=750'		;; # Untested
	740\ *)		   	FLAGS='-mcpu=750'		;; # Untested
	620\ *)		   	FLAGS='-mcpu=750'		;; # Untested
    esac ;;

    sparc | sparc64) case $hw_model in
	MB86900/1A*)		FLAGS='-mcpu=cypress'		;; # ss1+
	CY7C601*)		FLAGS='-mcpu=cypress'		;; # ss2
	W8601/8701*)		FLAGS='-mcpu=cypress'		;; # elc
	MB86904* | MB86907*)	FLAGS='-mcpu=supersparc'	;; # ss5 usparc
	TMS390S10*)		FLAGS='-mcpu=supersparc'	;; # classic  "
	TMS390Z50*)		FLAGS='-mcpu=supersparc'	;; # ss10/ss20
	RT620/625*)		FLAGS='-mcpu=supersparc'	;; # ss20 ross
	MB86930* | MB86934*)	FLAGS='-mcpu=sparclite'		;; # from gcc
	# under 1.5.1 -mcpu=ultrasparc chokes egcs-2.91.66 compiling perl
	SUNW,UltraSPARC*)	 FLAGS='-mcpu=v9'		;; # Ultra
    esac ;;

    vax) # No VAX specific gcc optimisations available
	NONE=1
	;;

esac

if [ -z "$FLAGS" -a -z "$NONE" ] ; then
    echo 'Unknown machine - please send details to abs@netbsd.org'	>&2
    echo "  hw.model        : '$hw_model'"				>&2
    echo "  hw.machine      : '$hw_machine'"				>&2
    echo "  hw.machine_arch : '$hw_machine_arch'"			>&2
fi

# Fixup flags for old gcc
if [ -n "$FLAGS" ]; then
    gcc_ver=`gcc -v 2>&1 | awk '/gcc version/ {sub("egcs-","");print $3}'`
    FLAGS=`awk -v "flags=$FLAGS" -v "gcc_ver=$gcc_ver" '
	{if (gcc_ver < $1){map[$2] = ""$3}}
	END{if (flags in map) {print map[flags]}else {print flags}}
	' <<EOD
2.90	-mcpu=21164a	
2.90	-march=i386		-mno-486
2.90	-march=i486		-m486
2.90	-march=pentium		-m486
2.90	-march=pentiumpro	-m486
2.90	-mcpu=supersparc	-msupersparc
2.90	-mcpu=sparclite		-msparclite
2.90	-mcpu=cypress		-mcypress
2.90	-mcpu=v9		-mv8
2.90	-mcpu=arm610		-m6
2.90	-mcpu=strongarm110	-m6
2.90	-mcpu=arm710		-m6
2.95	-march=k6		-march=pentium
EOD
`
fi

echo $FLAGS

exit 0
