# Copyright 2010, 2011 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file is part of the gdb testsuite.

if $tracelevel {
    strace $tracelevel
}


if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
    verbose "Skipping x86 AVX tests."
    return
}

set testfile "i386-avx"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info ${binfile}] {
    return -1
}

set additional_flags ""
if [test_compiler_info gcc*] {
    set additional_flags "additional_flags=-mavx"
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } {
    unsupported "compiler does not support AVX"
    return
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    gdb_suppress_tests
}

send_gdb "print have_avx ()\r"
gdb_expect {
    -re ".. = 1\r\n$gdb_prompt " {
        pass "check whether processor supports AVX"
    }
    -re ".. = 0\r\n$gdb_prompt " {
        verbose "processor does not support AVX; skipping AVX tests"
        return
    }
    -re ".*$gdb_prompt $" {
        fail "check whether processor supports AVX"
    }
    timeout {
        fail "check whether processor supports AVX (timeout)"
    }
}

gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
         "Breakpoint .* at .*i386-avx.c.*" \
         "set first breakpoint in main"
gdb_continue_to_breakpoint "continue to first breakpoint in main"

if [is_ilp32_target] {
    set nr_regs 8
} else {
    set nr_regs 16
}

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "print \$ymm$r.v8_float" \
        ".. = \\{$r, $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}.*" \
        "check float contents of %ymm$r"
    gdb_test "print \$ymm$r.v32_int8" \
        ".. = \\{(-?\[0-9\]+, ){31}-?\[0-9\]+\\}.*" \
        "check int8 contents of %ymm$r"
}

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "set var \$ymm$r.v8_float\[0\] = $r + 10" "" "set %ymm$r"
}

gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
         "Breakpoint .* at .*i386-avx.c.*" \
         "set second breakpoint in main"
gdb_continue_to_breakpoint "continue to second breakpoint in main"

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "print data\[$r\]" \
        ".. = \\{f = \\{[expr $r + 10], $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}\\}.*" \
        "check contents of data\[$r\]"
}
