# Copyright (C) 1997, 2004, 2007, 2008, 2009 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 3 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# 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 aes instructions can be compiled.
proc check_effective_target_aes { } {
    return [check_no_compiler_messages aes object {
	typedef long long __m128i __attribute__ ((__vector_size__ (16)));
	typedef long long __v2di __attribute__ ((__vector_size__ (16)));

	__m128i _mm_aesimc_si128 (__m128i __X)
	{
	    return (__m128i) __builtin_ia32_aesimc128 ((__v2di)__X);
	}
    } "-O2 -maes" ]
}

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

	__m128i _mm_aesimc_si128 (__m128i __X)
	{
	    return (__m128i) __builtin_ia32_aesimc128 ((__v2di)__X);
	}
    } "-O2 -maes -mavx" ]
}

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

	__m128i pclmulqdq_test (__m128i __X, __m128i __Y)
	{
	    return (__m128i) __builtin_ia32_pclmulqdq128 ((__v2di)__X,
							  (__v2di)__Y,
							  1);
	}
    } "-O2 -mpclmul" ]
}

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

	__m128i pclmulqdq_test (__m128i __X, __m128i __Y)
	{
	    return (__m128i) __builtin_ia32_pclmulqdq128 ((__v2di)__X,
							  (__v2di)__Y,
							  1);
	}
    } "-O2 -mpclmul -mavx" ]
}

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

# Return 1 if sse5 instructions can be compiled.
proc check_effective_target_sse5 { } {
    return [check_no_compiler_messages sse5 object {
	typedef long long __m128i __attribute__ ((__vector_size__ (16)));
	typedef short __v8hi __attribute__ ((__vector_size__ (16)));

	__m128i _mm_maccs_epi16(__m128i __A, __m128i __B, __m128i __C)
	{
	    return (__m128i) __builtin_ia32_pmacssww ((__v8hi)__A,
						      (__v8hi)__B,
						      (__v8hi)__C);
	}
    } "-O2 -msse5" ]
}

# 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
