use strict;
use warnings;
my $gcc = $ARGV[0];
my $cpuinfo = $ARGV[1];
if ( ! $gcc ) {
die "Can't generate optimization flags (no compiler specified)\n";
}
if ( ! `which $gcc 2> /dev/null` ) {
die "Can't generate optimization flags ($gcc is missing?)\n";
}
if ( ! $cpuinfo ) {
$cpuinfo = "/proc/cpuinfo";
}
my %features;
my ($family, $model);
my $uname_M = `uname -m`;
my $uname_P = `uname -p`;
my $uname_S = `uname -s`;
if ( -e $cpuinfo ) {
open(FH, "< $cpuinfo");
my @cpuinfo = <FH>;
close FH;
my @line = grep(/^cpu family/, @cpuinfo);
$line[0] =~ /([0-9]*)$/;
$family = $1;
@line = grep(/^model/, @cpuinfo);
$line[0] =~ /([0-9]*)$/;
$model = $1;
my @flags = grep(/^flags/, @cpuinfo);
$flags[0] =~ s/^flags[ \t]*[:][ \t]*//;
@flags = split(' ',$flags[0]);
foreach (@flags) {
$features{$_} = 1;
}
}
if ( $uname_S =~ /^Darwin/ ) {
# All released Intel macs have CMOV, and
# sysctl doesn't provide this one.
$features{"cmov"} = 1;
$features{"mmx"} = `sysctl -n hw.optional.mmx`;
$features{"sse"} = `sysctl -n hw.optional.sse`;
$features{"sse2"} = `sysctl -n hw.optional.sse2`;
$features{"pni"} = `sysctl -n hw.optional.sse3`;
$features{"ssse3"} = `sysctl -n hw.optional.supplementalsse3`;
}
my $gcc_gte_4_2_0 = `util/gcc-gte.pl $gcc 4.2.0`;
my $gcc_gte_4_3_0 = `util/gcc-gte.pl $gcc 4.2.0`;
my $gcc_gte_4_5_0 = `util/gcc-gte.pl $gcc 4.5.0`;
my $march = "i386";
my $fpmath;
if ($uname_M eq "i586" || $uname_M eq "i686")
{
# Pentium and PentiumPro
$march = $uname_M;
}
if ( $uname_M eq "i586" && $features{"mmx"} )
{
$march = "pentium-mmx";
}
if ( $features{"cmov"} && $features{"mmx"} ) {
$march = "pentium2";
}
if ( $features{"sse"} ) {
$march = "pentium3";
$fpmath = "sse"
}
if ( $features{"sse2"} ) {
$march = "pentium-m";
}
if ( $features{"pni"} ) { # a.k.a. SSE3
$march = "prescott";
}
if ( $features{"ssse3"} ) {
if ( $gcc_gte_4_3_0 ) {
$march = "core2";
} else {
$march = "nocona";
}
}
if ( $gcc_gte_4_5_0 && $features{"movbe"} ) {
$march = "atom";
}
if ( $uname_P =~ /Athlon/ )
{
$march = "athlon";
if ( $features{"abm"} && $features{"sse4a"} )
{
$march = "amdfam10";
}
}
if ( $family == 15 ) {
$march = "pentium4";
}
print "-march=$march -mtune=$march";
if ( $fpmath ) {
print " -mfpmath=$fpmath";
}
print "\n";
exit 0