# Copyright 2010, 2011 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

# This file is part of the gdb testsuite.

if $tracelevel {
    strace $tracelevel
}


if {(![istarget "x86_64-*-*"] && ![istarget "i?86-*-*"]) || ![is_ilp32_target] } then {
    verbose "Skipping i386 byte register tests."
    return
}

set testfile "i386-byte"
set srcfile i386-pseudo.c
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info ${binfile}] {
    return -1
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug]] != "" } {
    untested ${testfile}
    return
}

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

if ![runto_main] then {
    gdb_suppress_tests
}

set byte_regs(1) al
set byte_regs(2) bl
set byte_regs(3) cl
set byte_regs(4) dl
set byte_regs(5) ah
set byte_regs(6) bh
set byte_regs(7) ch
set byte_regs(8) dh

gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
         "Breakpoint .* at .*${srcfile}.*" \
         "set first breakpoint in main"
gdb_continue_to_breakpoint "continue to first breakpoint in main"

for { set r 1 } { $r <= 4  } { incr r } {
    gdb_test "print/x \$$byte_regs($r)" \
        ".. = 0x[format %x $r]1" \
        "check contents of %$byte_regs($r)"
    set h [expr $r + 4]
    gdb_test "print/x \$$byte_regs($h)" \
        ".. = 0x[format %x $r]2" \
        "check contents of %$byte_regs($h)"
}

for { set r 1 } { $r <= 4  } { incr r } {
  gdb_test "set var \$$byte_regs($r) = $r" "" "set %$byte_regs($r)"
  set h [expr $r + 4]
  gdb_test "set var \$$byte_regs($h) = $h" "" "set %$byte_regs($h)"
}

gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
         "Breakpoint .* at .*${srcfile}.*" \
         "set second breakpoint in main"
gdb_continue_to_breakpoint "continue to second breakpoint in main"

for { set r 1 } { $r <= 4  } { incr r } {
    gdb_test "print \$$byte_regs($r)" \
        ".. = $r" \
        "check contents of %$byte_regs($r)"
    set h [expr $r + 4]
    gdb_test "print \$$byte_regs($h)" \
        ".. = $h" \
        "check contents of %$byte_regs($h)"
}
