aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/v850/ChangeLog5
-rw-r--r--sim/v850/interp.c6
-rw-r--r--sim/v850/simops.c50
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 */