# Copyright (C) 1997, 2004 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# GCC testsuite that uses the `dg.exp' driver.

# Exit immediately if this isn't a SPARC target.
if { ![istarget i?86*-*-*] && ![istarget x86_64-*-*] } then {
  return
}

# Load support procs.
load_lib gcc-dg.exp

# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then {
    set DEFAULT_CFLAGS " -ansi -pedantic-errors"
}

# Initialize `dg'.
dg-init

# Special case compilation of vect-args.c so we don't have to
# replicate it 10 times.
foreach type { "" -mmmx -m3dnow -msse -msse2 } {
  foreach level { "" -O } {
    set flags "$type $level"
    verbose -log "Testing vect-args, $flags" 1
    dg-test $srcdir/$subdir/vect-args.c $flags ""
  }
}

# Everything else.
set tests [lsort [find $srcdir/$subdir *.\[cS\]]]
set tests [prune $tests $srcdir/$subdir/vect-args.c]

# Main loop.
dg-runtest $tests "" $DEFAULT_CFLAGS

# All done.
dg-finish
