# APPLE LOCAL file 5612787 mainline sse4
# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  

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

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

# Load support procs.
load_lib gcc-dg.exp

# Return 1 if ssse3 instructions can be compiled.
proc check_effective_target_ssse3 { } {
    return [check_no_compiler_messages ssse3 object {
	typedef long long __m128i __attribute__ ((__vector_size__ (16)));
	typedef int __v4si __attribute__ ((__vector_size__ (16)));

	__m128i _mm_abs_epi32 (__m128i __X)
	{
	    return (__m128i) __builtin_ia32_pabsd128 ((__v4si)__X);
	}
    } "-O2 -mssse3" ]
}

# Return 1 if sse4 instructions can be compiled.
proc check_effective_target_sse4 { } {
    return [check_no_compiler_messages sse4.1 object {
	typedef long long __m128i __attribute__ ((__vector_size__ (16)));
	typedef int __v4si __attribute__ ((__vector_size__ (16)));

	__m128i _mm_mullo_epi32 (__m128i __X, __m128i __Y)
	{
	    return (__m128i) __builtin_ia32_pmulld128 ((__v4si)__X,
						       (__v4si)__Y);
	}
    } "-O2 -msse4.1" ]
}

# Return 1 if sse4a instructions can be compiled.
proc check_effective_target_sse4a { } {
    return [check_no_compiler_messages sse4a object {
	typedef long long __m128i __attribute__ ((__vector_size__ (16)));
	typedef long long __v2di __attribute__ ((__vector_size__ (16)));

	__m128i _mm_insert_si64 (__m128i __X,__m128i __Y)
	{
	    return (__m128i) __builtin_ia32_insertq ((__v2di)__X, (__v2di)__Y);
	}
    } "-O2 -msse4a" ]
}

# 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 [glob -nocomplain $srcdir/$subdir/*.\[cS\]]]
set tests [prune $tests $srcdir/$subdir/vect-args.c]

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

# All done.
dg-finish
