From 069398aaffc69e5930a29d6f55c6e9cac8f8fa37 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Mon, 9 Sep 1996 17:30:36 +0000 Subject: [PATCH] Fix accumulator shifts --- sim/d10v/ChangeLog | 6 ++++++ sim/d10v/simops.c | 30 +++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/sim/d10v/ChangeLog b/sim/d10v/ChangeLog index 57f9f1ae30..9703ca1166 100644 --- a/sim/d10v/ChangeLog +++ b/sim/d10v/ChangeLog @@ -1,3 +1,9 @@ +Mon Sep 9 13:27:26 1996 Michael Meissner + + * simops.c (trace_output): Properly align accumulator output. + (OP_3{0,2,4}00): Properly parenthesize test expression. Add error + if shift count is too high. + Fri Sep 6 17:56:17 1996 Martin M. Hunt * simops.c (OP_2600, OP_2601): Changed min and max comparisons diff --git a/sim/d10v/simops.c b/sim/d10v/simops.c index dc05f5e936..6b8329b38e 100644 --- a/sim/d10v/simops.c +++ b/sim/d10v/simops.c @@ -325,14 +325,14 @@ trace_output (result) case OP_ACCUM: case OP_ACCUM_OUTPUT: - (*d10v_callback->printf_filtered) (d10v_callback, " :: %*s0x%.2x%.8lx F0=%d F1=%d C=%d\n", SIZE_VALUES-10, "", + (*d10v_callback->printf_filtered) (d10v_callback, " :: %*s0x%.2x%.8lx F0=%d F1=%d C=%d\n", SIZE_VALUES-12, "", ((int)(State.a[OP[0]] >> 32) & 0xff), ((unsigned long)State.a[OP[0]]) & 0xffffffff, State.F0 != 0, State.F1 != 0, State.C != 0); break; case OP_ACCUM_REVERSE: - (*d10v_callback->printf_filtered) (d10v_callback, " :: %*s0x%.2x%.8lx F0=%d F1=%d C=%d\n", SIZE_VALUES-10, "", + (*d10v_callback->printf_filtered) (d10v_callback, " :: %*s0x%.2x%.8lx F0=%d F1=%d C=%d\n", SIZE_VALUES-12, "", ((int)(State.a[OP[1]] >> 32) & 0xff), ((unsigned long)State.a[OP[1]]) & 0xffffffff, State.F0 != 0, State.F1 != 0, State.C != 0); @@ -1913,8 +1913,14 @@ OP_3200 () { int64 tmp; trace_input ("sll", OP_ACCUM, OP_REG, OP_VOID); - if (State.regs[OP[1]] & 31 <= 16) + if ((State.regs[OP[1]] & 31) <= 16) tmp = SEXT40 (State.a[OP[0]]) << (State.regs[OP[1]] & 31); + else + { + (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", State.regs[OP[1]] & 31); + State.exception = SIGILL; + return; + } if (State.ST) { @@ -1990,8 +1996,15 @@ void OP_3400 () { trace_input ("sra", OP_ACCUM, OP_REG, OP_VOID); - if (State.regs[OP[1]] & 31 <= 16) + if ((State.regs[OP[1]] & 31) <= 16) State.a[OP[0]] >>= (State.regs[OP[1]] & 31); + else + { + (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", State.regs[OP[1]] & 31); + State.exception = SIGILL; + return; + } + trace_output (OP_ACCUM); } @@ -2030,8 +2043,15 @@ void OP_3000 () { trace_input ("srl", OP_ACCUM, OP_REG, OP_VOID); - if (State.regs[OP[1]] & 31 <= 16) + if ((State.regs[OP[1]] & 31) <= 16) State.a[OP[0]] >>= (State.regs[OP[1]] & 31); + else + { + (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", State.regs[OP[1]] & 31); + State.exception = SIGILL; + return; + } + trace_output (OP_ACCUM); } -- 2.34.1