# Copyright 2009, 2011-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/>.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
#
# Testsuite for Cell Broadband Engine combined debugger
# Test ptype and print/set of SPU-side registers.

load_lib cell.exp

set ppu_file "break"
set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
set ppu_bin ${objdir}/${subdir}/${ppu_file}
set spu_file "break-spu"
set spu_src ${srcdir}/${subdir}/${spu_file}.c
set spu_bin ${objdir}/${subdir}/${spu_file}

if {[skip_cell_tests]} {
    return 0
}

# Compile SPU binary.
if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}]  != "" } {
  unsupported "Compiling spu binary failed."
  return -1
}
# Compile PPU binary.
if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}]  != "" } {
  unsupported "Embedding spu binary failed."
  return -1
}
if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } {
  unsupported "Compiling ppu binary failed."
  return -1
}

if [get_compiler_info] {
  return -1
}

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

if ![runto_main] then {
  fail "Can't run to main"
  return 0
}

# Continue to SPU
cont_spu_main

gdb_test "info registers r2"  \
	 "r2.*\{uint128 =.*v2_int64 =.*v4_int32 =.*v8_int16 =.*v16_int8 =.*v2_double =.*v4_float =.*\}.*" \
	 "info registers r2"

for {set check_reg 10} {$check_reg < 12} {incr check_reg} {
  gdb_test "print \$r$check_reg\.v4_int32" \
	   ".*= \{.*,.*,.*,.*\}" \
	   "print \$r$check_reg\.v4_int32"

  gdb_test "ptype \$r$check_reg" \
	   "type = union __spu_builtin_type_vec128.*\{.*int128_t uint128.* \
	    int64_t v2_int64.*int32_t v4_int32.*int16_t v8_int16.* \
	    int8_t v16_int8.*double v2_double.*float v4_float.*\}" \
	   "ptype \$r$check_reg"

  gdb_test "set \$r$check_reg\.v4_int32 = {1,2,3,4}" \
	   "" \
	   "set \$r$check_reg\.v4_int32 = {1,2,3,4}"

  gdb_test "print \$r$check_reg\.v4_int32" \
	   ".*= \{.*1, 2, 3, 4.*\}" \
	   "print \$r$check_reg\.v4_int32"

  gdb_test "print \$r$check_reg.v4_int32\[0\]" \
	   ".*= 1.*" \
	   "print \$r$check_reg.v4_int32\[0\]"

  gdb_test "print \$r$check_reg.v4_int32\[1\]" \
	   ".*= 2.*" \
	   "print \$r$check_reg.v4_int32\[1\]"

  gdb_test "print \$r$check_reg.v4_int32\[2\]" \
	   ".*= 3.*" \
	   "print \$r$check_reg.v4_int32\[2\]"

  gdb_test "print \$r$check_reg.v4_int32\[3\]" \
	   ".*= 4.*" \
	   "print \$r$check_reg.v4_int32\[3\]"

  gdb_test "print \$r$check_reg.v4_int32\[4\]" \
	   "no such vector element" \
	   "print \$r$check_reg.v4_int32\[4\]"

  # Set single array elements to other values and check the results.
  gdb_test "set \$r$check_reg\.v4_int32\[0\] = 5" \
	   "" \
	   "set \$r$check_reg\.v4_int32\[0\] = 5"
  gdb_test "print \$r$check_reg.v4_int32\[0\]" \
	   ".*= 5.*" \
	   "print \$r$check_reg.v4_int32\[0\]"

  gdb_test "set \$r$check_reg\.v4_int32\[1\] = 6" \
	   "" \
	   "set \$r$check_reg\.v4_int32\[1\] = 6"
  gdb_test "print \$r$check_reg.v4_int32\[1\]" \
	   ".*= 6.*" \
	   "print \$r$check_reg.v4_int32\[1\]"

  gdb_test "set \$r$check_reg\.v4_int32\[2\] = 7" \
	   "" \
	   "set \$r$check_reg\.v4_int32\[2\] = 7"
  gdb_test "print \$r$check_reg.v4_int32\[2\]" \
	   ".*= 7.*" \
	   "print \$r$check_reg.v4_int32\[2\]"

  gdb_test "set \$r$check_reg\.v4_int32\[3\] = 8" \
	   "" \
	   "set \$r$check_reg\.v4_int32\[3\] = 8"
  gdb_test "print \$r$check_reg.v4_int32\[3\]" \
	   ".*= 8.*" \
	   "print \$r$check_reg.v4_int32\[3\]"

  # Now there should be {5, 6, 7, 8} in that array.
  gdb_test "print \$r$check_reg\.v4_int32" \
	   ".*= \{.*5, 6, 7, 8.*\}" \
	   "print \$r$check_reg\.v4_int32"
}

gdb_exit
return 0
