diff options
author | Jeff Law <law@redhat.com> | 1996-08-30 05:49:07 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1996-08-30 05:49:07 +0000 |
commit | 3cb6bf7818b30b5501abf49022451e10fcd499f0 (patch) | |
tree | 06027ff8d36e5f0a949bfe2d1bca917c65a8ad8a | |
parent | 28647e4c0c74b2426a530b2b9ec3c95b92944662 (diff) | |
download | fsf-binutils-gdb-3cb6bf7818b30b5501abf49022451e10fcd499f0.zip fsf-binutils-gdb-3cb6bf7818b30b5501abf49022451e10fcd499f0.tar.gz fsf-binutils-gdb-3cb6bf7818b30b5501abf49022451e10fcd499f0.tar.bz2 |
* 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".
-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 */ |