# Tests of wide register displays for GDB on HPPA 2.0 machines
#   Copyright 1994, 1995, 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/>.  */

# use this to debug:
#log_user 1

if $tracelevel {
    strace $tracelevel
}

if { [skip_hp_tests] } { continue }

if ![istarget "hppa*-*-*"] {
    verbose "Wide register test ignored for non-hppa targets."
    return 0
}

if ![istarget "hppa64-hp-hpux*"] {
    verbose "reg-pa64.exp is only for PA2.0W (aka PA64)."
    return 0
}

set testfile "reg-pa64"
set srcfile ${testfile}.s
set binfile ${objdir}/${subdir}/${testfile}

# To build a pa 2.0 executable
#
#     as +DA2.0W -o reg-pa64 reg-pa64.s
# or 
#     cc +DA2.0W -g -o reg-pa64 reg-pa64.s
#
# Don't reject if there are warnings, as we expect this warning:
#
#    (Warning) At least one PA 2.0 object file (pa2.0_test2.o) was detected.
#    The linked output may not run on a PA 1.x system.
#

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested reg-pa64.exp
    return -1
}

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

# test machine--there's no 2.0n architecture, so we have
# to try to run the app.
#
gdb_test "break main" "Breakpoint.*" "initial set-up"

send_gdb "run\n"
gdb_expect {
    -re ".*Executable file incompatible with hardware.*$gdb_prompt $" {
        # Not hppa2.0 machine
        #
        return 0
    }
    -re "Cannot exec.*$gdb_prompt $" {
        # Not hppa2.0 machine
        #
        return 0
    }
    -re ".*Starting program:.*$gdb_prompt $" {
        pass "Ready to start test"
    }
    timeout {
        fail "initial set-up, part 2 (timeout)"
        return 0
    }
}

# Let the program set known values.  This secretly deletes
# the breakpoint at main and re-runs to mainend.
#
runto mainend

# Look for known values
#
gdb_test "info reg r1"  "r1 1"
gdb_test "info reg r4"  "r4 2"
gdb_test "info reg r5"  "r5 4"
gdb_test "info reg r6"  "r6 8"
gdb_test "info reg r7"  "r7 10"
gdb_test "info reg r8"  "r8 20"
gdb_test "info reg r9"  "r9 40"
gdb_test "info reg r10" "r10 80"
gdb_test "info reg r11" "r11 100"
gdb_test "info reg r12" "r12 200"
gdb_test "info reg r13" "r13 400"
gdb_test "info reg r14" "r14 800"
gdb_test "info reg r15" "r15 1000"
gdb_test "info reg r16" "r16 2000"

# Two odd variants that GDB supports are:
#   "1" means "r1", and
#   "$1" means "r1"
#
gdb_test "info reg 1 4" "r1 1.*r4 2"
gdb_test "info reg \$1" "r1 1"

# Verify that GDB responds gracefully to a register ID number that
# is out of range.
#
gdb_test "info reg 999" "999: invalid register"

# Make sure the floating point status and error registers
# don't show up as floating point numbers!
#
gdb_test "info reg fpsr" ".*fpsr 0.*" "fpsr"
gdb_test "info reg fpe1" ".*fpe1 .*" "fpe1"
gdb_test "info reg fpe2" ".*fpe2 .*" "fpe2"
gdb_test "info reg fpe3" ".*fpe3 .*" "fpe3"
#DTS CLLbs16708
#info reg should recognize fpe4..fpe7.
setup_xfail hppa64-hp-hpux* CLLbs16708
gdb_test "info reg fpe4" ".*fpe4 .*" "fpe4"
setup_xfail hppa64-hp-hpux* CLLbs16708
gdb_test "info reg fpe5" ".*fpe5 .*" "fpe5"
setup_xfail hppa64-hp-hpux* CLLbs16708
gdb_test "info reg fpe6" ".*fpe6 .*" "fpe6"
setup_xfail hppa64-hp-hpux* CLLbs16708
gdb_test "info reg fpe7" ".*fpe7 .*" "fpe7"

gdb_test "info reg fr4"  ".*fr4.*(double precision).* 1.*"
gdb_test "info reg fr5"  ".*fr5.*(double precision).* 2.*"
gdb_test "info reg fr6"  ".*fr6.*(double precision).* 2.*"
gdb_test "info reg fr7"  ".*fr7.*(double precision).* 4.*"
gdb_test "info reg fr8"  ".*fr8.*(double precision).* 8.*"
gdb_test "info reg fr9"  ".*fr9.*(double precision).* 32.*"
gdb_test "info reg fr10" ".*fr10.*(double precision).* 256.*"

gdb_test "info reg r19" "r19 deadbeefbadcadee"

# Need to add test of use of $<register-name>
#
# Q: How do you say a literal "$" in expect?
# A: You say "\$".   A literal "\" is "\\".
#
# Please note that this test will fail as long as we are running
# in 32-bit mode: it will produce "$1 = 0xbadcadee".  To fix it
# would require building a real 64-bit gdb (expression evaluation, 
# in particular).
#
send_gdb "p/x \$r19\n"
gdb_expect {
    -re ".*= 0xdeadbeefbadcadee.*$gdb_prompt $" {
        pass "64-bit works"
    }
    -re ".*= 0xbadcadee.*$gdb_prompt $" {
        pass "32-bit extract when using PRINT; expected but not good"
    }
    -re ".*$gdb_prompt $" {
        fail "didn't print any part of right value"
    }
    timeout {
        fail "timeout on print"
    }
}

# Need to add tests of setting wide regs too.  E.g.
#
# set $r4 = 0x1234567890123456
# p/x $r4
#

# done
#
gdb_exit

return 0
