# Copyright 2009-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/>.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
#
# Testsuite for Cell Broadband Engine combined debugger
# This testcase tests registers on PPU and SPU.

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}

# No programm running, no registers should be available.
gdb_test "info all-registers" \
	  "The program has no registers now." \
	  "info all-registers"

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

# Check registers in PPU thread.
gdb_test "info reg r0" "r0.*" "info register r0"
gdb_test "info reg r31" "r31.*" "info register r31"
gdb_test "info reg r32" "Invalid register.*r32.*" "(invalid) info register r32"
gdb_test "info reg pc" "pc.*" "info register pc"
gdb_test "info reg cr" "cr.*" "info register cr"
gdb_test "info reg lr" "lr.*" "info register lr"
gdb_test "info reg ctr" "ctr.*" "info register ctr"
gdb_test "info reg xer" "xer.*" "info register xer"

# Continue to SPU thread.
cont_spu_main

# In SPU thread, check SPU registers.
for {set check_reg 0} {$check_reg < 128} {incr check_reg} {
  gdb_test "info reg r$check_reg" \
	   "r$check_reg.*uint128.*=.*v2\_int64.*v4\_int32.*v8\_int16.*v16\_int8.*v2\_double.*v4\_float.*" \
	   "info register r$check_reg"
}
gdb_test "info reg r128" \
	 "Invalid register.*r128.*" \
	 "(invalid) info register r128"

gdb_test "info reg pc" "pc.*main.*" "info register pc"
gdb_test "info reg id" "id.*" "info register id"
gdb_test "info reg sp" "sp.*" "info register sp"
gdb_test "info reg fpscr" "fpscr.*" "info register fpscr"
gdb_test "info reg srr0" "srr0.*" "info register srr0"
gdb_test "info reg lslr" "lslr.*" "info register lslr"
gdb_test "info reg decr" "decr.*" "info register decr"
gdb_test "info reg decr_status" "decr_status.*" "info register decr-status"

gdb_test "info reg cr" "Invalid register.*cr.*" "info register cr"
gdb_test "info reg lr" "Invalid register.*lr.*" "info register lr"
gdb_test "info reg ctr" "Invalid register.*ctr.*" "info register ctr"
gdb_test "info reg xer" "Invalid register.*xer.*" "info register xer"

gdb_exit
return 0
