# Copyright 2010 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 [istarget i?86-*-*] {
    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\]"
}
