# 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  "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
# 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.
# LLVM LOCAL begin llvm doesn't support -fdump.
if { ![ is_llvm ] } {
  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
}

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

# All done.
dg-finish
