# Copyright 2010-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/>.

# 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 { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
    verbose "Skipping amd64 word register tests."
    return
}

set testfile "amd64-word"
set srcfile amd64-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 nr_regs 14
set word_regs(1) ax
set word_regs(2) bx
set word_regs(3) cx
set word_regs(4) dx
set word_regs(5) si
set word_regs(6) di
set word_regs(7) r8w
set word_regs(8) r9w
set word_regs(9) r10w
set word_regs(10) r11w
set word_regs(11) r12w
set word_regs(12) r13w
set word_regs(13) r14w
set word_regs(14) r15w

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 <= 6  } { incr r } {
    set hexr [format %x $r]
    gdb_test "print/x \$$word_regs($r)" \
        ".. = 0x${hexr}2${hexr}1" \
        "check contents of %$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 7 } { $r <= $nr_regs  } { incr r } {
    set hexr [format %x $r]
    gdb_test "print/x \$$word_regs($r)" \
        ".. = 0x${hexr}2${hexr}1" \
        "check contents of %$word_regs($r)"
}

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

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

for { set r 1 } { $r <= 6  } { incr r } {
    gdb_test "print \$$word_regs($r)" \
        ".. = $r" \
        "check contents of %$word_regs($r)"
}

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

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

for { set r 7 } { $r <= $nr_regs  } { incr r } {
    gdb_test "print \$$word_regs($r)" \
        ".. = $r" \
        "check contents of %$word_regs($r)"
}
