# 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 word register tests."
    return
}

set testfile "i386-word"
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 word_regs(1) ax
set word_regs(2) bx
set word_regs(3) cx
set word_regs(4) dx

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 \$$word_regs($r)" \
        ".. = 0x[format %x $r]2[format %x $r]1" \
        "check contents of %$word_regs($r)"
}

for { set r 1 } { $r <= 4  } { incr r } {
  gdb_test "set var \$$word_regs($r) = $r" "" "set %$word_regs($r)"
}

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 \$$word_regs($r)" \
        ".. = $r" \
        "check contents of %$word_regs($r)"
}
