diff options
-rw-r--r-- | gdb/Makefile.in | 2 | ||||
-rw-r--r-- | sim/arm/armemu.h | 3 | ||||
-rw-r--r-- | sim/arm/armsupp.c | 22 | ||||
-rw-r--r-- | sim/common/cgen-ops.h | 1 |
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) |