diff options
Diffstat (limited to 'sim/m32c/r8c.opc')
-rw-r--r-- | sim/m32c/r8c.opc | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/sim/m32c/r8c.opc b/sim/m32c/r8c.opc index 4a6ba51..4db0bda 100644 --- a/sim/m32c/r8c.opc +++ b/sim/m32c/r8c.opc @@ -240,6 +240,15 @@ shift_op (srcdest sd, int arith, int count) { mask = 0xffffffffU; msb = 0x80000000U; + if (count > 16 || count < -16) + { + fprintf(stderr, "Error: SI shift of %d undefined\n", count); + exit(1); + } + if (count > 16) + count = (count - 1) % 16 + 1; + if (count < -16) + count = -((-count - 1) % 16 + 1); } tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count); @@ -292,6 +301,12 @@ shift_op (srcdest sd, int arith, int count) tprintf ("b=%d, carry=%d, %s = %d\n", b, carry, #expr, v); \ set_c (v); +/* The "BMcnd dest" opcode uses a different encoding for the */ +/* condition than other opcodes. */ +static int bmcnd_cond_map[] = { + 0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15 +}; + int decode_r8c() { @@ -448,7 +463,7 @@ decode_r8c() /** 0111 1110 0010 dest BMcnd dest */ dc = decode_bit (dest); - if (condition_true (IMM (0))) + if (condition_true (bmcnd_cond_map [IMM (0) & 15])) put_bit (dc, 1); else put_bit (dc, 0); |