[Freeswitch-svn] [commit] r6074 - freeswitch/trunk/scripts/contrib/trixter

Freeswitch SVN trixter at freeswitch.org
Sun Oct 28 11:04:44 EDT 2007


Author: trixter
Date: Sun Oct 28 11:04:43 2007
New Revision: 6074

Added:
   freeswitch/trunk/scripts/contrib/trixter/gcccpuopt   (contents, props changed)

Log:
script (not written by me, read comments) that on at least x86 
linux|FBSD will tell you the best options for optimization based on your 
*installed* compiler and will inform you that newer compilers may 
provide better options



Added: freeswitch/trunk/scripts/contrib/trixter/gcccpuopt
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/trixter/gcccpuopt	Sun Oct 28 11:04:43 2007
@@ -0,0 +1,257 @@
+#!/bin/sh
+
+# Print the gcc cpu specific options appropriate for the current CPU
+
+# Author:
+#    http://www.pixelbeat.org/
+# Notes:
+#    This script currently supports Linux,FreeBSD
+#    This script is x86 (32 bit) specific
+#    It should work on any gcc >= 2.95 at least
+#    It only returns CPU specific options. You probably also want -03 etc.
+# Changes:
+#    V0.1, 12 Mar 2003, Initial release
+#    V0.2, 01 Jun 2005, Added support for 3.2>=gcc<=4.0
+#    V0.3, 03 Jun 2005, Added support for pentium-m
+#    V0.4, 03 Jun 2005, Fix silly bugs
+#    V0.5, 07 Jun 2005, Clarify/Simplify confusing floating point expr usage
+#                       Print warning when CPU only supported on a newer gcc
+#    V0.6, 15 Dec 2006, Added support for Intel Core and Core 2 processors
+#                       Added support for 4.1>=gcc<=4.3
+#                       Added support for gcc -msse3 option
+#                       Added support for new gcc -march=native option
+#    V0.7, 18 Dec 2006, Changes from Conor McDermottroe
+#                       Added support for FreeBSD
+#                       Remove bash specific constructs
+#                       Better error handling
+#    V0.8, 19 Dec 2006, Give warnings and 32 bit -march on 64 bit platforms.
+#                       Previously it just gave an invalid blank -march.
+#                       Reported and tested by Ewan Oughton.
+#    V0.9, 30 Apr 2007, Give error if compiler not present.
+#                       Warn about rather than default to -march=native option.
+
+if [ "$1" = "--version" ]; then
+    echo "0.9" && exit
+fi
+
+# This table shows when -march options were introduced into _official_ gcc releases.
+# Note there are vendor deviations that complicate this.
+# For e.g. redhat introduced the prescott option in 3.3-13.
+#   gcc-2.95   = i386, i486, i586,pentium, i686,pentiumpro, k6
+#   gcc-3.0   += athlon
+#   gcc-3.1   += pentium-mmx, pentium2, pentium3, pentium4, k6-2, k6-3, athlon-{tbird, 4,xp,mp}
+#   gcc-3.3   += winchip-c6, winchip2, c3
+#   gcc-3.4.0 += k8,opteron,athlon64,athlon-fx, c3-2
+#   gcc-3.4.1 += pentium-m, pentium3m, pentium4m, prescott, nocona
+#   gcc-4.3   += core2
+
+[ -z "$CC" ] && CC=gcc
+
+try_gcc_options() {
+    $CC $* -S -o /dev/null -xc /dev/null >/dev/null 2>&1
+}
+
+if ! try_gcc_options; then
+    echo "Error: Couldn't execute your compiler ($CC)" >&2
+    exit 1
+fi
+
+if try_gcc_options -march=native; then
+    echo "Warning: Your compiler supports the -march=native option which you may prefer" >&2
+fi
+
+if ! try_gcc_options -march=i386; then
+    if ! try_gcc_options -m32 -march=i386; then
+        echo "Error: This script only supports 32 bit x86 architectures" >&2
+        exit 1
+    else
+        echo "Warning: The optimum *32 bit* architecture is reported" >&2
+        m32="-m32 "
+    fi
+fi
+
+try_line() {
+    skip=0
+    for arch in $1; do
+        if try_gcc_options $m32 -march=$arch; then
+            echo $arch
+            return
+        elif [ "$skip" = "0" ] && [ "$arch" != "native" ]; then
+            skip=1
+            echo "Warning: Newer versions of GCC better support your CPU with -march=$arch" >&2
+        fi
+    done
+    return 1
+}
+
+read_cpu_data_linux() {
+    IFS=":"
+    while read name value; do
+        unset IFS
+        name=`echo $name`
+        value=`echo $value`
+        IFS=":"
+        if [ "$name" = "vendor_id" ]; then
+            vendor_id="$value"
+        elif [ "$name" = "cpu family" ]; then
+            cpu_family="$value"
+        elif [ "$name" = "model" ]; then
+            cpu_model="$value"
+        elif [ "$name" = "flags" ]; then
+            flags="$value"
+            break #flags last so break early
+        fi
+    done < /proc/cpuinfo
+    unset IFS
+}
+
+read_cpu_data_freebsd() {
+    local _line
+
+    if [ ! -x /usr/local/bin/cpuid ]; then
+        echo "Please install misc/cpuid and run again"
+        exit 1;
+    fi
+    if [ ! -r /var/run/dmesg.boot ]; then
+        echo "/var/run/dmesg.boot does not exist!"
+        exit 1;
+    fi
+
+    # Get the vendor_id, cpu_family and cpu_model from cpuid
+    IFS="
+"
+    for _line in `/usr/local/bin/cpuid`; do
+        if [ -n "`echo $_line | grep '^Vendor ID: '`" ]; then
+            vendor_id="`echo $_line | cut -d'"' -f2`"
+        fi
+        if [ -n "`echo $_line | grep '^Family: '`" ]; then
+            cpu_family="`echo $_line | sed -e 's/Family: //' -e 's/ .*//'`"
+        fi
+        if [ -n "`echo $_line | grep '^Family: '`" ]; then
+            cpu_model="`echo $_line | sed -e 's/Family:.*Model: //' -e 's/ .*//'`"
+        fi
+    done
+    unset IFS
+
+    # Get the flags from /var/run/dmesg.boot
+    flags="`grep -A2 '^CPU:' /var/run/dmesg.boot | grep '^  Features' | sed -e 's/^.*<//' -e 's/>.*//' -e 's/,/ /g' | tr 'A-Z' 'a-z'`"
+}
+
+read_cpu_data() {
+    # Default values
+    vendor_id="Unset"
+    cpu_family="-1"
+    cpu_model="-1"
+    flags=""
+    if [ "`uname`" = "Linux" ]; then
+        read_cpu_data_linux
+    elif [ "`uname`" = "FreeBSD" ]; then
+        read_cpu_data_freebsd
+    else
+        echo "Error: `uname` is not a supported operating system"
+        exit 1
+    fi
+}
+
+read_cpu_data
+
+if [ "$vendor_id" = "AuthenticAMD" ]; then
+    if [ $cpu_family -eq 4 ]; then
+        _CFLAGS="-march=i486"
+    elif [ $cpu_family -eq 5 ]; then
+        if [ $cpu_model -lt 4 ]; then
+            _CFLAGS="-march=pentium"
+        elif [ \( $cpu_model -eq 6 \) -o \( $cpu_model -eq 7 \) ]; then
+            _CFLAGS="-march=k6"
+        elif [ \( $cpu_model -eq 8 \) -o \( $cpu_model -eq 12 \) ]; then
+            line="k6-2 k6"
+        elif [ \( $cpu_model -eq 9 \) -o \( $cpu_model -eq 13 \) ]; then
+            line="k6-3 k6-2 k6"
+        fi
+    elif [ $cpu_family -eq 6 ]; then
+        if [ $cpu_model -le 3 ]; then
+            line="athlon k6-3 k6-2 k6"
+        elif [ $cpu_model -eq 4 ]; then
+            line="athlon-tbird athlon k6-3 k6-2 k6"
+        elif [ $cpu_model -ge 6 ]; then #athlon-{4,xp,mp}
+            line="athlon-4 athlon k6-3 k6-2 k6"
+        fi
+    elif [ $cpu_family -eq 15 ]; then #k8,opteron,athlon64,athlon-fx
+        line="k8 athlon-4 athlon k6-3 k6-2 k6"
+    fi
+elif [ "$vendor_id" = "CentaurHauls" ]; then
+    if [ $cpu_family -eq 5 ]; then
+        if [ $cpu_model -eq 4 ]; then
+            line="winchip-c6 pentium"
+        elif [ $cpu_model -eq 8 ]; then
+            line="winchip2 winchip-c6 pentium"
+        elif [ $cpu_model -ge 9 ]; then
+            line="winchip2 winchip-c6 pentium" #actually winchip3 but gcc doesn't support this currently
+        fi
+    elif [ $cpu_family -eq 6 ]; then
+        if echo "$flags" | grep -q cmov; then
+            fallback=pentiumpro
+        else
+            fallback=pentium #gcc incorrectly assumes i686 always has cmov
+        fi
+        if [ $cpu_model -eq 6 ]; then
+            _CFLAGS="-march=pentium" # ? Cyrix 3 (samuel)
+        elif [ $cpu_model -eq 7 ] || [ $cpu_model -eq 8 ]; then
+            line="c3 winchip2 winchip-c6 $fallback"
+        elif [ $cpu_model -ge 9 ]; then
+            line="c3-2 c3 winchip2 winchip-c6 $fallback"
+        fi
+    fi
+elif [ "$vendor_id" = "GenuineIntel" ]; then
+    if [ $cpu_family -eq 3 ]; then
+        _CFLAGS="-march=i386"
+    elif [ $cpu_family -eq 4 ]; then
+        _CFLAGS="-march=i486"
+    elif [ $cpu_family -eq 5 ]; then
+        if [ $cpu_model -ne 4 ]; then
+            _CFLAGS="-march=pentium"
+        else
+            line="pentium-mmx pentium" #No overlap with other vendors
+        fi
+    elif [ $cpu_family -eq 6 ]; then
+        if [ \( $cpu_model -eq 0 \) -o \( $cpu_model -eq 1 \) ]; then
+            _CFLAGS="-march=pentiumpro"
+        elif [ \( $cpu_model -ge 3 \) -a \( $cpu_model -le 6 \) ]; then #4=TM5600 at least
+            line="pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        elif [ \( $cpu_model -eq 9 \) -o \( $cpu_model -eq 13 \) ]; then #centrino
+            line="pentium-m pentium4 pentium3 pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        elif [ $cpu_model -eq 14 ]; then #Core
+            line="prescott pentium-m pentium4 pentium3 pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        elif [ $cpu_model -eq 15 ]; then #Core 2
+            line="core2 pentium-m pentium4 pentium3 pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        elif [ \( $cpu_model -ge 7 \) -a \( $cpu_model -le 11 \) ]; then
+            line="pentium3 pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        fi
+    elif [ $cpu_family -eq 15 ]; then
+        if [ $cpu_model -eq 3 ]; then
+            line="prescott pentium4 pentium3 pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        else
+            line="pentium4 pentium3 pentium2 pentiumpro pentium-mmx pentium i486 i386"
+        fi
+    fi
+else
+    echo "Unknown CPU Vendor: $vendor_id"
+    exit 1
+fi
+
+[ -z "$_CFLAGS" ] && _CFLAGS="-march=`try_line "$line"`"
+
+if echo "$flags" | grep -q "sse"; then
+    if try_gcc_options "-mfpmath=sse"; then #gcc >= 3.1
+        _CFLAGS="$_CFLAGS -mfpmath=sse"
+    fi
+fi
+if echo "$flags" | grep -E -q "(sse3|pni)"; then
+    if ! echo "$_CFLAGS" | grep -E -q "(native|core2)"; then
+        if try_gcc_options "-msse3"; then #gcc >= 3.3.3
+            _CFLAGS="$_CFLAGS -msse3"
+        fi
+    fi
+fi
+
+echo "$m32$_CFLAGS"



More information about the Freeswitch-svn mailing list