# Copyright 2010-2012 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
#
# Contributed by Ken Werner <ken.werner@de.ibm.com>.
#
# Tests GDBs support for GNU vectors.
# http://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html

set testfile "gnu_vector"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info] {
    return -1
}

# Check if our compiler is a GCC that suppports the vector extension
if { ![test_compiler_info gcc-4-*] &&
     ![test_compiler_info clang-*-*]} {
    setup_xfail "*-*-*"
    fail "This compiler can not handle GNU vectors"
    return 0
}

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug}] } {
    return -1
}

if { ![runto main] } {
    fail "runto main"
    return -1
}

# Test printing of character vector types
gdb_test "print c4" "\\\$$decimal = \\{1, 2, 3, 4\\}"
gdb_test "print c4\[2\]" "\\\$$decimal = 3"

# Test operators on integer vector types
gdb_test "print i4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print i4b" "\\\$$decimal = \\{1, 2, 8, 4\\}"
# Arithmetic operators
gdb_test "print i4a + i4b" "\\\$$decimal = \\{3, 6, 16, 20\\}"
gdb_test "print i4a - i4b" "\\\$$decimal = \\{1, 2, 0, 12\\}"
gdb_test "print i4a * i4b" "\\\$$decimal = \\{2, 8, 64, 64\\}"
gdb_test "print i4a / i4b" "\\\$$decimal = \\{2, 2, 1, 4\\}"
gdb_test "print i4a % i4b" "\\\$$decimal = \\{0, 0, 0, 0\\}"
gdb_test "print i4a++" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print ++i4a" "\\\$$decimal = \\{4, 6, 10, 18\\}"
gdb_test "print i4a--" "\\\$$decimal = \\{4, 6, 10, 18\\}"
gdb_test "print --i4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print +i4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print -i4a" "\\\$$decimal = \\{-2, -4, -8, -16\\}"

# Bitwise operators
gdb_test "print i4a & i4b" "\\\$$decimal = \\{0, 0, 8, 0\\}"
gdb_test "print i4a | i4b" "\\\$$decimal = \\{3, 6, 8, 20\\}"
gdb_test "print i4a ^ i4b" "\\\$$decimal = \\{3, 6, 0, 20\\}"
gdb_test "print ~i4a" "\\\$$decimal = \\{-3, -5, -9, -17\\}"
# Shift operators
gdb_test "print i4a << i4b" "\\\$$decimal = \\{4, 16, 2048, 256\\}"
gdb_test "print i4a >> i4b" "\\\$$decimal = \\{1, 1, 0, 1\\}"

# Test operators on floating point vector types
gdb_test "print f4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print f4b" "\\\$$decimal = \\{1, 2, 8, 4\\}"
# Arithmetic operators
gdb_test "print f4a + f4b" "\\\$$decimal = \\{3, 6, 16, 20\\}"
gdb_test "print f4a - f4b" "\\\$$decimal = \\{1, 2, 0, 12\\}"
gdb_test "print f4a * f4b" "\\\$$decimal = \\{2, 8, 64, 64\\}"
gdb_test "print f4a / f4b" "\\\$$decimal = \\{2, 2, 1, 4\\}"
gdb_test "print +f4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print -f4a" "\\\$$decimal = \\{-2, -4, -8, -16\\}"

# Test scalar to vector widening
gdb_test "print (int2) 1" "\\\$$decimal = \\{1, 1\\}"
gdb_test "print (longlong2) 2" "\\\$$decimal = \\{2, 2\\}"
gdb_test "print (float2) 3" "\\\$$decimal = \\{3, 3\\}"
gdb_test "print (double2) 4" "\\\$$decimal = \\{4, 4\\}"
gdb_test "print (char4) 12" "\\\$$decimal = \\{12, 12, 12, 12\\}"
gdb_test "print (uint4) ia" "\\\$$decimal = \\{2, 2, 2, 2\\}"
gdb_test "print (int4) -3" "\\\$$decimal = \\{-3, -3, -3, -3\\}"
gdb_test "print (float4) 4" "\\\$$decimal = \\{4, 4, 4, 4\\}"

gdb_test "print i4a + ib" "\\\$$decimal = \\{3, 5, 9, 17\\}"
gdb_test "print fa - f4b" "\\\$$decimal = \\{1, 0, -6, -2\\}"
gdb_test "print f4a * fb" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print ia / i4b" "\\\$$decimal = \\{2, 1, 0, 0\\}"
gdb_test "print i4a % ib" "\\\$$decimal = \\{0, 0, 0, 0\\}"

gdb_test "print ia & i4b" "\\\$$decimal = \\{0, 2, 0, 0\\}"
gdb_test "print i4a | ib" "\\\$$decimal = \\{3, 5, 9, 17\\}"
gdb_test "print ia ^ i4b" "\\\$$decimal = \\{3, 0, 10, 6\\}"
gdb_test "print i4a << ib" "\\\$$decimal = \\{4, 8, 16, 32\\}"
gdb_test "print i4a >> ib" "\\\$$decimal = \\{1, 2, 4, 8\\}"

gdb_test "print i4b = ia" "\\\$$decimal = \\{2, 2, 2, 2\\}"
gdb_test "print i4a = 3" "\\\$$decimal = \\{3, 3, 3, 3\\}"
gdb_test "print f4a = fb" "\\\$$decimal = \\{1, 1, 1, 1\\}"
gdb_test "print f4b = 2" "\\\$$decimal = \\{2, 2, 2, 2\\}"

gdb_test "print i4a = \{2, 4, 8, 16\}" "\\\$$decimal = \\{2, 4, 8, 16\\}"
gdb_test "print i4a <<= ib" "\\\$$decimal = \\{4, 8, 16, 32\\}"

# Test some error scenarios
gdb_test "print i4a + d2" "Cannot perform operation on vectors with different types"
gdb_test "print d2 + i4a" "Cannot perform operation on vectors with different types"
gdb_test "print f4a + ll2" "Cannot perform operation on vectors with different types"
gdb_test "print ll2 + f4a" "Cannot perform operation on vectors with different types"
gdb_test "print i2 + ll2" "Cannot perform operation on vectors with different types"
gdb_test "print ll2 + i2" "Cannot perform operation on vectors with different types"
gdb_test "print i4a + ll2" "Cannot perform operation on vectors with different types"
gdb_test "print ll2 + i4a" "Cannot perform operation on vectors with different types"
gdb_test "print f4a + d2" "Cannot perform operation on vectors with different types"
gdb_test "print d2 + f4a" "Cannot perform operation on vectors with different types"
gdb_test "print ui4 + i4a" "Cannot perform operation on vectors with different types"
gdb_test "print i4a + ui4" "Cannot perform operation on vectors with different types"
gdb_test "print i4a + i2" "Cannot perform operation on vectors with different types"
gdb_test "print i2 + i4a" "Cannot perform operation on vectors with different types"
gdb_test "print f4a + f2" "Cannot perform operation on vectors with different types"
gdb_test "print f2 + f4a" "Cannot perform operation on vectors with different types"

