summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gdb/Makefile.in2
-rw-r--r--sim/arm/armemu.h3
-rw-r--r--sim/arm/armsupp.c22
-rw-r--r--sim/common/cgen-ops.h1
4 files changed, 22 insertions, 6 deletions
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 68292d53e2..a8cfafec1c 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -229,7 +229,7 @@ CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE) \
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
-VERSION = 20000124
+VERSION = 20000126
DIST=gdb
LINT=/usr/5bin/lint
diff --git a/sim/arm/armemu.h b/sim/arm/armemu.h
index 9c40b8cc23..e64dc93c6d 100644
--- a/sim/arm/armemu.h
+++ b/sim/arm/armemu.h
@@ -95,6 +95,7 @@ extern ARMword isize;
#define CLEARV state->VFlag = 0
#define ASSIGNV(res) state->VFlag = res
+
#define IFLAG (state->IFFlags >> 1)
#define FFLAG (state->IFFlags & 1)
#define IFFLAGS state->IFFlags
@@ -367,6 +368,8 @@ extern unsigned ARMul_NthReg(ARMword instr,unsigned number) ;
extern void ARMul_MSRCpsr(ARMul_State *state, ARMword instr, ARMword rhs) ;
extern void ARMul_NegZero(ARMul_State *state, ARMword result) ;
extern void ARMul_AddCarry(ARMul_State *state, ARMword a, ARMword b, ARMword result) ;
+extern int AddOverflow(ARMword a, ARMword b, ARMword result) ;
+extern int SubOverflow(ARMword a, ARMword b, ARMword result) ;
extern void ARMul_AddOverflow(ARMul_State *state, ARMword a, ARMword b, ARMword result) ;
extern void ARMul_SubCarry(ARMul_State *state, ARMword a, ARMword b, ARMword result) ;
extern void ARMul_SubOverflow(ARMul_State *state, ARMword a, ARMword b, ARMword result) ;
diff --git a/sim/arm/armsupp.c b/sim/arm/armsupp.c
index 67edd95594..4979fd8150 100644
--- a/sim/arm/armsupp.c
+++ b/sim/arm/armsupp.c
@@ -391,6 +391,20 @@ void ARMul_NegZero(ARMul_State *state, ARMword result)
else { CLEARN ; CLEARZ ; } ;
}
+/* Compute whether an addition of A and B, giving RESULT, overflowed. */
+int AddOverflow (ARMword a, ARMword b, ARMword result)
+{
+ return ((NEG (a) && NEG (b) && POS (result))
+ || (POS (a) && POS (b) && NEG (result)));
+}
+
+/* Compute whether a subtraction of A and B, giving RESULT, overflowed. */
+int SubOverflow (ARMword a, ARMword b, ARMword result)
+{
+ return ((NEG (a) && POS (b) && POS (result))
+ || (POS (a) && NEG (b) && NEG (result)));
+}
+
/***************************************************************************\
* Assigns the C flag after an addition of a and b to give result *
\***************************************************************************/
@@ -408,9 +422,8 @@ void ARMul_AddCarry(ARMul_State *state, ARMword a,ARMword b,ARMword result)
void ARMul_AddOverflow(ARMul_State *state, ARMword a,ARMword b,ARMword result)
{
- ASSIGNV( (NEG(a) && NEG(b) && POS(result)) ||
- (POS(a) && POS(b) && NEG(result)) ) ;
- }
+ ASSIGNV (AddOverflow (a, b, result));
+}
/***************************************************************************\
* Assigns the C flag after an subtraction of a and b to give result *
@@ -429,8 +442,7 @@ ASSIGNC( (NEG(a) && POS(b)) ||
void ARMul_SubOverflow(ARMul_State *state,ARMword a,ARMword b,ARMword result)
{
-ASSIGNV( (NEG(a) && POS(b) && POS(result)) ||
- (POS(a) && NEG(b) && NEG(result)) ) ;
+ ASSIGNV (SubOverflow (a, b, result));
}
/***************************************************************************\
diff --git a/sim/common/cgen-ops.h b/sim/common/cgen-ops.h
index 12fab70248..03f03f0116 100644
--- a/sim/common/cgen-ops.h
+++ b/sim/common/cgen-ops.h
@@ -222,6 +222,7 @@ extern DI EXTQIDI (QI);
#else
#define EXTQIDI(x) ((DI) (QI) (x))
#endif
+#define EXTHIHI(x) ((HI) (HI) (x))
#define EXTHISI(x) ((SI) (HI) (x))
#define EXTSISI(x) ((SI) (SI) (x))
#if defined (DI_FN_SUPPORT)
OpenPOWER on IntegriCloud