# Copyright (C) 2002-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/>.
#

# Tests for Powerpc AltiVec ABI


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

if {![istarget "powerpc*"] || [skip_altivec_tests]} then {
    verbose "Skipping altivec abi tests."
    return
}

set testfile "altivec-abi"
set binfile ${objdir}/${subdir}/${testfile}
set srcfile ${testfile}.c

if [get_compiler_info] {
    warning "get_compiler failed"
    return -1
}

proc altivec_abi_tests { extra_flags force_abi } {
    global testfile binfile srcfile srcdir subdir
    global gdb_prompt

    set compile_flags "debug nowarnings $extra_flags"

    if  { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable $compile_flags] != "" } {
	untested altivec-abi.exp
	return -1
    }

    if { "$force_abi" == "auto" } {
	# If the toolchain does not record attributes, skip auto-ABI tests.
	set readelf_program [transform readelf]
	set result [catch "exec $readelf_program -A $binfile" output]

	if {$result == 0 && ![regexp Tag_GNU_Power_ABI_Vector $output]} {
	    untested "ABI not marked"
	    return
	}
    }

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

    # Run to `main' where we begin our tests.
    if ![runto_main] then {
	untested altivec-abi.exp
	return -1
    }

    gdb_test "set print frame-arguments all"
    gdb_test "set powerpc vector-abi $force_abi"

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

    # now all the arguments of vec_fun are initialized

    set pattern "vec_func .vshort_f=.111, 222, 333, 444, 555, 666, 777, 888., vushort_f=.100, 200, 300, 400, 500, 600, 700, 800., vint_f=.-10, -20, -30, -40., vuint_f=.1111, 2222, 3333, 4444., vchar_f=.97, 98, 99, 100, 101, 102, 103, 104, 105, 108, 109, 110, 111, 112, 113, 114., vuchar_f=.65, 66, 67, 68, 69, 70, 71, 72, 73, 76, 77, 78, 79, 80, 81, 82., vfloat_f=.1.25, 3.75, 5.5, 1.25., x_f=.1, 2, 3, 4, 5, 6, 7, 8., y_f=.12, 22, 32, 42., a_f=.118, 101, 99, 116, 111, 114, 32, 111, 102, 32, 99, 104, 97, 114, 115, 46., b_f=.5.5, 4.5, 3.75, 2.25., c_f=.1.25, 3.5, 5.5, 7.75., intv_on_stack_f=.12, 34, 56, 78.."

    set pattern1 $pattern
    append pattern1 " at.*altivec-abi.c.*vint_res  = vec_add.*vint_f, intv_on_stack_f.;"

    # Now let's call the function.  This function has > 12 args,
    # the last one will go on the stack.
    set msg "call inferior function with vectors (1)"
    gdb_test "p vec_func(vshort,vushort,vint,vuint,vchar,vuchar,vfloat,x,y,a,b,c,intv_on_stack)" \
	".\[0-9\]+ = .14, 36, 58, 80." "call inferior function with vectors (1)"


    # Let's call the function again with dummy arguments.  This is to clean
    # up the contents of the vector registers before the next call.
    gdb_test "p vec_func(vshort_d,vushort_d,vint_d,vuint_d,vchar_d,vuchar_d,vfloat_d,x_d,y_d,a_d,b_d,c_d,intv_on_stack_d)" \
	".\[0-9\]+ = .0, 0, 0, 0." "call inferior function with vectors (2)"

    # Attempt to take address of the return value of vec_func.
    gdb_test "p &vec_func(vshort,vushort,vint,vuint,vchar,vuchar,vfloat,x,y,a,b,c,intv_on_stack)" \
	"Attempt to take address of value not located in memory." \
	"Attempt to take address of the return value of vec_func"

    # Attempt to assign a value to the return value of vec_func.
    gdb_test "set variable vec_func(vshort,vushort,vint,vuint,vchar,vuchar,vfloat,x,y,a,b,c,intv_on_stack) = {0,1,2,3}" \
	"Left operand of assignment is not an lvalue." \
	"Attempt to assign a value to the return value of vec_func"

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

    set pattern2 $pattern
    append pattern2 " at.*altivec-abi.c.*main.*result = vec_func .vshort,.*goes in v2.*Value returned is.*= .14, 36, 58, 80."

    # Let's see if the result is returned correctly.
    set message "vector value returned correctly"
    gdb_test_multiple "finish" $message {
	-re "Run till exit from .0.*$pattern2.*$gdb_prompt $" {
	    pass $message
	}
	-re "Run till exit from .0.*Cannot determine contents.*$gdb_prompt $" {
	    # This happens in those cases where the vector is returned by
	    # reference (generic vectors on 64-bit GNU/Linux).
	    pass $message
	}
    }

    # can we print the args correctly for this function?
    gdb_test "break struct_of_vector_func" "" ""

    set pattern "struct_of_vector_func .vector_struct=.vshort1 = .1, 2, 3, 4, 5, 6, 7, 8., vshort2 = .11, 12, 13, 14, 15, 16, 17, 18., vshort3 = .21, 22, 23, 24, 25, 26, 27, 28., vshort4 = .31, 32, 33, 34, 35, 36, 37, 38... at.*altivec-abi.c.*"

    gdb_test "continue" \
	"Breakpoint 3, $pattern.*vector_struct.vshort1 = vec_add .vector_struct.vshort1, vector_struct.vshort2.;" \
	"continue to struct_of_vector_func"

    gdb_test "finish" \
	"Run till exit from .0  $pattern\[ \r\n\]+main.*altivec-abi.c.*array_of_vector_func.*" \
	"back to main (2)"

    gdb_test "step" "" "step into array_of_vector_func"
    gdb_test "p matrix\[0\]" ".*= .1, 2, 3, 4, 5, 6, 7, 8." "print first vector"
    gdb_test "p matrix\[1\]" ".*= .11, 12, 13, 14, 15, 16, 17, 18." "print second vector"
    gdb_test "p matrix\[2\]" ".*= .21, 22, 23, 24, 25, 26, 27, 28." "print third vector"
    gdb_test "p matrix\[3\]" ".*= .31, 32, 33, 34, 35, 36, 37, 38." "print fourth vector"
}

if [test_compiler_info gcc*] {
    with_test_prefix "default ABI, auto" {
	altivec_abi_tests  "additional_flags=-maltivec" "auto"
    }

    # On GNU/Linux, we can mix -mabi=no-altivec and -mabi=altivec.
    # So test some combinations.
    if { [istarget "powerpc*-linux*"] } {
	# On 64-bit GNU/Linux with GCC 4.1 and 4.2, -mabi=no-altivec
	# was broken, so skip those tests there.
	if { ![is_lp64_target] || ![test_compiler_info "gcc-4-\[12\]-*"] } {
	    set binfile ${objdir}/${subdir}/${testfile}-ge-ge
	    with_test_prefix "generic ABI, forced" {
		altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=no-altivec" "generic"
	    }

	    set binfile ${objdir}/${subdir}/${testfile}-ge-auto
	    with_test_prefix "generic ABI, auto" {
		altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=no-altivec" "auto"
	    }
	}

	set binfile ${objdir}/${subdir}/${testfile}-av-av
	with_test_prefix "AltiVec ABI, forced" {
	    altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=altivec" "altivec"
	}

	set binfile ${objdir}/${subdir}/${testfile}-av-auto
	with_test_prefix "AltiVec ABI, auto" {
	    altivec_abi_tests "additional_flags=-maltivec additional_flags=-mabi=altivec" "auto"
	}
    }
} elseif [test_compiler_info xlc*] {
    altivec_abi_tests "additional_flags=-qaltivec" "auto"
} else {
    warning "unknown compiler"
    return -1
}
