# Copyright (C) 2003-2021 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 Michael Snyder (msnyder@redhat.com)

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


set testfile "t06_ari2"
set srcfile ${srcdir}/${subdir}/${testfile}.s
set objfile ${objdir}/${subdir}/${testfile}.o
set binfile ${objdir}/${subdir}/${testfile}.x

set asm-flags ""
set link-flags "-m h8300sxelf"


if {[target_assemble $srcfile $objfile "${asm-flags}"] != ""} then {
     untested "failed to assemble"
     return -1
}

if {[target_link $objfile $binfile "${link-flags}"] != ""} then {
     untested "failed to link"
     return -1
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

gdb_test "x /i start" "addx(.b|)\t#0x12(:8|),r1h" \
	"addx.b #0x12:8,r1h"
gdb_test "x" "addx(.b|)\t#0x12(:8|),@er1" \
	"addx.b #0x12:8,@er1"
gdb_test "x" "addx(.b|)\t#0x12(:8|),@er1-" \
	"addx.b #0x12:8,@er1-"
gdb_test "x" "addx(.b|)\tr3h,r1h" \
	"addx.b r3h,r1h"
gdb_test "x" "addx(.b|)\tr3h,@er1" \
	"addx.b r3h,@er1"
gdb_test "x" "addx(.b|)\tr3h,@er1-" \
	"addx.b r3h,@er1-"
gdb_test "x" "addx(.b|)\t@er3,r1h" \
	"addx.b @er3,r1h"
gdb_test "x" "addx(.b|)\t@er3,@er1" \
	"addx.b @er3,@er1"
gdb_test "x" "addx(.b|)\t@er3-,r1h" \
	"addx.b @er3-,r1h"
gdb_test "x" "addx(.b|)\t@er3-,@er1-" \
	"addx.b @er3-,@er1-"
gdb_test "x" "addx.w\t#0x1234(:16|),r1" \
	"addx.w #0x1234:16,r1"
gdb_test "x" "addx.w\t#0x1234(:16|),@er1" \
	"addx.w #0x1234:16,@er1"
gdb_test "x" "addx.w\t#0x1234(:16|),@er1-" \
	"addx.w #0x1234:16,@er1-"
gdb_test "x" "addx.w\tr3,r1" \
	"addx.w r3,r1"
gdb_test "x" "addx.w\tr3,@er1" \
	"addx.w r3,@er1"
gdb_test "x" "addx.w\tr3,@er1-" \
	"addx.w r3,@er1-"
gdb_test "x" "addx.w\t@er3,r1" \
	"addx.w @er3,r1"
gdb_test "x" "addx.w\t@er3,@er1" \
	"addx.w @er3,@er1"
gdb_test "x" "addx.w\t@er3-,r1" \
	"addx.w @er3-,r1"
gdb_test "x" "addx.w\t@er3-,@er1-" \
	"addx.w @er3-,@er1-"
gdb_test "x" "addx.l\t#0x12345678(:32|),er1" \
	"addx.l #0x12345678:32,er1"
gdb_test "x" "addx.l\t#0x12345678(:32|),@er1" \
	"addx.l #0x12345678:32,@er1"
gdb_test "x" "addx.l\t#0x12345678(:32|),@er1-" \
	"addx.l #0x12345678:32,@er1-"
gdb_test "x" "addx.l\ter3,er1" \
	"addx.l er3,er1"
gdb_test "x" "addx.l\ter3,@er1" \
	"addx.l er3,@er1"
gdb_test "x" "addx.l\ter3,@er1-" \
	"addx.l er3,@er1-"
gdb_test "x" "addx.l\t@er3,er1" \
	"addx.l @er3,er1"
gdb_test "x" "addx.l\t@er3,@er1" \
	"addx.l @er3,@er1"
gdb_test "x" "addx.l\t@er3-,er1" \
	"addx.l @er3-,er1"
gdb_test "x" "addx.l\t@er3-,@er1-" \
	"addx.l @er3-,@er1-"
gdb_test "x" "subx(.b|)\t#0x12(:8|),r1h" \
	"subx.b #0x12:8,r1h"
gdb_test "x" "subx(.b|)\t#0x12(:8|),@er1" \
	"subx.b #0x12:8,@er1"
gdb_test "x" "subx(.b|)\t#0x12(:8|),@er1-" \
	"subx.b #0x12:8,@er1-"
gdb_test "x" "subx(.b|)\tr3h,r1h" \
	"subx.b r3h,r1h"
gdb_test "x" "subx(.b|)\tr3h,@er1" \
	"subx.b r3h,@er1"
gdb_test "x" "subx(.b|)\tr3h,@er1-" \
	"subx.b r3h,@er1-"
gdb_test "x" "subx(.b|)\t@er3,r1h" \
	"subx.b @er3,r1h"
gdb_test "x" "subx(.b|)\t@er3,@er1" \
	"subx.b @er3,@er1"
gdb_test "x" "subx(.b|)\t@er3-,r1h" \
	"subx.b @er3-,r1h"
gdb_test "x" "subx(.b|)\t@er3-,@er1-" \
	"subx.b @er3-,@er1-"
gdb_test "x" "subx.w\t#0x1234(:16|),r1" \
	"subx.w #0x1234:16,r1"
gdb_test "x" "subx.w\t#0x1234(:16|),@er1" \
	"subx.w #0x1234:16,@er1"
gdb_test "x" "subx.w\t#0x1234(:16|),@er1-" \
	"subx.w #0x1234:16,@er1-"
gdb_test "x" "subx.w\tr3,r1" \
	"subx.w r3,r1"
gdb_test "x" "subx.w\tr3,@er1" \
	"subx.w r3,@er1"
gdb_test "x" "subx.w\tr3,@er1-" \
	"subx.w r3,@er1-"
gdb_test "x" "subx.w\t@er3,r1" \
	"subx.w @er3,r1"
gdb_test "x" "subx.w\t@er3,@er1" \
	"subx.w @er3,@er1"
gdb_test "x" "subx.w\t@er3-,r1" \
	"subx.w @er3-,r1"
gdb_test "x" "subx.w\t@er3-,@er1-" \
	"subx.w @er3-,@er1-"
gdb_test "x" "subx.l\t#0x12345678(:32|),er1" \
	"subx.l #0x12345678:32,er1"
gdb_test "x" "subx.l\t#0x12345678(:32|),@er1" \
	"subx.l #0x12345678:32,@er1"
gdb_test "x" "subx.l\t#0x12345678(:32|),@er1-" \
	"subx.l #0x12345678:32,@er1-"
gdb_test "x" "subx.l\ter3,er1" \
	"subx.l er3,er1"
gdb_test "x" "subx.l\ter3,@er1" \
	"subx.l er3,@er1"
gdb_test "x" "subx.l\ter3,@er1-" \
	"subx.l er3,@er1-"
gdb_test "x" "subx.l\t@er3,er1" \
	"subx.l @er3,er1"
gdb_test "x" "subx.l\t@er3,@er1" \
	"subx.l @er3,@er1"
gdb_test "x" "subx.l\t@er3-,er1" \
	"subx.l @er3-,er1"
gdb_test "x" "subx.l\t@er3-,@er1-" \
	"subx.l @er3-,@er1-"
gdb_test "x" "inc(.b|)\tr1h" \
	"inc.b r1h"
gdb_test "x" "inc(.w|)\t#1,r1" \
	"inc.w #1,r1"
gdb_test "x" "inc(.w|)\t#2,r1" \
	"inc.w #2,r1"
gdb_test "x" "inc(.l|)\t#1,er1" \
	"inc.l #1,er1"
gdb_test "x" "inc(.l|)\t#2,er1" \
	"inc.l #2,er1"
gdb_test "x" "dec(.b|)\tr1h" \
	"dec.b r1h"
gdb_test "x" "dec(.w|)\t#1,r1" \
	"dec.w #1,r1"
gdb_test "x" "dec(.w|)\t#2,r1" \
	"dec.w #2,r1"
gdb_test "x" "dec(.l|)\t#1,er1" \
	"dec.l #1,er1"
gdb_test "x" "dec(.l|)\t#2,er1" \
	"dec.l #2,er1"
gdb_test "x" "adds(.l|)\t#1,er1" \
	"adds.l #1,er1"
gdb_test "x" "adds(.l|)\t#2,er1" \
	"adds.l #2,er1"
gdb_test "x" "adds(.l|)\t#4,er1" \
	"adds.l #4,er1"
gdb_test "x" "subs(.l|)\t#1,er1" \
	"subs.l #1,er1"
gdb_test "x" "subs(.l|)\t#2,er1" \
	"subs.l #2,er1"
gdb_test "x" "subs(.l|)\t#4,er1" \
	"subs.l #4,er1"
gdb_test "x" "daa(.b|)\tr1h" \
	"daa.b r1h"
gdb_test "x" "das(.b|)\tr1h" \
	"das.b r1h"
gdb_test "x" "mulxu.b\t#0xf(:4|),r1" \
	"mulxu.b #0xf:4,r1"
gdb_test "x" "mulxu.b\tr3h,r1" \
	"mulxu.b r3h,r1"
gdb_test "x" "mulxu.w\t#0xf(:4|),er1" \
	"mulxu.w #0xf:4,er1"
gdb_test "x" "mulxu.w\tr3,er1" \
	"mulxu.w r3,er1"
gdb_test "x" "divxu.b\t#0xf(:4|),r1" \
	"divxu.b #0xf:4,r1"
gdb_test "x" "divxu.b\tr3h,r1" \
	"divxu.b r3h,r1"
gdb_test "x" "divxu.w\t#0xf(:4|),er1" \
	"divxu.w #0xf:4,er1"
gdb_test "x" "divxu.w\tr3,er1" \
	"divxu.w r3,er1"
gdb_test "x" "mulxs.b\t#0xf(:4|),r1" \
	"mulxs.b #0xf:4,r1"
gdb_test "x" "mulxs.b\tr3h,r1" \
	"mulxs.b r3h,r1"
gdb_test "x" "mulxs.w\t#0xf(:4|),er1" \
	"mulxs.w #0xf:4,er1"
gdb_test "x" "mulxs.w\tr3,er1" \
	"mulxs.w r3,er1"
gdb_test "x" "divxs.b\t#0xf(:4|),r1" \
	"divxs.b #0xf:4,r1"
gdb_test "x" "divxs.b\tr3h,r1" \
	"divxs.b r3h,r1"
gdb_test "x" "divxs.w\t#0xf(:4|),er1" \
	"divxs.w #0xf:4,er1"
gdb_test "x" "divxs.w\tr3,er1" \
	"divxs.w r3,er1"
gdb_test "x" "mulu.w\t#0xf(:4|),r1" \
	"mulu.w #0xf:4,r1"
gdb_test "x" "mulu.w\tr3,r1" \
	"mulu.w r3,r1"
gdb_test "x" "mulu.l\t#0xf(:4|),er1" \
	"mulu.l #0xf:4,er1"
gdb_test "x" "mulu.l\ter3,er1" \
	"mulu.l er3,er1"
gdb_test "x" "mulu/u.l\t#0xf(:4|),er1" \
	"mulu/u.l #0xf:4,er1"
gdb_test "x" "mulu/u.l\ter3,er1" \
	"mulu/u.l er3,er1"
gdb_test "x" "muls.w\t#0xf(:4|),r1" \
	"muls.w #0xf:4,r1"
gdb_test "x" "muls.w\tr3,r1" \
	"muls.w r3,r1"
gdb_test "x" "muls.l\t#0xf(:4|),er1" \
	"muls.l #0xf:4,er1"
gdb_test "x" "muls.l\ter3,er1" \
	"muls.l er3,er1"
gdb_test "x" "muls/u.l\t#0xf(:4|),er1" \
	"muls/u.l #0xf:4,er1"
gdb_test "x" "muls/u.l\ter3,er1" \
	"muls/u.l er3,er1"
gdb_test "x" "divu.w\t#0xf(:4|),r1" \
	"divu.w #0xf:4,r1"
gdb_test "x" "divu.w\tr3,r1" \
	"divu.w r3,r1"
gdb_test "x" "divu.l\t#0xf(:4|),er1" \
	"divu.l #0xf:4,er1"
gdb_test "x" "divu.l\ter3,er1" \
	"divu.l er3,er1"
gdb_test "x" "divs.w\t#0xf(:4|),r1" \
	"divs.w #0xf:4,r1"
gdb_test "x" "divs.w\tr3,r1" \
	"divs.w r3,r1"
gdb_test "x" "divs.l\t#0xf(:4|),er1" \
	"divs.l #0xf:4,er1"
gdb_test "x" "divs.l\ter3,er1" \
	"divs.l er3,er1"
