# Copyright (C) 1998 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# Tests of wide register displays for GDB on HPPA 2.0 machines

# use this to debug:
#log_user 1

if $tracelevel then {
	strace $tracelevel
	}

if { [skip_hp_tests] } then { continue }

set testfile "reg"

if [istarget "hppa2.0w-hp-hpux*"] {
    verbose "reg.exp is not for PA2.0W."
    return 0
}
set srcfile ${testfile}.s
set binfile ${objdir}/${subdir}/${testfile}

# To build a pa 2.0 executable
#
#     as -o reg reg.s
# or 
#     cc -g -o reg reg.s
#
# The +DA2.0N flag doesn't seem to be needed.
#
# 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}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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.
#
send_gdb "break main\n"
    gdb_expect {
        -re "Breakpoint.*$gdb_prompt $" {
            pass "initial set-up"
        }
        -re ".*$gdb_prompt $" {
            fail "initial set-up"
        }
        timeout {
            fail "initial set-up (timeout)"
        }
    }

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 0.*" "fpe1"
gdb_test "info reg fpe2" ".*fpe2 0.*" "fpe2"
gdb_test "info reg fpe3" ".*fpe3 0.*" "fpe3"
gdb_test "info reg fpe4" ".*fpe4 0.*" "fpe4"
gdb_test "info reg fpe5" ".*fpe5 0.*" "fpe5"
gdb_test "info reg fpe6" ".*fpe6 0.*" "fpe6"
gdb_test "info reg fpe7" ".*fpe7 0.*" "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
