# Copyright 2007 Cavium Networks, 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.  

# Test single-step on bbit.  

if ![istarget "*octeon*"] {
  return -1
}

proc current_insn {} {
    global gdb_prompt

    send_gdb "x/i \$pc\n"
    gdb_expect {
	-re ".*?:\\s+\(.*?\)\\s*$gdb_prompt $" {
	    set insn $expect_out(1,string)
	    return $insn
	}
    }
    return ""
}

proc single_step {} {
    global gdb_prompt

    send_gdb "si\n"
    gdb_expect {
	-re "$gdb_prompt \$" {
	    return 1
	}
    }
    return 0;
}

proc single_step_until { match } {
    global timeout

    set insn [current_insn]
    set start [timestamp]
    while { $insn != "" && [timestamp] - $start < 3*$timeout } {
	if [regexp $match $insn] {
	    return 1
	}
	if {![single_step]} {
	    return 0
	}
	set insn [current_insn]
    }
    return 0;
}

proc test_bbit { name taken } {
    if {![single_step_until "bbit"]} {
	fail "$name single-step until bbit"
	return
    }
    pass "$name single-step until bbit"
    gdb_test "si" "" "$name single-step on bbit"
    if [regexp "li\\s+\[sv\]0,$taken" [current_insn]] {
	pass "$name check insn after bbit"
    } else {
	send_log "expected: li\\s+\[sv\]0,$taken found [current_insn]\n"
	fail "$name check insn after bbit"
    }
}

set testfile "mips-octeon-bbit"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \
       {debug nowarnings}] != "" } {
     fail "compilation"
     return
}

pass "compilation"

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
# Native needs run.
runto_main

set tests ""
foreach n [list "0_10" "0_36" "1_20" "1_49"] {
    lappend tests "bbit_is_taken_$n"
}
foreach func $tests {
    gdb_test "break $func" "Breakpoint.*at.*" "set breakpoint on $func"
}

foreach func $tests {
    gdb_test "continue" "Continuing.*Breakpoint.*$func.*" "hit $func first"
    test_bbit "$func branch taken" 1
    gdb_test "continue" "Continuing.*Breakpoint.*$func.*" "hit $func second"
    test_bbit "$func branch not taken" 0
}
