aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>1998-05-21 09:32:07 +0000
committerAndrew Cagney <cagney@redhat.com>1998-05-21 09:32:07 +0000
commit26feb3a83d605a9f2302266d524e6e443d31d197 (patch)
treeed8c52a6f5e6dafaf69517e04c76a8a54a96d6a1
parent84048259930b9dc812404285e3508eb09beeec51 (diff)
downloadgdb-26feb3a83d605a9f2302266d524e6e443d31d197.zip
gdb-26feb3a83d605a9f2302266d524e6e443d31d197.tar.gz
gdb-26feb3a83d605a9f2302266d524e6e443d31d197.tar.bz2
Fix sign extension on 32 bit add/sub instructions.
-rw-r--r--sim/mips/ChangeLog5
-rw-r--r--sim/mips/mips.igen60
-rw-r--r--sim/mn10300/ChangeLog25
-rw-r--r--sim/mn10300/dv-mn103cpu.c30
-rw-r--r--sim/mn10300/dv-mn103int.c83
-rw-r--r--sim/testsuite/mips64r5900-elf/ChangeLog44
-rw-r--r--sim/testsuite/mips64r5900-elf/Makefile.in271
-rw-r--r--sim/testsuite/mips64r5900-elf/t-sub.s26
8 files changed, 470 insertions, 74 deletions
diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog
index 2afcd49..ca50e36 100644
--- a/sim/mips/ChangeLog
+++ b/sim/mips/ChangeLog
@@ -1,3 +1,8 @@
+Thu May 21 18:57:19 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * sim-main.h (ALU32_END): Sign extend 32 bit results.
+ * mips.igen (ADD, SUB, ADDI, DADD, DSUB): Trace.
+
start-sanitize-r5900
Thu May 21 17:15:39 1998 Andrew Cagney <cagney@b1.cygnus.com>
diff --git a/sim/mips/mips.igen b/sim/mips/mips.igen
index a1f254c..df89140 100644
--- a/sim/mips/mips.igen
+++ b/sim/mips/mips.igen
@@ -272,9 +272,13 @@
*tx19:
// end-sanitize-tx19
{
- ALU32_BEGIN (GPR[RS]);
- ALU32_ADD (GPR[RT]);
- ALU32_END (GPR[RD]);
+ TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
+ {
+ ALU32_BEGIN (GPR[RS]);
+ ALU32_ADD (GPR[RT]);
+ ALU32_END (GPR[RD]);
+ }
+ TRACE_ALU_RESULT (GPR[RD]);
}
@@ -297,9 +301,13 @@
*tx19:
// end-sanitize-tx19
{
- ALU32_BEGIN (GPR[RS]);
- ALU32_ADD (EXTEND16 (IMMEDIATE));
- ALU32_END (GPR[RT]);
+ TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
+ {
+ ALU32_BEGIN (GPR[RS]);
+ ALU32_ADD (EXTEND16 (IMMEDIATE));
+ ALU32_END (GPR[RT]);
+ }
+ TRACE_ALU_RESULT (GPR[RT]);
}
@@ -923,9 +931,13 @@
// end-sanitize-tx19
{
/* this check's for overflow */
- ALU64_BEGIN (GPR[RS]);
- ALU64_ADD (GPR[RT]);
- ALU64_END (GPR[RD]);
+ TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
+ {
+ ALU64_BEGIN (GPR[RS]);
+ ALU64_ADD (GPR[RT]);
+ ALU64_END (GPR[RD]);
+ }
+ TRACE_ALU_RESULT (GPR[RD]);
}
@@ -948,9 +960,13 @@
*tx19:
// end-sanitize-tx19
{
- ALU64_BEGIN (GPR[RS]);
- ALU64_ADD (EXTEND16 (IMMEDIATE));
- ALU64_END (GPR[RT]);
+ TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
+ {
+ ALU64_BEGIN (GPR[RS]);
+ ALU64_ADD (EXTEND16 (IMMEDIATE));
+ ALU64_END (GPR[RT]);
+ }
+ TRACE_ALU_RESULT (GPR[RT]);
}
@@ -1554,9 +1570,13 @@
*tx19:
// end-sanitize-tx19
{
- ALU64_BEGIN (GPR[RS]);
- ALU64_SUB (GPR[RT]);
- ALU64_END (GPR[RD]);
+ TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
+ {
+ ALU64_BEGIN (GPR[RS]);
+ ALU64_SUB (GPR[RT]);
+ ALU64_END (GPR[RD]);
+ }
+ TRACE_ALU_RESULT (GPR[RD]);
}
@@ -3105,9 +3125,13 @@
*tx19:
// end-sanitize-tx19
{
- ALU32_BEGIN (GPR[RS]);
- ALU32_SUB (GPR[RT]);
- ALU32_END (GPR[RD]);
+ TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
+ {
+ ALU32_BEGIN (GPR[RS]);
+ ALU32_SUB (GPR[RT]);
+ ALU32_END (GPR[RD]);
+ }
+ TRACE_ALU_RESULT (GPR[RD]);
}
diff --git a/sim/mn10300/ChangeLog b/sim/mn10300/ChangeLog
index 71d8149..20eab28 100644
--- a/sim/mn10300/ChangeLog
+++ b/sim/mn10300/ChangeLog
@@ -1,3 +1,28 @@
+start-sanitize-am30
+Thu May 14 19:30:11 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * dv-mn103cpu.c: Use struct hw_event.
+ * dv-mn103cpu.c, dv-mn103int.c: Don't include hw-base.h, include
+ hw-main.h
+ * dv-mn103cpu.c, dv-mn103int.c: Rename *_callback to *_method.
+
+Wed May 6 13:29:06 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * interp.c (sim_open): Create a polling PAL device.
+
+end-sanitize-am30
+Fri May 1 16:39:15 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * dv-mn103int.c (mn103int_port_event):
+ (mn103int_port_event):
+ (mn103int_io_read_buffer):
+ (mn103int_io_write_buffer):
+
+ * dv-mn103cpu.c (deliver_mn103cpu_interrupt): Drop CPU/CIA args.
+ (mn103cpu_port_event): Ditto.
+ (mn103cpu_io_read_buffer): Ditto.
+ (mn103cpu_io_write_buffer): Ditto.
+
Tue Apr 28 18:33:31 1998 Geoffrey Noer <noer@cygnus.com>
* configure: Regenerated to track ../common/aclocal.m4 changes.
diff --git a/sim/mn10300/dv-mn103cpu.c b/sim/mn10300/dv-mn103cpu.c
index 89b60b8..431c2bb 100644
--- a/sim/mn10300/dv-mn103cpu.c
+++ b/sim/mn10300/dv-mn103cpu.c
@@ -21,7 +21,7 @@
#include "sim-main.h"
-#include "hw-base.h"
+#include "hw-main.h"
/* DEVICE
@@ -107,7 +107,7 @@ struct mn103cpu_block {
struct mn103cpu {
struct mn103cpu_block block;
- hw_event *pending_handler;
+ struct hw_event *pending_handler;
int pending_level;
int pending_nmi;
int pending_reset;
@@ -151,9 +151,9 @@ static const struct hw_port_descriptor mn103cpu_ports[] = {
/* Finish off the partially created hw device. Attach our local
callbacks. Wire up our port names etc */
-static hw_io_read_buffer_callback mn103cpu_io_read_buffer;
-static hw_io_write_buffer_callback mn103cpu_io_write_buffer;
-static hw_port_event_callback mn103cpu_port_event;
+static hw_io_read_buffer_method mn103cpu_io_read_buffer;
+static hw_io_write_buffer_method mn103cpu_io_write_buffer;
+static hw_port_event_method mn103cpu_port_event;
static void
attach_mn103cpu_regs (struct hw *me,
@@ -228,7 +228,7 @@ deliver_mn103cpu_interrupt (struct hw *me,
else if (controller->pending_nmi)
{
controller->pending_nmi = 0;
- store_half (SP - 4, CIA_GET (cpu));
+ store_word (SP - 4, CIA_GET (cpu));
store_half (SP - 8, PSW);
PSW &= ~PSW_IE;
SP = SP - 8;
@@ -241,7 +241,7 @@ deliver_mn103cpu_interrupt (struct hw *me,
{
/* Don't clear pending level. Request continues to be pending
until the interrupt controller clears/changes it */
- store_half (SP - 4, CIA_GET (cpu));
+ store_word (SP - 4, CIA_GET (cpu));
store_half (SP - 8, PSW);
PSW &= ~PSW_IE;
PSW &= ~PSW_LM;
@@ -249,7 +249,7 @@ deliver_mn103cpu_interrupt (struct hw *me,
SP = SP - 8;
CIA_SET (cpu, 0x40000000 + controller->interrupt_vector[controller->pending_level]);
HW_TRACE ((me, "port-out ack %d", controller->pending_level));
- hw_port_event (me, ACK_PORT, controller->pending_level, NULL, NULL_CIA);
+ hw_port_event (me, ACK_PORT, controller->pending_level);
HW_TRACE ((me, "int level=%d pc=0x%08lx psw=0x%04x sp=0x%08lx",
controller->pending_level,
(long) CIA_GET (cpu), (unsigned) PSW, (long) SP));
@@ -278,9 +278,7 @@ mn103cpu_port_event (struct hw *me,
int my_port,
struct hw *source,
int source_port,
- int level,
- sim_cpu *processor,
- sim_cia cia)
+ int level)
{
struct mn103cpu *controller = hw_data (me);
@@ -355,9 +353,7 @@ mn103cpu_io_read_buffer (struct hw *me,
void *dest,
int space,
unsigned_word base,
- unsigned nr_bytes,
- sim_cpu *processor,
- sim_cia cia)
+ unsigned nr_bytes)
{
struct mn103cpu *controller = hw_data (me);
unsigned16 val = 0;
@@ -396,9 +392,7 @@ mn103cpu_io_write_buffer (struct hw *me,
const void *source,
int space,
unsigned_word base,
- unsigned nr_bytes,
- sim_cpu *cpu,
- sim_cia cia)
+ unsigned nr_bytes)
{
struct mn103cpu *controller = hw_data (me);
unsigned16 val;
@@ -431,7 +425,7 @@ mn103cpu_io_write_buffer (struct hw *me,
}
-const struct hw_device_descriptor dv_mn103cpu_descriptor[] = {
+const struct hw_descriptor dv_mn103cpu_descriptor[] = {
{ "mn103cpu", mn103cpu_finish, },
{ NULL },
};
diff --git a/sim/mn10300/dv-mn103int.c b/sim/mn10300/dv-mn103int.c
index 270cbf5..f334d12 100644
--- a/sim/mn10300/dv-mn103int.c
+++ b/sim/mn10300/dv-mn103int.c
@@ -20,8 +20,7 @@
*/
-#include "sim-main.h"
-#include "hw-base.h"
+#include "hw-main.h"
/* DEVICE
@@ -303,9 +302,9 @@ static const struct hw_port_descriptor mn103int_ports[] = {
/* Finish off the partially created hw device. Attach our local
callbacks. Wire up our port names etc */
-static hw_io_read_buffer_callback mn103int_io_read_buffer;
-static hw_io_write_buffer_callback mn103int_io_write_buffer;
-static hw_port_event_callback mn103int_port_event;
+static hw_io_read_buffer_method mn103int_io_read_buffer;
+static hw_io_write_buffer_method mn103int_io_write_buffer;
+static hw_port_event_method mn103int_port_event;
static void
attach_mn103int_regs (struct hw *me,
@@ -388,7 +387,7 @@ find_highest_interrupt_group (struct hw *me,
int selected;
/* FIRST_NMI_GROUP (group zero) is used as a special default value
- when searching for an interrupt group */
+ when searching for an interrupt group.*/
selected = FIRST_NMI_GROUP;
controller->group[FIRST_NMI_GROUP].level = 7;
@@ -397,7 +396,8 @@ find_highest_interrupt_group (struct hw *me,
struct mn103int_group *group = &controller->group[gid];
if ((group->request & group->enable) != 0)
{
- if (group->level > controller->group[selected].level)
+ /* Remember, lower level, higher priority. */
+ if (group->level < controller->group[selected].level)
{
selected = gid;
}
@@ -416,7 +416,7 @@ push_interrupt_level (struct hw *me,
int selected = find_highest_interrupt_group (me, controller);
int level = controller->group[selected].level;
HW_TRACE ((me, "port-out - selected=%d level=%d", selected, level));
- hw_port_event (me, LEVEL_PORT, level, NULL, NULL_CIA);
+ hw_port_event (me, LEVEL_PORT, level);
}
@@ -427,9 +427,7 @@ mn103int_port_event (struct hw *me,
int my_port,
struct hw *source,
int source_port,
- int level,
- sim_cpu *processor,
- sim_cia cia)
+ int level)
{
struct mn103int *controller = hw_data (me);
@@ -493,7 +491,7 @@ mn103int_port_event (struct hw *me,
if ((group->request & group->enable) != 0)
{
HW_TRACE ((me, "port-out NMI"));
- hw_port_event (me, NMI_PORT, 1, NULL, NULL_CIA);
+ hw_port_event (me, NMI_PORT, 1);
}
break;
}
@@ -521,8 +519,8 @@ decode_group (struct hw *me,
unsigned_word base,
unsigned_word *offset)
{
- int gid = (base / 8) % NR_GROUPS;
- *offset = (base % 8);
+ int gid = (base / 4) % NR_GROUPS;
+ *offset = (base % 4);
return &controller->group[gid];
}
@@ -542,7 +540,7 @@ read_icr (struct hw *me,
{
case 0:
val = INSERT_ID (group->request);
- HW_TRACE ((me, "read-icr group=%d nmi 0x%02x",
+ HW_TRACE ((me, "read-icr group=%d:0 nmi 0x%02x",
group->gid, val));
break;
default:
@@ -556,13 +554,13 @@ read_icr (struct hw *me,
case 0:
val = (INSERT_IR (group->request)
| INSERT_ID (group->request & group->enable));
- HW_TRACE ((me, "read-icr group=%d level 0 0x%02x",
+ HW_TRACE ((me, "read-icr group=%d:0 level 0x%02x",
group->gid, val));
break;
case 1:
val = (INSERT_LV (group->level)
| INSERT_IE (group->enable));
- HW_TRACE ((me, "read-icr level-%d level 1 0x%02x",
+ HW_TRACE ((me, "read-icr level-%d:1 level 0x%02x",
group->gid, val));
break;
}
@@ -591,7 +589,7 @@ write_icr (struct hw *me,
switch (offset)
{
case 0:
- HW_TRACE ((me, "write-icr group=%d nmi 0x%02x",
+ HW_TRACE ((me, "write-icr group=%d:0 nmi 0x%02x",
group->gid, val));
group->request &= ~EXTRACT_ID (val);
break;
@@ -605,13 +603,16 @@ write_icr (struct hw *me,
{
case 0: /* request/detect */
/* Clear any ID bits and then set them according to IR */
- HW_TRACE ((me, "write-icr group=%d level 0 0x%02x",
- group->gid, val));
- group->request &= EXTRACT_ID (val);
- group->request |= EXTRACT_IR (val) & EXTRACT_ID (val);
+ HW_TRACE ((me, "write-icr group=%d:0 level 0x%02x %x:%x:%x",
+ group->gid, val,
+ group->request, EXTRACT_IR (val), EXTRACT_ID (val)));
+ group->request =
+ ((EXTRACT_IR (val) & EXTRACT_ID (val))
+ | (EXTRACT_IR (val) & group->request)
+ | (~EXTRACT_IR (val) & ~EXTRACT_ID (val) & group->request));
break;
case 1: /* level/enable */
- HW_TRACE ((me, "write-icr group=%d level 1 0x%02x",
+ HW_TRACE ((me, "write-icr group=%d:1 level 0x%02x",
group->gid, val));
group->level = EXTRACT_LV (val);
group->enable = EXTRACT_IE (val);
@@ -642,14 +643,24 @@ read_iagr (struct hw *me,
{
case 0:
{
- val = (controller->interrupt_accepted_group << 2);
- if (!(controller->group[val].request
- & controller->group[val].enable))
- /* oops, lost the request */
- val = 0;
- HW_TRACE ((me, "read-iagr %d", (int) val));
+ if (!(controller->group[controller->interrupt_accepted_group].request
+ & controller->group[controller->interrupt_accepted_group].enable))
+ {
+ /* oops, lost the request */
+ val = 0;
+ HW_TRACE ((me, "read-iagr:0 lost-0"));
+ }
+ else
+ {
+ val = (controller->interrupt_accepted_group << 2);
+ HW_TRACE ((me, "read-iagr:0 %d", (int) val));
+ }
break;
}
+ case 1:
+ val = 0;
+ HW_TRACE ((me, "read-iagr:1 %d", (int) val));
+ break;
default:
val = 0;
HW_TRACE ((me, "read-iagr 0x%08lx bad offset", (long) offset));
@@ -743,14 +754,12 @@ mn103int_io_read_buffer (struct hw *me,
void *dest,
int space,
unsigned_word base,
- unsigned nr_bytes,
- sim_cpu *processor,
- sim_cia cia)
+ unsigned nr_bytes)
{
struct mn103int *controller = hw_data (me);
unsigned8 *buf = dest;
unsigned byte;
- HW_TRACE ((me, "read 0x%08lx %d", (long) base, (int) nr_bytes));
+ /* HW_TRACE ((me, "read 0x%08lx %d", (long) base, (int) nr_bytes)); */
for (byte = 0; byte < nr_bytes; byte++)
{
unsigned_word address = base + byte;
@@ -778,14 +787,12 @@ mn103int_io_write_buffer (struct hw *me,
const void *source,
int space,
unsigned_word base,
- unsigned nr_bytes,
- sim_cpu *cpu,
- sim_cia cia)
+ unsigned nr_bytes)
{
struct mn103int *controller = hw_data (me);
const unsigned8 *buf = source;
unsigned byte;
- HW_TRACE ((me, "write 0x%08lx %d", (long) base, (int) nr_bytes));
+ /* HW_TRACE ((me, "write 0x%08lx %d", (long) base, (int) nr_bytes)); */
for (byte = 0; byte < nr_bytes; byte++)
{
unsigned_word address = base + byte;
@@ -809,7 +816,7 @@ mn103int_io_write_buffer (struct hw *me,
}
-const struct hw_device_descriptor dv_mn103int_descriptor[] = {
+const struct hw_descriptor dv_mn103int_descriptor[] = {
{ "mn103int", mn103int_finish, },
{ NULL },
};
diff --git a/sim/testsuite/mips64r5900-elf/ChangeLog b/sim/testsuite/mips64r5900-elf/ChangeLog
index 11b7fac..d1ad04e 100644
--- a/sim/testsuite/mips64r5900-elf/ChangeLog
+++ b/sim/testsuite/mips64r5900-elf/ChangeLog
@@ -1,6 +1,50 @@
+Thu May 21 19:04:52 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * Makefile.in (TESTS): Add t-sub.ok.
+ (t-sub.s): New file.
+
+Thu May 14 14:43:17 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * t-div.s, t-ddiv.s, t-div1.s: Check DIV for x/0 and MIN_INT/-1.
+ * t-divu1.s, t-divu.s: Check x/0 and x/MAX_INT.
+ * t-dadd: Test.
+ * trap.s: Test trap instruction.
+ * Makefile.in (TESTS): Update
+
+ * f-add.s, f-adda.s, f-madd.s, f-madda.s, f-msub.s, f-msuba.s: Add
+ more test cases.
+
+Thu Apr 30 18:57:47 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * f-adda.s: Handle to-the-max accumulator values in madd.s.
+
+ * t-macros.i: Use msub.s instead of madd.s to get a value from the
+ accumulator. Use suba.s instead of adda.s to get a value into the
+ accumulator.
+
+Thu Apr 16 17:44:17 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * f-mul.s, f-mula.s: More overflow/underflow tests.
+
+ * f-cvt.s: Swap cvt.w.s and cvt.s.w was testing backwards.
+
+ * t-macros.i (loadfpx, checkfpx, checkaccx): Define, accept hex
+ values.
+ (checkfp): Force FP-SCR register bit zero to 1 when checking.
+
+Wed Feb 25 20:26:29 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * f-*.s: New files.
+
+ * Makefile.in (TESTS): Add floating point f-* tests.
+
+ * t-macros.i: Add lots of floating point macros.
+
Mon Feb 2 16:50:21 1998 Andrew Cagney <cagney@b1.cygnus.com>
* t-sdl.s: New test.
+ (dest): 8 byte align sdl destination.
+
* Makefile.in: Update.
Wed Sep 3 14:32:42 1997 Andrew Cagney <cagney@b1.cygnus.com>
diff --git a/sim/testsuite/mips64r5900-elf/Makefile.in b/sim/testsuite/mips64r5900-elf/Makefile.in
new file mode 100644
index 0000000..120337e
--- /dev/null
+++ b/sim/testsuite/mips64r5900-elf/Makefile.in
@@ -0,0 +1,271 @@
+# Makefile for regression testing the GNU debugger.
+# Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+# This file is part of GDB.
+
+# GDB 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, or (at your option)
+# any later version.
+
+# GDB 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.
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+srcroot = $(srcdir)/..
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+host_alias = @host_alias@
+target_alias = @target_alias@
+program_transform_name = @program_transform_name@
+build_canonical = @build@
+host_canonical = @host@
+target_canonical = @target@
+target_cpu = @target_cpu@
+
+
+SHELL = /bin/sh
+SUBDIRS = @subdirs@
+RPATH_ENVVAR = @RPATH_ENVVAR@
+
+EXPECT = `if [ -f $${rootme}/../../expect/expect ] ; then \
+ echo $${rootme}/../../expect/expect ; \
+ else echo expect ; fi`
+
+RUNTEST = $(RUNTEST_FOR_TARGET)
+
+RUNTESTFLAGS =
+
+RUNTEST_FOR_TARGET = `\
+ if [ -f $${srcdir}/../../../dejagnu/runtest ]; then \
+ echo $${srcdir}/../../../dejagnu/runtest; \
+ else \
+ if [ "$(host_canonical)" = "$(target_canonical)" ]; then \
+ echo runtest; \
+ else \
+ t='$(program_transform_name)'; echo runtest | sed -e '' $$t; \
+ fi; \
+ fi`
+
+
+AS_FOR_TARGET = `\
+ if [ -x ../../../gas/as-new ]; then \
+ echo ../../../gas/as-new ; \
+ else \
+ echo $(target_alias)-as ; \
+ fi`
+
+LD_FOR_TARGET = `\
+ if [ -x ../../../ld/ld-new ]; then \
+ echo ../../../ld/ld-new ; \
+ else \
+ echo $(target_alias)-ld ; \
+ fi`
+
+RUN_FOR_TARGET = `\
+ if [ -x ../../../sim/mips/run ]; then \
+ echo ../../../sim/mips/run ; \
+ else \
+ echo $(target_alias)-run ; \
+ fi`
+
+TESTS = \
+ hello.hi \
+ exit47.ko \
+ \
+ f-abs.ok \
+ f-add.ok \
+ f-adda.ok \
+ $(f-bc1f.ok) \
+ $(f-bc1fl.ok) \
+ $(f-bc1t.ok) \
+ $(f-bc1tl.ok) \
+ f-cond.ok \
+ $(f-cfc1.ok) \
+ $(f-ctc1.ok) \
+ f-cvt.ok \
+ f-div.ok \
+ $(f-lwc1.ok) \
+ f-madd.ok \
+ f-madda.ok \
+ f-max.ok \
+ $(f-mfc1.ok) \
+ f-min.ok \
+ f-msub.ok \
+ f-msuba.ok \
+ $(f-mtc1.ok) \
+ f-mul.ok \
+ f-mula.ok \
+ f-neg.ok \
+ f-rsqrt.ok \
+ f-sqrt.ok \
+ f-sub.ok \
+ f-suba.ok \
+ $(f-swc1.ok) \
+ \
+ t-dadd.ok \
+ t-ddiv.ok \
+ t-div.ok \
+ t-div1.ok \
+ t-divu.ok \
+ t-divu1.ok \
+ t-sub.ok \
+ \
+ t-mtsa.ok \
+ t-pabsh.ok \
+ t-pabsw.ok \
+ t-paddb.ok \
+ t-paddsb.ok \
+ t-paddsh.ok \
+ t-paddsw.ok \
+ t-paddub.ok \
+ t-padduh.ok \
+ t-padduw.ok \
+ t-pcpyh.ok \
+ t-pdivbw.ok \
+ t-pdivuw.ok \
+ t-pdivw.ok \
+ t-pexcw.ok \
+ t-pexoh.ok \
+ t-pext5.ok \
+ t-pextlb.ok \
+ t-pextlh.ok \
+ t-pextlw.ok \
+ t-pextub.ok \
+ t-pextuh.ok \
+ t-pextuw.ok \
+ t-phmaddh.ok \
+ t-phmsubh.ok \
+ t-pinth.ok \
+ t-pintoh.ok \
+ t-pmaddh.ok \
+ t-pmadduw.ok \
+ t-pmaddw.ok \
+ t-pmfhl-lh.ok \
+ t-pmfhl-lw.ok \
+ t-pmfhl-sh.ok \
+ t-pmfhl-slw.ok \
+ t-pmfhl-uw.ok \
+ t-pmsubh.ok \
+ t-pmthl-lw.ok \
+ t-pmulth.ok \
+ t-pmultuw.ok \
+ t-pmultw.ok \
+ t-ppac5.ok \
+ t-ppacb.ok \
+ t-ppach.ok \
+ t-ppacw.ok \
+ t-prot3w.ok \
+ t-psllvw.ok \
+ t-psrlvw.ok \
+ t-psravw.ok \
+ t-psubsb.ok \
+ t-psubsh.ok \
+ t-psubsw.ok \
+ t-psubub.ok \
+ t-psubuh.ok \
+ t-psubuw.ok \
+ t-psubw.ok \
+ t-qfsrv.ok \
+ t-sdl.ok \
+ \
+ trap.ok \
+
+check: sanity $(TESTS)
+sanity:
+ @eval echo AS_FOR_TARGET = $(AS_FOR_TARGET)
+ @eval echo LD_FOR_TARGET = $(LD_FOR_TARGET)
+ @eval echo RUN_FOR_TARGET = $(RUN_FOR_TARGET)
+
+
+
+# Rules for running all the tests, put into three types
+# exit success, exit fail, print "Hello World"
+
+.u.log:
+ uudecode $*.u
+ $(RUN_FOR_TARGET) $* > $*.log
+
+
+# Rules for running the tests
+
+.SUFFIXES: .u .uue .ok .ok .run .hi .ko .ko
+.run.ok:
+ rm -f tmp-$* $*.ok
+ ulimit -t 5 ; $(RUN_FOR_TARGET) $*.run > tmp-$*
+ mv tmp-$* $*.ok
+.run.hi:
+ rm -f tmp-$* $*.hi diff-$*
+ ulimit -t 5 ; $(RUN_FOR_TARGET) $*.run > tmp-$*
+ echo 'Hello World!' | diff - tmp-$* > diff-$*
+ cat tmp-$* diff-$* > $*.hi
+.run.ko:
+ rm -f tmp-$* $*.ko
+ set +e ; \
+ ulimit -t 5 ; $(RUN_FOR_TARGET) $*.run > tmp-$* ; \
+ if [ $$? -eq 47 ] ; then \
+ exit 0 ; \
+ else \
+ exit 1 ; \
+ fi
+ mv tmp-$* $*.ko
+
+
+# Rules for building all the tests and packing them into
+# uuencoded files.
+
+.run.u:
+ uuencode < $*.run $*.run > $*.u
+ @echo "Move $*.u $*.uue"
+.uue.run:
+ uudecode $(srcdir)/$*.uue
+.o.run:
+ $(LD_FOR_TARGET) -Ttext 0xa0020000 -o $*.run $*.o
+.s.o:
+ $(AS_FOR_TARGET) -I $(srcdir) $(srcdir)/$*.s -o $*.o
+
+
+#
+# Standard
+#
+clean mostlyclean:
+ -rm -f *~ core *.o a.out *.x *.grt *.run tmp-* diff-*
+ rm -f $(TESTS)
+# if [ x"${SUBDIRS}" != x ] ; then \
+# for dir in ${SUBDIRS}; \
+# do \
+# echo "$$dir:"; \
+# if [ -d $$dir ]; then \
+# (cd $$dir; $(MAKE) clean); \
+# fi; \
+# done ; \
+# else true; fi
+
+distclean maintainer-clean realclean: clean
+ -rm -f *~ core
+ -rm -f Makefile config.status *-init.exp
+ -rm -fr *.log summary detail *.plog *.sum *.psum site.*
+# if [ x"${SUBDIRS}" != x ] ; then \
+# for dir in ${SUBDIRS}; \
+# do \
+# echo "$$dir:"; \
+# if [ -d $$dir ]; then \
+# (cd $$dir; $(MAKE) distclean); \
+# fi; \
+# done ; \
+# else true; fi
+
+Makefile : Makefile.in config.status
+ $(SHELL) config.status
+
+config.status: configure
+ $(SHELL) config.status --recheck
diff --git a/sim/testsuite/mips64r5900-elf/t-sub.s b/sim/testsuite/mips64r5900-elf/t-sub.s
new file mode 100644
index 0000000..ef314ae
--- /dev/null
+++ b/sim/testsuite/mips64r5900-elf/t-sub.s
@@ -0,0 +1,26 @@
+.include "t-macros.i"
+
+ start
+
+test_sub:
+
+ load $7 0x0000000000000000 0xffffffff80000001
+ load $8 0x0000000000000000 0xffffffffffffffff
+ sub $10, $7, $8
+ check10 0x0000000000000000 0xffffffff80000002
+
+test_sub2:
+ load $7 0x0000000000000000 0xffffffff80000001
+ load $8 0x0000000000000000 0x0000000000000001
+ sub $10, $7, $8
+ check10 0x0000000000000000 0xffffffff80000000
+
+
+test_sub3:
+ load $7 0x0000000000000000 0x0000000000000001
+ load $8 0x0000000000000000 0x0000000000000002
+ sub $10, $7, $8
+ check10 0x0000000000000000 0xffffffffffffffff
+
+
+ exit0