* interp.c (do_format_4): Get operands correctly and
authorJeff Law <law@redhat.com>
Fri, 30 Aug 1996 05:49:07 +0000 (05:49 +0000)
committerJeff Law <law@redhat.com>
Fri, 30 Aug 1996 05:49:07 +0000 (05:49 +0000)
        call the target function.
        * simops.c: Rough cut at "sld.b", "sld.h", "sld.w", "sst.b",
        "sst.h", and "sst.w".

sim/v850/ChangeLog
sim/v850/interp.c
sim/v850/simops.c

index 7c33dba3c465e0fb913669527933faeaa689308a..eb1e52856b515bb78567e5372949c36f3e47b8f8 100644 (file)
@@ -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
index fbd808da1498f70e7b80739d36fcbd051cdb38ed..d47a1090fba832d51301679ac570f9579db8ad8d 100644 (file)
@@ -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
index 8a0bc9879fbfe53ea7d045f342be17263ef8afbd..f763d02888168dd163a1d804ab9b4132cd31f5bb 100644 (file)
@@ -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 */