# Copyright (C) 1997, 2004, 2005, 2006 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.

# Load support procs.
load_lib gcc-dg.exp

# 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"

# 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}

# 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
# APPLE LOCAL begin v7 merge
} elseif [is-effective-target arm_neon_ok] {
    lappend DEFAULT_VECTCFLAGS "-mfpu=neon" "-mfloat-abi=softfp"
    if [is-effective-target arm_neon_hw] {
	set dg-do-what-default run
    } else {
	set dg-do-what-default compile
    }
# APPLE LOCAL end v7 merge
} else {
    return
}

# Initialize `dg'.
dg-init

# Tests that should be run without generating dump info
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/nodump-*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

lappend DEFAULT_VECTCFLAGS "-fdump-tree-vect-details"

# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/vect-*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

#### Tests with special options
global SAVED_DEFAULT_VECTCFLAGS
set SAVED_DEFAULT_VECTCFLAGS $DEFAULT_VECTCFLAGS

# -ffast-math tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-ffast-math"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/fast-math-vect*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

# -fwrapv tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fwrapv"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/wrapv-vect*.\[cS\]]]  \
        "" $DEFAULT_VECTCFLAGS

# -ftrapv tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-ftrapv"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/trapv-vect*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

# -fdump-tree-dceloop-details tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fdump-tree-dceloop-details"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/dump-tree-dceloop-*.\[cS\]]]  \
        "" $DEFAULT_VECTCFLAGS

# -fno-tree-dce tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fno-tree-dce"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-tree-dce-*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

# -fsection-anchors tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fsection-anchors"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/section-anchors-*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

# -fno-section-anchors tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fno-section-anchors"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-section-anchors-*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

# -funswitch-loops tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-funswitch-loops"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/unswitch-loops-*.\[cS\]]]  \
	"" $DEFAULT_VECTCFLAGS

# With -Os
lappend DEFAULT_VECTCFLAGS "-Os"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/Os-vect-*.\[cS\]]]  \
        "" $DEFAULT_VECTCFLAGS

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

# All done.
dg-finish
