Make rep; nop (pause) yield the thread.  Based on a patch by Tom Hughes;
I added a test case and cleaned up vg_dispatch.S while I was about it.
CCMAIL: 69529-done@bugs.kde.org


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2129 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_scheduler.c b/coregrind/vg_scheduler.c
index 9d823e3..2a0719d 100644
--- a/coregrind/vg_scheduler.c
+++ b/coregrind/vg_scheduler.c
@@ -247,6 +247,7 @@
    switch (event) {
       case VG_TRC_EBP_JMP_SYSCALL:    return "SYSCALL";
       case VG_TRC_EBP_JMP_CLIENTREQ:  return "CLIENTREQ";
+      case VG_TRC_EBP_JMP_YIELD:      return "YIELD";
       case VG_TRC_INNER_COUNTERZERO:  return "COUNTERZERO";
       case VG_TRC_INNER_FASTMISS:     return "FASTMISS";
       case VG_TRC_UNRESUMABLE_SIGNAL: return "FATALSIGNAL";
@@ -1186,6 +1187,15 @@
 
       switch (trc) {
 
+         case VG_TRC_EBP_JMP_YIELD:
+            /* Explicit yield.  Let a new thread be scheduled,
+               simply by doing nothing, causing us to arrive back at
+               Phase 1. */
+            if (VG_(bbs_to_go) == 0) {
+               goto debug_stop;
+            }
+            break;
+
          case VG_TRC_INNER_COUNTERZERO:
             /* Timeslice is out.  Let a new thread be scheduled,
                simply by doing nothing, causing us to arrive back at