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

# use this to debug:
#log_user 1

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
