Fix brf0{t,f}.s <label> -> instruction not to execute instruction if branch succeeds
authorMichael Meissner <gnu@the-meissners.org>
Sun, 15 Sep 1996 03:46:52 +0000 (03:46 +0000)
committerMichael Meissner <gnu@the-meissners.org>
Sun, 15 Sep 1996 03:46:52 +0000 (03:46 +0000)
sim/d10v/ChangeLog
sim/d10v/interp.c

index bd1e1ad8fe12ccf7438277c5fb723710ef3917fd..3f22811d19434553a0c0ae9c1002d618478500c7 100644 (file)
@@ -1,3 +1,8 @@
+Sat Sep 14 22:18:43 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
+
+       * interp.c (do_2_short): If the instruction encodes jump->ins,
+       don't do the second instruction if the jump succeeds.
+
 Fri Sep 13 22:35:19 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * simops.c (OP_5F00): Use unknown traps to print all GPRs,
index 38b4d4c7ea0d082464e7054933fba284e45e3ff0..f035cf08d663693862f96f7985e6ef6c712f06be 100644 (file)
@@ -158,12 +158,15 @@ do_long (ins)
   ins_type_counters[ (int)State.ins_type ]++;
   (h->ops->func)();
 }
+
 static void
 do_2_short (ins1, ins2, leftright)
      uint16 ins1, ins2;
      enum _leftright leftright;
 {
   struct hash_entry *h;
+  reg_t orig_pc = PC;
+
 #ifdef DEBUG
   if ((d10v_debug & DEBUG_INSTRUCTION) != 0)
     (*d10v_callback->printf_filtered) (d10v_callback, "do_2_short 0x%x (%s) -> 0x%x\n",
@@ -175,12 +178,18 @@ do_2_short (ins1, ins2, leftright)
   State.ins_type = (leftright == LEFT_FIRST) ? INS_LEFT : INS_RIGHT;
   ins_type_counters[ (int)State.ins_type ]++;
   (h->ops->func)();
-  h = lookup_hash (ins2, 0);
-  get_operands (h->ops, ins2);
-  State.ins_type = (leftright == LEFT_FIRST) ? INS_RIGHT : INS_LEFT;
-  ins_type_counters[ (int)State.ins_type ]++;
-  (h->ops->func)();
+
+  /* If the PC has changed (ie, a jump), don't do the second instruction */
+  if (orig_pc == PC)
+    {
+      h = lookup_hash (ins2, 0);
+      get_operands (h->ops, ins2);
+      State.ins_type = (leftright == LEFT_FIRST) ? INS_RIGHT : INS_LEFT;
+      ins_type_counters[ (int)State.ins_type ]++;
+      (h->ops->func)();
+    }
 }
+
 static void
 do_parallel (ins1, ins2)
      uint16 ins1, ins2;