#   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.
# LLVM LOCAL begin tree-vect-stats dump is disabled
# Seems to be useless for test purposes, so just disable it.
if { [ is_llvm ] } {
  lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" \
  "-ftree-vectorizer-verbose=4"
} else {
  lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" \
   "-ftree-vectorizer-verbose=4" "-fdump-tree-vect-stats"
}
# LLVM LOCAL end
# 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  "spu-*-*"] } {
   set dg-do-what-default run
} 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
