From 50d45d1b2f621f026868e9802e181bebe28e10b7 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 9 Apr 1996 05:57:15 +0000 Subject: [PATCH] * compile.c (sim_resume): Fix overflow checks for ALU insns. So that int-compare.c passes. --- sim/h8300/ChangeLog | 4 ++++ sim/h8300/compile.c | 50 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/sim/h8300/ChangeLog b/sim/h8300/ChangeLog index f573246282..ce54af3b9c 100644 --- a/sim/h8300/ChangeLog +++ b/sim/h8300/ChangeLog @@ -1,3 +1,7 @@ +Mon Apr 8 23:58:49 1996 Jeffrey A Law (law@cygnus.com) + + * compile.c (sim_resume): Fix overflow checks for ALU insns. + Fri Apr 5 17:20:59 1996 Jeffrey A Law (law@cygnus.com) * compile.c (decode): Use "bit" to hold L_3 immediates instead diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c index f55249ebbd..7892dc6b84 100644 --- a/sim/h8300/compile.c +++ b/sim/h8300/compile.c @@ -1508,8 +1508,22 @@ sim_resume (step, siggnal) just_flags_alu8: n = res & 0x80; nz = res & 0xff; - v = ((ea & 0x80) == (rd & 0x80)) && ((ea & 0x80) != (res & 0x80)); c = (res & 0x100); + switch (code->opcode / 4) + { + case O_ADD: + v = ((rd & 0x80) == (ea & 0x80) + && (rd & 0x80) != (res & 0x80)); + break; + case O_SUB: + case O_CMP: + v = ((rd & 0x80) != (-ea & 0x80) + && (rd & 0x80) != (res & 0x80)); + break; + case O_NEG: + v = (rd == 0x80); + break; + } goto next; alu16: @@ -1517,8 +1531,22 @@ sim_resume (step, siggnal) just_flags_alu16: n = res & 0x8000; nz = res & 0xffff; - v = ((ea & 0x8000) == (rd & 0x8000)) && ((ea & 0x8000) != (res & 0x8000)); c = (res & 0x10000); + switch (code->opcode / 4) + { + case O_ADD: + v = ((rd & 0x8000) == (ea & 0x8000) + && (rd & 0x8000) != (res & 0x8000)); + break; + case O_SUB: + case O_CMP: + v = ((rd & 0x8000) != (-ea & 0x8000) + && (rd & 0x8000) != (res & 0x8000)); + break; + case O_NEG: + v = (rd == 0x8000); + break; + } goto next; alu32: @@ -1526,8 +1554,22 @@ sim_resume (step, siggnal) just_flags_alu32: n = res & 0x80000000; nz = res & 0xffffffff; - v = ((ea & 0x80000000) == (rd & 0x80000000)) - && ((ea & 0x80000000) != (res & 0x80000000)); + switch (code->opcode / 4) + { + case O_ADD: + v = ((rd & 0x80000000) == (ea & 0x80000000) + && (rd & 0x80000000) != (res & 0x80000000)); + break; + case O_SUB: + case O_CMP: + v = ((rd & 0x80000000) != (-ea & 0x80000000) + && (rd & 0x80000000) != (res & 0x80000000)); + break; + case O_NEG: + v = (rd == 0x80000000); + break; + } + goto next; switch (code->opcode / 4) { case O_ADD: -- 2.34.1