#   Copyright 2004, 2007, 2009
#   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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.

if {![istarget "arm*-*-*"]} then {
  return
}

if {![is_remote host] && [which $OBJDUMP] == 0} then {
    perror "$OBJDUMP does not exist"
    return
}

send_user "Version [binutil_version $OBJDUMP]"

###########################
# Set up the test of movem.s
###########################

if {![binutils_assemble $srcdir/$subdir/thumb2-cond.s tmpdir/thumb2-cond.o]} then {
    return
}

if [is_remote host] {
    set objfile [remote_download host tmpdir/thumb2-cond.o]
} else {
    set objfile tmpdir/thumb2-cond.o
}

# Make sure that conditional instructions are correctly decoded.

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble --start-address=6 $objfile"]

set want "bcc.w\[ \t\]*e12.*bx\[ \t\]*lr"

if [regexp $want $got] then {
    pass "thumb2-cond test1"
} else {
    fail "thumb2-cond test1"
}

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble --start-address=10 $objfile"]

set want "bx\[ \t\]*lr"

if [regexp $want $got] then {
    pass "thumb2-cond test2"
} else {
    fail "thumb2-cond test2"
}

###########################
# Set up the test of multiple disassemblies
###########################

if {![binutils_assemble $srcdir/$subdir/simple.s tmpdir/simple.o]} then {
    return
}

if [is_remote host] {
    set objfile [remote_download host tmpdir/simple.o]
} else {
    set objfile tmpdir/simple.o
}

# Make sure multiple disassemblies come out the same

set got [binutils_run $OBJDUMP "-dr $objfile $objfile"]

set want "$objfile:\[ \]*file format.*$objfile:\[ \]*file format.*push.*add.*sub.*str.*add.*ldmfd"

if [regexp $want $got] then {
    pass "multiple input files"
} else {
    fail "multiple input files"
}
