# Copyright 2004, 2005, 2007, 2008, 2009, 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 SSE tests."
    return
}

set testfile "i386-sse"
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=-msse"
}

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

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

if ![runto_main] then {
    gdb_suppress_tests
}

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

gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
         "Breakpoint .* at .*i386-sse.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 \$xmm$r.v4_float" \
        ".. = \\{$r, $r.25, $r.5, $r.75\\}.*" \
        "check float contents of %xmm$r"
    gdb_test "print \$xmm$r.v16_int8" \
        ".. = \\{(-?\[0-9\]+, ){15}-?\[0-9\]+\\}.*" \
        "check int8 contents of %xmm$r"
}

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

gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
         "Breakpoint .* at .*i386-sse.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.25, $r.5, $r.75\\}\\}.*" \
        "check contents of data\[$r\]"
}
