# Copyright 2003, 2007, 2008, 2009 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/>.
#

# Tests for Powerpc e500 ABI


if $tracelevel then {
    strace $tracelevel
}

#
# This file uses e500-abi.c for input.
#

set prms_id 0
set bug_id 0

if ![istarget "powerpc-*eabispe"] then {
    verbose "Skipping e500 abi tests."
    return
}

set testfile "e500-abi"
set binfile ${objdir}/${subdir}/${testfile}

set src1 ${srcdir}/${subdir}/${testfile}.c

if  { [gdb_compile ${src1} ${binfile} executable {debug nowarnings}] != "" } {
     untested e500-abi.exp
     return -1
}

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

#
# Run to `main' where we begin our tests.
#

if ![runto_main] then {
    gdb_suppress_tests
}

gdb_test "b marker" "Breakpoint 2 at.*file.*e500-abi.c, line \[0-9\]+." "break marker"
gdb_test "continue" "Breakpoint 2.*marker.*e500-abi.c.*" "continue to marker"
gdb_test "finish" "Run till exit from .0.*marker.*at.*e500-abi.c.*main \\(\\) at.*e500-abi.c.*res_vec = vec_func \\(a_vec,.*goes in r3.*" "back to main (1)"

# now all the arguments of vec_func are initialized

set pattern "vec_func .a_vec_f=.0, 55., b_vec_f=.0, 66., c_vec_f=.3.14.*2.18.*, d_vec_f=.5, 4., e_vec_f=.5, 6., f_vec_f=.6, 6, 7, 1., g_vec_f=.6, 6, 7, 9., h_vec_f=.3, 2., i_vec_f=.3, 2., l_vec_f=.3, 5., m_vec_f=.6, 9.."

set pattern1 $pattern
append pattern1 " at.*e500-abi.c.*x = 2;"

# Now let's call the function.  This function has > 8 args,
# the last ones will go on the stack.
gdb_test "p vec_func(a_vec,b_vec,c_vec,d_vec,e_vec,f_vec,g_vec,h_vec,i_vec,l_vec,m_vec)" \
".\[0-9\]+ = .6, 63." "call inferior function with vectors (1) "

# Let's call the function again with dummy arguments.  This is to clean
# up the contents of the ev registers before the next call.
gdb_test "p vec_func(a_vec_d,b_vec_d,c_vec_d,d_vec_d,e_vec_d,f_vec_d,g_vec_d,h_vec_d,i_vec_d,l_vec_d,m_vec_d)" \
".\[0-9\]+ = .1, 1." "call inferior function with vectors (2) "

# Let's step into the function, to see if the args are printed correctly.
gdb_test "step" \
  $pattern1 \
  "step into vec_func"

# Let's see if the result is returned correctly.
gdb_test "finish" \
  "Run till exit from .0.* at.*e500-abi.c.*main.*res_vec = vec_func .a_vec,.*goes in r3.*Value returned is.*= .6, 63." \
  "vector value returned correctly"
