#   Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

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

# There's a bunch of headers we need.
if [is_remote host] {
    foreach header [glob -nocomplain $srcdir/$subdir/*.{h,def} ] {
        remote_download host $header
    }
}

# Load support procs.
load_lib g++-dg.exp
load_lib target-supports.exp

# If the target system supports vector instructions, the default action
# for a test is 'run', otherwise it's 'compile'.  Save current default.
# Executing vector instructions on a system without hardware vector support
# is also disabled by a call to check_vect, but disabling execution here is
# more efficient.
global dg-do-what-default
set save-dg-do-what-default ${dg-do-what-default}

# Set up flags used for tests that don't specify options.
set DEFAULT_VECTCFLAGS ""

# These flags are used for all targets.
lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" \
  "-ftree-vectorizer-verbose=4" "-fdump-tree-vect-stats"

# Skip these tests for targets that do not support generating vector
# code.  Set additional target-dependent vector flags, which can be
# overridden by using dg-options in individual tests.
if [istarget "powerpc*-*-*"] {
    # Skip targets not supporting -maltivec.
    if ![is-effective-target powerpc_altivec_ok] {
	return
    }

    lappend DEFAULT_VECTCFLAGS "-maltivec"
    if [check_vmx_hw_available] {
        set dg-do-what-default run
    } else {
        if [is-effective-target ilp32] {
            # Specify a cpu that supports VMX for compile-only tests.
            lappend DEFAULT_VECTCFLAGS "-mcpu=7400"
        }
        set dg-do-what-default compile
    }
} elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } {
    lappend DEFAULT_VECTCFLAGS "-msse2"
    set dg-do-what-default run
} elseif { [istarget "mipsisa64*-*-*"]
	   && [check_effective_target_mpaired_single] } {
    lappend DEFAULT_VECTCFLAGS "-mpaired-single"
    set dg-do-what-default run
} elseif [istarget "sparc*-*-*"] {
    lappend DEFAULT_VECTCFLAGS "-mcpu=ultrasparc" "-mvis"
    set dg-do-what-default run
} elseif [istarget "alpha*-*-*"] {
    lappend DEFAULT_VECTCFLAGS "-mmax"
    if [check_alpha_max_hw_available] {
        set dg-do-what-default run
    } else {
        set dg-do-what-default compile
    }
} elseif [istarget "ia64-*-*"] {
    set dg-do-what-default run
} else {
    return
}


# Initialize `dg'.
dg-init

# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{c,cc,S} ]] \
        "" $DEFAULT_VECTCFLAGS

#### Tests with special options
global SAVED_DEFAULT_VECTCFLAGS
set SAVED_DEFAULT_VECTCFLAGS $DEFAULT_VECTCFLAGS
    
# --param max-aliased-vops=0
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "--param max-aliased-vops=0"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/param-max-aliased*.\[cS\]]]  \
        "" $DEFAULT_VECTCFLAGS 

# Clean up.
set dg-do-what-default ${save-dg-do-what-default} 

# All done.
dg-finish
