diff options
-rw-r--r-- | sim/v850/ChangeLog | 5 | ||||
-rw-r--r-- | sim/v850/interp.c | 6 | ||||
-rw-r--r-- | sim/v850/simops.c | 50 |
3 files changed, 61 insertions, 0 deletions
diff --git a/sim/v850/ChangeLog b/sim/v850/ChangeLog index 7c33dba..eb1e528 100644 --- a/sim/v850/ChangeLog +++ b/sim/v850/ChangeLog @@ -1,5 +1,10 @@ Thu Aug 29 13:53:29 1996 Jeffrey A Law (law@cygnus.com) + * interp.c (do_format_4): Get operands correctly and + call the target function. + * simops.c: Rough cut at "sld.b", "sld.h", "sld.w", "sst.b", + "sst.h", and "sst.w". + * v850_sim.h: The V850 doesn't have split I&D spaces. Change accordingly. Remove many unused definitions. * interp.c: The V850 doesn't have split I&D spaces. Change diff --git a/sim/v850/interp.c b/sim/v850/interp.c index fbd808d..d47a109 100644 --- a/sim/v850/interp.c +++ b/sim/v850/interp.c @@ -154,7 +154,13 @@ static void do_format_4 (insn) uint32 insn; { + struct hash_entry *h; printf("format 4 0x%x\n", insn); + + h = lookup_hash (insn); + OP[0] = (insn >> 11) & 0x1f; + OP[1] = (insn & 0x7f); + (h->ops->func) (); } static void diff --git a/sim/v850/simops.c b/sim/v850/simops.c index 8a0bc98..f763d02 100644 --- a/sim/v850/simops.c +++ b/sim/v850/simops.c @@ -6,36 +6,86 @@ void OP_300 () { + unsigned int op0, op1, op2; + int result, temp; + + temp = OP[1]; + temp = (temp << 25) >> 25; + op2 = temp; + result = get_byte (State.mem + State.regs[30] + op2); + result = (result << 24) >> 24; + State.regs[OP[0]] = result; } /* sld.h */ void OP_400 () { + unsigned int op0, op1, op2; + int result, temp; + + temp = OP[1]; + temp = (temp << 25) >> 25; + op2 = temp << 1; + result = get_half (State.mem + State.regs[30] + op2); + result = (result << 16) >> 16; + State.regs[OP[0]] = result; } /* sld.w */ void OP_500 () { + unsigned int op0, op1, op2; + int result, temp; + + temp = OP[1]; + temp = (temp << 25) >> 25; + op2 = temp << 2; + result = get_word (State.mem + State.regs[30] + op2); + State.regs[OP[0]] = result; } /* sst.b */ void OP_380 () { + unsigned int op0, op1, op2; + int result, temp; + + op0 = State.regs[OP[0]]; + temp = OP[1]; + temp = (temp << 25) >> 25; + op1 = temp; + put_byte (State.mem + State.regs[30] + op1, op0); } /* sst.h */ void OP_480 () { + unsigned int op0, op1, op2; + int result, temp; + + op0 = State.regs[OP[0]]; + temp = OP[1]; + temp = (temp << 25) >> 25; + op1 = temp << 1; + put_half (State.mem + State.regs[30] + op1, op0); } /* sst.w */ void OP_501 () { + unsigned int op0, op1, op2; + int result, temp; + + op0 = State.regs[OP[0]]; + temp = OP[1]; + temp = (temp << 25) >> 25; + op1 = temp << 2; + put_word (State.mem + State.regs[30] + op1, op0); } /* ld.b */ |