# This testcase is part of GDB, the GNU debugger.

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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# Testcase for ppc decimal128 pseudo-registers.

if ![istarget "powerpc64-*"] then {
    verbose "Skipping powerpc Decimal128 pseudo-registers testcase."
    return
}

set testfile "powerpc-d128-regs"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } {
     untested powerpc-d128-regs.exp
     return -1
}

# Start with a fresh gdb.

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

if { ![runto main] } then {
   fail "run to main"
   return
}

if [gdb_test "show arch" ".*currently powerpc:common.*" "Checking for PPC arch"] {
    return -1;
}

gdb_test "next" ""

for {set i 0} {$i < 16} {incr i 1} {
gdb_test "set \$dl$i=d128" "" "Set dl$i register"

gdb_test "print \$dl$i" "\\\$$decimal = 1\.2345678910" "Print dl$i register as DFP"

gdb_test "info reg dl$i" \
	 "dl$i\[ \]*1\.2345678910\[\t\]*\\(raw 0x2205800000000000000000049c5de09c\\)" \
	 "Print dl$i register with the info reg command"

gdb_test "info reg f[expr 2*$i]" \
	 "f[expr 2*$i]\[ \]*8\.608957309287334e\-145\[\t\]*\\(raw 0x2205800000000000\\)" \
	 "Testing lower half of dl$i register"

gdb_test "info reg f[expr 2*$i+1]" \
	 "f[expr 2*$i+1]\[ \]*9\.7841140127686122e\-314\[\t\]*\\(raw 0x000000049c5de09c\\)" \
	 "Testing upper half of dl$i register"

}
