# Copyright 1997, 1998, 2007, 2008, 2009, 2010 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/>.

# This file was written by Jeff Law. (law@cygnus.com)

if $tracelevel then {
	strace $tracelevel
}

if ![istarget "mn10300*-*-*"] {
    verbose "Tests ignored for all but mn10300 based targets."
    return
}

global exec_output
set prms_id 0
set bug_id 0

set testfile "am33"
set srcfile ${srcdir}/${subdir}/${testfile}.s
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcfile}" "${binfile}" object ""] != "" } {
     untested am33.exp
     return -1
}

proc call_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/8i call_tests\n"
    gdb_expect {
	-re "
.*call	.*,.a2,a3,exreg0.,9.*
.*call	.*,.a2,a3,exreg1.,9.*
.*call	.*,.a2,a3,exother.,9.*
.*call	.*,.d2,d3,a2,a3,other,exreg0,exreg1,exother.,9.*
.*call	.*,.a2,a3,exreg0.,9.*
.*call	.*,.a2,a3,exreg1.,9.*
.*call	.*,.a2,a3,exother.,9.*
.*call	.*,.d2,d3,a2,a3,other,exreg0,exreg1,exother.,9.*
.*$gdb_prompt $" { pass "call tests" }
	-re "$gdb_prompt $" { fail "call tests" }
	timeout { fail "(timeout) call tests" }
    }
}

proc movm_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/16i movm_tests\n"
    gdb_expect {
	-re "
.*movm	\\(sp\\),.a2,a3,exreg0.*
.*movm	\\(sp\\),.a2,a3,exreg1.*
.*movm	\\(sp\\),.a2,a3,exother.*
.*movm	\\(sp\\),.d2,d3,a2,a3,other,exreg0,exreg1,exother.*
.*movm	.a2,a3,exreg0.,\\(sp\\).*
.*movm	.a2,a3,exreg1.,\\(sp\\).*
.*movm	.a2,a3,exother.,\\(sp\\).*
.*movm	.d2,d3,a2,a3,other,exreg0,exreg1,exother.,\\(sp\\).*
.*movm	\\(usp\\),.a2,a3,exreg0.*
.*movm	\\(usp\\),.a2,a3,exreg1.*
.*movm	\\(usp\\),.a2,a3,exother.*
.*movm	\\(usp\\),.d2,d3,a2,a3,other,exreg0,exreg1,exother.*
.*movm	.a2,a3,exreg0.,\\(usp\\).*
.*movm	.a2,a3,exreg1.,\\(usp\\).*
.*movm	.a2,a3,exother.,\\(usp\\).*
.*movm	.d2,d3,a2,a3,other,exreg0,exreg1,exother.,\\(usp\\).*
.*$gdb_prompt $" { pass "movm tests" }
	-re "$gdb_prompt $" { fail "movm tests" }
	timeout { fail "(timeout) movm tests" }
    }
}

proc misc_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/11i misc_tests\n"
    gdb_expect {
	-re "
.*syscall	4.*
.*mcst9	d0.*
.*mcst48	d1.*
.*getchx	d0.*
.*getclx	d1.*
.*clr	a1.*
.*sat16	a1,a0.*
.*mcste	r7,r6.*
.*swap	r5,r4.*
.*swaph	r3,r2.*
.*swhw	r1,r0.*
.*$gdb_prompt $" { pass "misc tests" }
	-re "$gdb_prompt $" { fail "misc tests" }
	timeout { fail "(timeout) misc tests" }
    }
}

proc mov_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/45i mov_tests\n"
    gdb_expect {
	-re "
.*mov	r0,r1.*
.*mov	sp,r1.*
.*mov	r1,xr2.*
.*mov	\\(r1\\),r2.*
.*mov	r3,\\(r4\\).*
.*mov	\\(sp\\),r5.*
.*mov	r6,\\(sp\\).*
.*mov	16,r1.*
.*mov	16,xr1.*
.*mov	\\(16,r1\\),r2.*
.*mov	r2,\\(16,r1\\).*
.*mov	\\(16,sp\\),r2.*
.*mov	r2,\\(16,sp\\).*
.*mov	2096895,r2.*
.*mov	2096895,xr2.*
.*mov	\\(2096895,r1\\),r2.*
.*mov	r2,\\(2096895,r1\\).*
.*mov	\\(2096895,sp\\),r2.*
.*mov	r2,\\(2096895,sp\\).*
.*mov	\\(0x1ffeff\\),r2.*
.*mov	r2,\\(0x1ffeff\\).*
.*mov	2147417596,r2.*
.*mov	2147417596,xr2.*
.*mov	\\(2147417596,r1\\),r2.*
.*mov	r2,\\(2147417596,r1\\).*
.*mov	\\(2147417596,sp\\),r2.*
.*mov	r2,\\(2147417596,sp\\).*
.*mov	\\(0x7ffefdfc\\),r2.*
.*mov	r2,\\(0x7ffefdfc\\).*
.*movu	16,r1.*
.*movu	2096895,r2.*
.*movu	2147417596,r2.*
.*mov	usp,a0.*
.*mov	ssp,a1.*
.*mov	msp,a2.*
.*mov	pc,a3.*
.*mov	a0,usp.*
.*mov	a1,ssp.*
.*mov	a2,msp.*
.*mov	epsw,d0.*
.*mov	d1,epsw.*
.*mov	a0,r1.*
.*mov	d2,r3.*
.*mov	r5,a1.*
.*mov	r7,d3.*
.*$gdb_prompt $" { pass "mov tests" }
	-re "$gdb_prompt $" { fail "mov tests" }
	timeout { fail "(timeout) mov tests" }
    }
}

proc ext_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/5i ext_tests\n"
    gdb_expect {
	-re "
.*ext	r2.*
.*extb	r3,r4.*
.*extbu	r4,r5.*
.*exth	r6,r7.*
.*exthu	r7,a0.*
.*$gdb_prompt $" { pass "ext tests" }
	-re "$gdb_prompt $" { fail "ext tests" }
	timeout { fail "(timeout) ext tests" }
    }
}

proc add_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/11i add_tests\n"
    gdb_expect {
	-re "
.*add	a2,a3.*
.*add	16,r1.*
.*add	2096895,r2.*
.*add	2147417596,r2.*
.*add	r1,r2,r3.*
.*addc	d0,d1.*
.*addc	16,r1.*
.*addc	2096895,r2.*
.*addc	2147417596,r2.*
.*inc	d1.*
.*inc4	d0.*
.*$gdb_prompt $" { pass "add tests" }
	-re "$gdb_prompt $" { fail "add tests" }
	timeout { fail "(timeout) add tests" }
    }
}

proc sub_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/8i sub_tests\n"
    gdb_expect {
	-re "
.*sub	d2,d3.*
.*sub	16,r1.*
.*sub	2096895,r2.*
.*sub	2147417596,r2.*
.*subc	d3,d2.*
.*subc	16,r1.*
.*subc	2096895,r2.*
.*subc	2147417596,r2.*
.*$gdb_prompt $" { pass "sub tests" }
	-re "$gdb_prompt $" { fail "sub tests" }
	timeout { fail "(timeout) sub tests" }
    }
}

proc cmp_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/4i cmp_tests\n"
    gdb_expect {
	-re "
.*cmp	a3,a2.*
.*cmp	16,r1.*
.*cmp	2096895,r2.*
.*cmp	2147417596,r2.*
.*$gdb_prompt $" { pass "cmp tests" }
	-re "$gdb_prompt $" { fail "cmp tests" }
	timeout { fail "(timeout) cmp tests" }
    }
}

proc logical_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/15i logical_tests\n"
    gdb_expect {
	-re "
.*and	r0,r1.*
.*or	r2,r3.*
.*xor	r4,r5.*
.*not	r6.*
.*and	16,r1.*
.*or	16,r1.*
.*xor	16,r1.*
.*and	2096895,r2.*
.*or	2096895,r2.*
.*xor	2096895,r2.*
.*and	2147417596,r2.*
.*or	2147417596,r2.*
.*xor	2147417596,r2.*
.*and	131072,epsw.*
.*or	65535,epsw.*
.*$gdb_prompt $" { pass "logical tests" }
	-re "$gdb_prompt $" { fail "logical tests" }
	timeout { fail "(timeout) logical tests" }
    }
}

proc shift_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/15i shift_tests\n"
    gdb_expect {
	-re "
.*asr	r7,a0.*
.*lsr	a1,a2.*
.*asl	a3,d0.*
.*asl2	d1.*
.*ror	d2.*
.*rol	d3.*
.*asr	16,r1.*
.*lsr	16,r1.*
.*asl	16,r1.*
.*asr	2096895,r2.*
.*lsr	2096895,r2.*
.*asl	2096895,r2.*
.*asr	2147417596,r2.*
.*lsr	2147417596,r2.*
.*asl	2147417596,r2.*
.*$gdb_prompt $" { pass "shift tests" }
	-re "$gdb_prompt $" { fail "shift tests" }
	timeout { fail "(timeout) shift tests" }
    }
}

proc muldiv_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/16i muldiv_tests\n"
    gdb_expect {
	-re "
.*mul	r1,r2.*
.*mulu	r3,r4.*
.*mul	16,r1.*
.*mulu	16,r1.*
.*mul	2096895,r2.*
.*mulu	2096895,r2.*
.*mul	2147417596,r2.*
.*mulu	2147417596,r2.*
.*div	r5,r6.*
.*divu	r7,a0.*
.*dmulh	d1,d0.*
.*dmulhu	a3,a2.*
.*dmulh	2147417596,r2.*
.*dmulhu	2147417596,r2.*
.*mul	r1,r2,r3,r4.*
.*mulu	r1,r2,r3,r4.*
.*$gdb_prompt $" { pass "muldiv tests" }
	-re "$gdb_prompt $" { fail "muldiv tests" }
	timeout { fail "(timeout) muldiv tests" }
    }
}

proc movbu_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/20i movbu_tests\n"
    gdb_expect {
	-re "
.*movbu	\\(r5\\),r6.*
.*movbu	r7,\\(a0\\).*
.*movbu	\\(sp\\),r7.*
.*movbu	a0,\\(sp\\).*
.*movbu	\\(16,r1\\),r2.*
.*movbu	r2,\\(16,r1\\).*
.*movbu	\\(16,sp\\),r2.*
.*movbu	r2,\\(16,sp\\).*
.*movbu	\\(2096895,r1\\),r2.*
.*movbu	r2,\\(2096895,r1\\).*
.*movbu	\\(2096895,sp\\),r2.*
.*movbu	r2,\\(2096895,sp\\).*
.*movbu	\\(0x1ffeff\\),r2.*
.*movbu	r2,\\(0x1ffeff\\).*
.*movbu	\\(2147417596,r1\\),r2.*
.*movbu	r2,\\(2147417596,r1\\).*
.*movbu	\\(2147417596,sp\\),r2.*
.*movbu	r2,\\(2147417596,sp\\).*
.*movbu	\\(0x7ffefdfc\\),r2.*
.*movbu	r2,\\(0x7ffefdfc\\).*
.*$gdb_prompt $" { pass "movbu tests" }
	-re "$gdb_prompt $" { fail "movbu tests" }
	timeout { fail "(timeout) movbu tests" }
    }
}

proc movhu_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/20i movhu_tests\n"
    gdb_expect {
	-re "
.*movhu	\\(a1\\),a2.*
.*movhu	a3,\\(d0\\).*
.*movhu	\\(sp\\),a1.*
.*movhu	a2,\\(sp\\).*
.*movhu	\\(16,r1\\),r2.*
.*movhu	r2,\\(16,r1\\).*
.*movhu	\\(16,sp\\),r2.*
.*movhu	r2,\\(16,sp\\).*
.*movhu	\\(2096895,r1\\),r2.*
.*movhu	r2,\\(2096895,r1\\).*
.*movhu	\\(2096895,sp\\),r2.*
.*movhu	r2,\\(2096895,sp\\).*
.*movhu	\\(0x1ffeff\\),r2.*
.*movhu	r2,\\(0x1ffeff\\).*
.*movhu	\\(2147417596,r1\\),r2.*
.*movhu	r2,\\(2147417596,r1\\).*
.*movhu	\\(2147417596,sp\\),r2.*
.*movhu	r2,\\(2147417596,sp\\).*
.*movhu	\\(0x7ffefdfc\\),r2.*
.*movhu	r2,\\(0x7ffefdfc\\).*
.*$gdb_prompt $" { pass "movhu tests" }
	-re "$gdb_prompt $" { fail "movhu tests" }
	timeout { fail "(timeout) movhu tests" }
    }
}

proc mac_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/28i mac_tests\n"
    gdb_expect {
	-re "
.*mac	r1,r2.*
.*macu	r3,r4.*
.*macb	r5,r6.*
.*macbu	r7,a0.*
.*mach	a1,a2.*
.*machu	a3,d0.*
.*dmach	d1,d2.*
.*dmachu	d3,d2.*
.*mac	16,r1.*
.*macu	16,r1.*
.*macb	16,r1.*
.*macbu	16,r1.*
.*mach	16,r1.*
.*machu	16,r1.*
.*mac	2096895,r2.*
.*macu	2096895,r2.*
.*macb	2096895,r2.*
.*macbu	2096895,r2.*
.*mach	2096895,r2.*
.*machu	2096895,r2.*
.*mac	2147417596,r2.*
.*macu	2147417596,r2.*
.*macb	2147417596,r2.*
.*macbu	2147417596,r2.*
.*mach	2147417596,r2.*
.*machu	2147417596,r2.*
.*dmach	2147417596,r2.*
.*dmachu	2147417596,r2.*
.*$gdb_prompt $" { pass "mac tests" }
	-re "$gdb_prompt $" { fail "mac tests" }
	timeout { fail "(timeout) mac tests" }
    }
}

proc bit_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/4i bit_tests\n"
    gdb_expect {
	-re "
.*bsch	r1,r2.*
.*btst	16,r1.*
.*btst	2096895,r2.*
.*btst	2147417596,r2.*
.*$gdb_prompt $" { pass "bit tests" }
	-re "$gdb_prompt $" { fail "bit tests" }
	timeout { fail "(timeout) bit tests" }
    }
}

proc dsp_add_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/28i dsp_add_tests\n"
    gdb_expect {
	-re "
.*add_add	r4,r1,r2,r3.*
.*add_add	r4,r1,2,r3.*
.*add_sub	r4,r1,r2,r3.*
.*add_sub	r4,r1,2,r3.*
.*add_cmp	r4,r1,r2,r3.*
.*add_cmp	r4,r1,2,r3.*
.*add_mov	r4,r1,r2,r3.*
.*add_mov	r4,r1,2,r3.*
.*add_asr	r4,r1,r2,r3.*
.*add_asr	r4,r1,2,r3.*
.*add_lsr	r4,r1,r2,r3.*
.*add_lsr	r4,r1,2,r3.*
.*add_asl	r4,r1,r2,r3.*
.*add_asl	r4,r1,2,r3.*
.*add_add	4,r1,r2,r3.*
.*add_add	4,r1,2,r3.*
.*add_sub	4,r1,r2,r3.*
.*add_sub	4,r1,2,r3.*
.*add_cmp	4,r1,r2,r3.*
.*add_cmp	4,r1,2,r3.*
.*add_mov	4,r1,r2,r3.*
.*add_mov	4,r1,2,r3.*
.*add_asr	4,r1,r2,r3.*
.*add_asr	4,r1,2,r3.*
.*add_lsr	4,r1,r2,r3.*
.*add_lsr	4,r1,2,r3.*
.*add_asl	4,r1,r2,r3.*
.*add_asl	4,r1,2,r3.*
.*$gdb_prompt $" { pass "dsp_add tests" }
	-re "$gdb_prompt $" { fail "dsp_add tests" }
	timeout { fail "(timeout) dsp_add tests" }
    }
}

proc dsp_cmp_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/24i dsp_cmp_tests\n"
    gdb_expect {
	-re "
.*cmp_add	r4,r1,r2,r3.*
.*cmp_add	r4,r1,2,r3.*
.*cmp_sub	r4,r1,r2,r3.*
.*cmp_sub	r4,r1,2,r3.*
.*cmp_mov	r4,r1,r2,r3.*
.*cmp_mov	r4,r1,2,r3.*
.*cmp_asr	r4,r1,r2,r3.*
.*cmp_asr	r4,r1,2,r3.*
.*cmp_lsr	r4,r1,r2,r3.*
.*cmp_lsr	r4,r1,2,r3.*
.*cmp_asl	r4,r1,r2,r3.*
.*cmp_asl	r4,r1,2,r3.*
.*cmp_add	4,r1,r2,r3.*
.*cmp_add	4,r1,2,r3.*
.*cmp_sub	4,r1,r2,r3.*
.*cmp_sub	4,r1,2,r3.*
.*cmp_mov	4,r1,r2,r3.*
.*cmp_mov	4,r1,2,r3.*
.*cmp_asr	4,r1,r2,r3.*
.*cmp_asr	4,r1,2,r3.*
.*cmp_lsr	4,r1,r2,r3.*
.*cmp_lsr	4,r1,2,r3.*
.*cmp_asl	4,r1,r2,r3.*
.*cmp_asl	4,r1,2,r3.*
.*$gdb_prompt $" { pass "dsp_cmp tests" }
	-re "$gdb_prompt $" { fail "dsp_cmp tests" }
	timeout { fail "(timeout) dsp_cmp tests" }
    }
}

proc dsp_sub_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/28i dsp_sub_tests\n"
    gdb_expect {
	-re "
.*sub_add	r4,r1,r2,r3.*
.*sub_add	r4,r1,2,r3.*
.*sub_sub	r4,r1,r2,r3.*
.*sub_sub	r4,r1,2,r3.*
.*sub_cmp	r4,r1,r2,r3.*
.*sub_cmp	r4,r1,2,r3.*
.*sub_mov	r4,r1,r2,r3.*
.*sub_mov	r4,r1,2,r3.*
.*sub_asr	r4,r1,r2,r3.*
.*sub_asr	r4,r1,2,r3.*
.*sub_lsr	r4,r1,r2,r3.*
.*sub_lsr	r4,r1,2,r3.*
.*sub_asl	r4,r1,r2,r3.*
.*sub_asl	r4,r1,2,r3.*
.*sub_add	4,r1,r2,r3.*
.*sub_add	4,r1,2,r3.*
.*sub_sub	4,r1,r2,r3.*
.*sub_sub	4,r1,2,r3.*
.*sub_cmp	4,r1,r2,r3.*
.*sub_cmp	4,r1,2,r3.*
.*sub_mov	4,r1,r2,r3.*
.*sub_mov	4,r1,2,r3.*
.*sub_asr	4,r1,r2,r3.*
.*sub_asr	4,r1,2,r3.*
.*sub_lsr	4,r1,r2,r3.*
.*sub_lsr	4,r1,2,r3.*
.*sub_asl	4,r1,r2,r3.*
.*sub_asl	4,r1,2,r3.*
.*$gdb_prompt $" { pass "dsp_sub tests" }
	-re "$gdb_prompt $" { fail "dsp_sub tests" }
	timeout { fail "(timeout) dsp_sub tests" }
    }
}

proc dsp_mov_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/28i dsp_mov_tests\n"
    gdb_expect {
	-re "
.*mov_add	r4,r1,r2,r3.*
.*mov_add	r4,r1,2,r3.*
.*mov_sub	r4,r1,r2,r3.*
.*mov_sub	r4,r1,2,r3.*
.*mov_cmp	r4,r1,r2,r3.*
.*mov_cmp	r4,r1,2,r3.*
.*mov_mov	r4,r1,r2,r3.*
.*mov_mov	r4,r1,2,r3.*
.*mov_asr	r4,r1,r2,r3.*
.*mov_asr	r4,r1,2,r3.*
.*mov_lsr	r4,r1,r2,r3.*
.*mov_lsr	r4,r1,2,r3.*
.*mov_asl	r4,r1,r2,r3.*
.*mov_asl	r4,r1,2,r3.*
.*mov_add	4,r1,r2,r3.*
.*mov_add	4,r1,2,r3.*
.*mov_sub	4,r1,r2,r3.*
.*mov_sub	4,r1,2,r3.*
.*mov_cmp	4,r1,r2,r3.*
.*mov_cmp	4,r1,2,r3.*
.*mov_mov	4,r1,r2,r3.*
.*mov_mov	4,r1,2,r3.*
.*mov_asr	4,r1,r2,r3.*
.*mov_asr	4,r1,2,r3.*
.*mov_lsr	4,r1,r2,r3.*
.*mov_lsr	4,r1,2,r3.*
.*mov_asl	4,r1,r2,r3.*
.*mov_asl	4,r1,2,r3.*
.*$gdb_prompt $" { pass "dsp_mov tests" }
	-re "$gdb_prompt $" { fail "dsp_mov tests" }
	timeout { fail "(timeout) dsp_mov tests" }
    }
}

proc dsp_logical_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/42i dsp_logical_tests\n"
    gdb_expect {
	-re "
.*and_add	r4,r1,r2,r3.*
.*and_add	r4,r1,2,r3.*
.*and_sub	r4,r1,r2,r3.*
.*and_sub	r4,r1,2,r3.*
.*and_cmp	r4,r1,r2,r3.*
.*and_cmp	r4,r1,2,r3.*
.*and_mov	r4,r1,r2,r3.*
.*and_mov	r4,r1,2,r3.*
.*and_asr	r4,r1,r2,r3.*
.*and_asr	r4,r1,2,r3.*
.*and_lsr	r4,r1,r2,r3.*
.*and_lsr	r4,r1,2,r3.*
.*and_asl	r4,r1,r2,r3.*
.*and_asl	r4,r1,2,r3.*
.*xor_add	r4,r1,r2,r3.*
.*xor_add	r4,r1,2,r3.*
.*xor_sub	r4,r1,r2,r3.*
.*xor_sub	r4,r1,2,r3.*
.*xor_cmp	r4,r1,r2,r3.*
.*xor_cmp	r4,r1,2,r3.*
.*xor_mov	r4,r1,r2,r3.*
.*xor_mov	r4,r1,2,r3.*
.*xor_asr	r4,r1,r2,r3.*
.*xor_asr	r4,r1,2,r3.*
.*xor_lsr	r4,r1,r2,r3.*
.*xor_lsr	r4,r1,2,r3.*
.*xor_asl	r4,r1,r2,r3.*
.*xor_asl	r4,r1,2,r3.*
.*or_add	r4,r1,r2,r3.*
.*or_add	r4,r1,2,r3.*
.*or_sub	r4,r1,r2,r3.*
.*or_sub	r4,r1,2,r3.*
.*or_cmp	r4,r1,r2,r3.*
.*or_cmp	r4,r1,2,r3.*
.*or_mov	r4,r1,r2,r3.*
.*or_mov	r4,r1,2,r3.*
.*or_asr	r4,r1,r2,r3.*
.*or_asr	r4,r1,2,r3.*
.*or_lsr	r4,r1,r2,r3.*
.*or_lsr	r4,r1,2,r3.*
.*or_asl	r4,r1,r2,r3.*
.*or_asl	r4,r1,2,r3.*
.*$gdb_prompt $" { pass "dsp_logical tests" }
	-re "$gdb_prompt $" { fail "dsp_logical tests" }
	timeout { fail "(timeout) dsp_logical tests" }
    }
}

proc dsp_misc_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/42i dsp_misc_tests\n"
    gdb_expect {
	-re "
.*dmach_add	r4,r1,r2,r3.*
.*dmach_add	r4,r1,2,r3.*
.*dmach_sub	r4,r1,r2,r3.*
.*dmach_sub	r4,r1,2,r3.*
.*dmach_cmp	r4,r1,r2,r3.*
.*dmach_cmp	r4,r1,2,r3.*
.*dmach_mov	r4,r1,r2,r3.*
.*dmach_mov	r4,r1,2,r3.*
.*dmach_asr	r4,r1,r2,r3.*
.*dmach_asr	r4,r1,2,r3.*
.*dmach_lsr	r4,r1,r2,r3.*
.*dmach_lsr	r4,r1,2,r3.*
.*dmach_asl	r4,r1,r2,r3.*
.*dmach_asl	r4,r1,2,r3.*
.*swhw_add	r4,r1,r2,r3.*
.*swhw_add	r4,r1,2,r3.*
.*swhw_sub	r4,r1,r2,r3.*
.*swhw_sub	r4,r1,2,r3.*
.*swhw_cmp	r4,r1,r2,r3.*
.*swhw_cmp	r4,r1,2,r3.*
.*swhw_mov	r4,r1,r2,r3.*
.*swhw_mov	r4,r1,2,r3.*
.*swhw_asr	r4,r1,r2,r3.*
.*swhw_asr	r4,r1,2,r3.*
.*swhw_lsr	r4,r1,r2,r3.*
.*swhw_lsr	r4,r1,2,r3.*
.*swhw_asl	r4,r1,r2,r3.*
.*swhw_asl	r4,r1,2,r3.*
.*sat16_add	r4,r1,r2,r3.*
.*sat16_add	r4,r1,2,r3.*
.*sat16_sub	r4,r1,r2,r3.*
.*sat16_sub	r4,r1,2,r3.*
.*sat16_cmp	r4,r1,r2,r3.*
.*sat16_cmp	r4,r1,2,r3.*
.*sat16_mov	r4,r1,r2,r3.*
.*sat16_mov	r4,r1,2,r3.*
.*sat16_asr	r4,r1,r2,r3.*
.*sat16_asr	r4,r1,2,r3.*
.*sat16_lsr	r4,r1,r2,r3.*
.*sat16_lsr	r4,r1,2,r3.*
.*sat16_asl	r4,r1,r2,r3.*
.*sat16_asl	r4,r1,2,r3.*
.*$gdb_prompt $" { pass "dsp_misc tests" }
	-re "$gdb_prompt $" { fail "dsp_misc tests" }
	timeout { fail "(timeout) dsp_misc tests" }
    }
}

proc autoincrement_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/16i autoincrement_tests\n"
    gdb_expect {
	-re "
.*mov	\\(r1\\+\\),r2.*
.*mov	r3,\\(r4\\+\\).*
.*movhu	\\(r6\\+\\),r7.*
.*movhu	a0,\\(a1\\+\\).*
.*mov	\\(r1\\+,64\\),r2.*
.*mov	r1,\\(r2\\+,64\\).*
.*movhu	\\(r1\\+,64\\),r2.*
.*movhu	r1,\\(r2\\+,64\\).*
.*mov	\\(r1\\+,131055\\),r2.*
.*mov	r1,\\(r2\\+,131055\\).*
.*movhu	\\(r1\\+,131055\\),r2.*
.*movhu	r1,\\(r2\\+,131055\\).*
.*mov	\\(r1\\+,2147417596\\),r2.*
.*mov	r1,\\(r2\\+,2147417596\\).*
.*movhu	\\(r1\\+,2147417596\\),r2.*
.*movhu	r1,\\(r2\\+,2147417596\\).*
.*$gdb_prompt $" { pass "autoincrement tests" }
	-re "$gdb_prompt $" { fail "autoincrement tests" }
	timeout { fail "(timeout) autoincrement tests" }
    }
}

proc dsp_autoincrement_tests { } {
    global gdb_prompt
    global hex
    global decimal

    send_gdb "x/11i dsp_autoincrement_tests\n"
    gdb_expect {
	-re "
.*mov_llt	\\(r1\\+,4\\),r2.*
.*mov_lgt	\\(r1\\+,4\\),r2.*
.*mov_lge	\\(r1\\+,4\\),r2.*
.*mov_lle	\\(r1\\+,4\\),r2.*
.*mov_lcs	\\(r1\\+,4\\),r2.*
.*mov_lhi	\\(r1\\+,4\\),r2.*
.*mov_lcc	\\(r1\\+,4\\),r2.*
.*mov_lls	\\(r1\\+,4\\),r2.*
.*mov_leq	\\(r1\\+,4\\),r2.*
.*mov_lne	\\(r1\\+,4\\),r2.*
.*mov_lra	\\(r1\\+,4\\),r2.*
.*$gdb_prompt $" { pass "autoincrement tests" }
	-re "$gdb_prompt $" { fail "autoincrement tests" }
	timeout { fail "(timeout) autoincrement tests" }
    }
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

call_tests
movm_tests
misc_tests
mov_tests
ext_tests
add_tests
sub_tests
cmp_tests
logical_tests
shift_tests
muldiv_tests
movbu_tests
movhu_tests
mac_tests
bit_tests
dsp_add_tests
dsp_cmp_tests
dsp_sub_tests
dsp_mov_tests
dsp_logical_tests
autoincrement_tests
dsp_autoincrement_tests