Index: /branches/purify/source/lisp-kernel/x86-gc.c
===================================================================
--- /branches/purify/source/lisp-kernel/x86-gc.c	(revision 13259)
+++ /branches/purify/source/lisp-kernel/x86-gc.c	(revision 13260)
@@ -2256,13 +2256,4 @@
 
 
-  /* Leave a trail of breadcrumbs.  Or maybe just one breadcrumb. */
-  /* Actually, it's best to always leave a trail, for two reasons.
-     a) We may be walking the same heap that we're leaving forwaring
-     pointers in, so we don't want garbage that we leave behind to
-     look like a header.
-     b) We'd like to be able to forward code-vector locatives, and
-     it's easiest to do so if we leave a {forward_marker, dnode_locative}
-     pair at every doubleword in the old vector.
-     */
   while(physbytes) {
     *old++ = (BytePtr) forward_marker;
@@ -2281,5 +2272,5 @@
 
 Boolean
-copy_reference(LispObj *ref, BytePtr low, BytePtr high, area *dest, int what)
+purify_locref(LispObj *ref,  BytePtr low, BytePtr high, area *dest, int what)
 {
   LispObj obj = *ref, header, new;
@@ -2287,36 +2278,49 @@
   Boolean changed = false;
 
+  if ((((BytePtr)ptr_from_lispobj(obj)) > low) &&
+      (((BytePtr)ptr_from_lispobj(obj)) < high)) {
+    header = deref(obj, 0);
+    if (header == forward_marker) { /* already copied */
+      *ref = (untag(deref(obj,1)) + tag);
+      changed = true;
+    } else {
+      header_tag = fulltag_of(header);
+      if ((what == PURIFY_ALL) ||
+          ((what & PURIFY_IVECTORS) &&
+           immheader_tag_p(header_tag) &&
+           header_subtag(header) != subtag_macptr) ||
+          ((what & PURIFY_FUNCTIONS) &&
+           immutable_function_p(obj))) {
+        new = purify_object(obj, dest);
+        *ref = new;
+        changed = (new != obj);
+      }
+    }
+  }
+  return changed;
+}
+
+Boolean
+copy_reference(LispObj *ref, BytePtr low, BytePtr high, area *dest, int what)
+{
+  LispObj obj = *ref;
+  natural tag = fulltag_of(obj);
+
   if (
 #ifdef X8664
-      (tag != fulltag_tra_0) && (tag != fulltag_tra_1)
+      (tag == fulltag_tra_0) || (tag == fulltag_tra_1)
 #endif
 #ifdef X8632
-      tag != fulltag_tra
+      tag == fulltag_tra
 #endif
       ) {
-    if (is_node_fulltag(tag) &&
-        (((BytePtr)ptr_from_lispobj(obj)) > low) &&
-        (((BytePtr)ptr_from_lispobj(obj)) < high)) {
-      header = deref(obj, 0);
-      if (header == forward_marker) { /* already copied */
-        *ref = (untag(deref(obj,1)) + tag);
-        changed = true;
-      } else {
-        header_tag = fulltag_of(header);
-        if ((what == PURIFY_ALL) ||
-            ((what & PURIFY_IVECTORS) &&
-             immheader_tag_p(header_tag) &&
-             header_subtag(header) != subtag_macptr) ||
-            ((what & PURIFY_FUNCTIONS) &&
-             immutable_function_p(obj))) {
-          new = purify_object(obj, dest);
-          *ref = new;
-          changed = (new != obj);
-        }
-      }
-    }
-  }
-  return changed;
-}
+    what = PURIFY_NOTHING;
+  }
+  if (is_node_fulltag(tag)) {
+    return purify_locref(ref,low,high,dest,what);
+  }
+  return false;
+}
+
 
 
@@ -2469,7 +2473,7 @@
   copy_reference(&(regs[Itemp1]), low, high, to, what);
   copy_reference(&(regs[Itemp2]), low, high, to, what);
-#if 0
-  purify_locref(&(regs[Iip]), low, high, to, what);
-#endif
+
+  purify_locref(&(regs[Iip]), low, high, to, PURIFY_NOTHING);
+
 #else
 #endif
