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

# 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
