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

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]"
}
