# Copyright 2012-2013 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/>.

if ![is_x86_like_target] {
    verbose "Skipping x86 SSE stack alignment tests."
    return
}

set testfile "i386-sse-stack-align"
set srcfile ${testfile}.S
set csrcfile ${testfile}.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}
set opts {}

if [info exists COMPILE] {
    set srcfile ${csrcfile}
    lappend opts debug optimize=-O2 additional_flags=-msse
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $opts] != "" } {
    unsupported "cannot compile ${srcfile}"
    return -1
}

clean_restart $executable

if ![runto_main] then {
    return -1
}

set args ""
foreach i {0 1 2 3 4} {
    set test "print g$i ($args)"
    gdb_test_multiple $test $test {
	-re " = 2\r\n$gdb_prompt $" {
	    pass $test
	}
	-re "Program received signal SIGSEGV, Segmentation fault\\..*\r\n$gdb_prompt $" {
	    fail $test
	}
    }

    if {$args != ""} {
	set args "$args, "
    }
    set args "$args[expr $i + 1]"
}
