# 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 ${binfile}] {
    return -1
}

# Check if our compiler is a GCC that suppports the vector extension
if { ![test_compiler_info gcc-4-*] } {
    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"

