Revision: 8195
Author:   [email protected]
Date:     Tue Jun  7 02:28:08 2011
Log:      Call a stub for the write barrier on ARM.  This is a step
towards incremental marking on ARM.
Review URL: http://codereview.chromium.org/7113012
http://code.google.com/p/v8/source/detail?r=8195

Modified:
 /branches/experimental/gc/src/arm/code-stubs-arm.cc
 /branches/experimental/gc/src/arm/full-codegen-arm.cc
 /branches/experimental/gc/src/arm/ic-arm.cc
 /branches/experimental/gc/src/arm/lithium-codegen-arm.cc
 /branches/experimental/gc/src/arm/macro-assembler-arm.cc
 /branches/experimental/gc/src/arm/macro-assembler-arm.h
 /branches/experimental/gc/src/arm/stub-cache-arm.cc
 /branches/experimental/gc/src/ia32/code-stubs-ia32.cc
 /branches/experimental/gc/src/ia32/code-stubs-ia32.h
 /branches/experimental/gc/src/ia32/macro-assembler-ia32.cc
 /branches/experimental/gc/src/ia32/macro-assembler-ia32.h

=======================================
--- /branches/experimental/gc/src/arm/code-stubs-arm.cc Wed May 25 07:05:16 2011 +++ /branches/experimental/gc/src/arm/code-stubs-arm.cc Tue Jun 7 02:28:08 2011
@@ -4403,6 +4403,7 @@
                       RegExpImpl::kLastSubjectOffset,
                       r2,
                       r7,
+                      kLRHasNotBeenSaved,
                       kDontSaveFPRegs);
   __ str(subject,
          FieldMemOperand(last_match_info_elements,
@@ -4411,6 +4412,7 @@
                       RegExpImpl::kLastInputOffset,
                       subject,
                       r7,
+                      kLRHasNotBeenSaved,
                       kDontSaveFPRegs);

   // Get the static offsets vector filled by the native regexp code.
@@ -6446,6 +6448,19 @@
   __ mov(result, Operand(0));
   __ Ret();
 }
+
+
+// Takes the input in 3 registers: address_ value_ and object_. A pointer to +// the value has just been written into the object, now this stub makes sure +// we keep the GC informed. The word in the object where the value has been
+// written is in the address register.
+void RecordWriteStub::Generate(MacroAssembler* masm) {
+  if (remembered_set_action_ == EMIT_REMEMBERED_SET) {
+    __ RememberedSetHelper(
+ address_, value_, save_fp_regs_mode_, MacroAssembler::kReturnAtEnd);
+  }
+  __ Ret();
+}


 #undef __
=======================================
--- /branches/experimental/gc/src/arm/full-codegen-arm.cc Wed May 25 07:05:16 2011 +++ /branches/experimental/gc/src/arm/full-codegen-arm.cc Tue Jun 7 02:28:08 2011
@@ -203,7 +203,8 @@
         __ str(r0, target);

         // Update the write barrier.
- __ RecordWriteContextSlot(cp, target.offset(), r0, r3, kDontSaveFPRegs);
+        __ RecordWriteContextSlot(
+            cp, target.offset(), r0, r3, kLRHasBeenSaved, kDontSaveFPRegs);
       }
     }
   }
@@ -648,8 +649,12 @@

   // Emit the write barrier code if the location is in the heap.
   if (dst->type() == Slot::CONTEXT) {
-    __ RecordWriteContextSlot(
-        scratch1, location.offset(), src, scratch2, kDontSaveFPRegs);
+    __ RecordWriteContextSlot(scratch1,
+                              location.offset(),
+                              src,
+                              scratch2,
+                              kLRHasBeenSaved,
+                              kDontSaveFPRegs);
   }
 }

@@ -729,6 +734,7 @@
                                     target.offset(),
                                     result_register(),
                                     r2,
+                                    kLRHasBeenSaved,
                                     kDontSaveFPRegs,
                                     EMIT_REMEMBERED_SET,
                                     OMIT_SMI_CHECK);
@@ -1553,7 +1559,8 @@

     // Update the write barrier for the array store with r0 as the scratch
     // register.
- __ RecordWriteField(r1, offset, result_register(), r2, kDontSaveFPRegs);
+    __ RecordWriteField(
+ r1, offset, result_register(), r2, kLRHasBeenSaved, kDontSaveFPRegs);

     PrepareForBailoutForId(expr->GetIdForElement(i), NO_REGISTERS);
   }
@@ -1935,7 +1942,8 @@
         MemOperand target = ContextOperand(r1, slot->index());
         __ str(r0, target);
         __ mov(r3, r0);  // Preserve the stored value in r0.
- __ RecordWriteContextSlot(r1, target.offset(), r3, r2, kDontSaveFPRegs);
+        __ RecordWriteContextSlot(
+            r1, target.offset(), r3, r2, kLRHasBeenSaved, kDontSaveFPRegs);
         break;
       }
       case Slot::LOOKUP:
@@ -1965,7 +1973,8 @@
// The value of the assignment is in result_register(). RecordWrite
         // clobbers its second and third register arguments.
         __ mov(r3, result_register());
- __ RecordWriteContextSlot(r1, target.offset(), r3, r2, kDontSaveFPRegs);
+        __ RecordWriteContextSlot(
+            r1, target.offset(), r3, r2, kLRHasBeenSaved, kDontSaveFPRegs);
         break;
       }

@@ -2969,7 +2978,8 @@
   // Update the write barrier.  Save the value as it will be
   // overwritten by the write barrier code and is needed afterward.
   __ mov(r2, r0);
-  __ RecordWriteField(r1, JSValue::kValueOffset, r2, r3, kDontSaveFPRegs);
+  __ RecordWriteField(
+      r1, JSValue::kValueOffset, r2, r3, kLRHasBeenSaved, kDontSaveFPRegs);

   __ bind(&done);
   context()->Plug(r0);
@@ -3265,8 +3275,10 @@
   // Possible optimization: do a check that both values are Smis
   // (or them and test against Smi mask.)

-  __ RememberedSetHelper(index1, scratch2, kDontSaveFPRegs);
-  __ RememberedSetHelper(index2, scratch2, kDontSaveFPRegs);
+  __ RememberedSetHelper(
+ index1, scratch2, kDontSaveFPRegs, MacroAssembler::kFallThroughAtEnd);
+  __ RememberedSetHelper(
+ index2, scratch2, kDontSaveFPRegs, MacroAssembler::kFallThroughAtEnd);

   __ bind(&no_remembered_set);
   // We are done. Drop elements from the stack, and return undefined.
=======================================
--- /branches/experimental/gc/src/arm/ic-arm.cc Wed May 25 07:05:16 2011
+++ /branches/experimental/gc/src/arm/ic-arm.cc Tue Jun  7 02:28:08 2011
@@ -209,7 +209,8 @@

   // Update the write barrier. Make sure not to clobber the value.
   __ mov(scratch1, value);
-  __ RecordWrite(elements, scratch2, scratch1, kDontSaveFPRegs);
+  __ RecordWrite(
+      elements, scratch2, scratch1, kLRHasNotBeenSaved, kDontSaveFPRegs);
 }


@@ -1302,6 +1303,7 @@
   __ RecordWrite(elements,
                  address,
                  scratch_value,
+                 kLRHasNotBeenSaved,
                  kDontSaveFPRegs,
                  EMIT_REMEMBERED_SET,
                  OMIT_SMI_CHECK);
=======================================
--- /branches/experimental/gc/src/arm/lithium-codegen-arm.cc Wed May 25 07:05:16 2011 +++ /branches/experimental/gc/src/arm/lithium-codegen-arm.cc Tue Jun 7 02:28:08 2011
@@ -208,7 +208,8 @@
         MemOperand target = ContextOperand(cp, slot->index());
         __ str(r0, target);
         // Update the write barrier. This clobbers r3 and r0.
- __ RecordWriteContextSlot(cp, target.offset(), r0, r3, kSaveFPRegs);
+        __ RecordWriteContextSlot(
+            cp, target.offset(), r0, r3, kLRHasBeenSaved, kSaveFPRegs);
       }
     }
     Comment(";;; End allocate local context");
@@ -2364,8 +2365,12 @@
   MemOperand target = ContextOperand(context, instr->slot_index());
   __ str(value, target);
   if (instr->needs_write_barrier()) {
-    __ RecordWriteContextSlot(
-        context, target.offset(), value, scratch0(), kSaveFPRegs);
+    __ RecordWriteContextSlot(context,
+                              target.offset(),
+                              value,
+                              scratch0(),
+                              kLRHasBeenSaved,
+                              kSaveFPRegs);
   }
 }

@@ -3305,7 +3310,8 @@
     __ str(value, FieldMemOperand(object, offset));
     if (instr->needs_write_barrier()) {
       // Update the write barrier for the object for in-object properties.
-      __ RecordWriteField(object, offset, value, scratch, kSaveFPRegs);
+      __ RecordWriteField(
+          object, offset, value, scratch, kLRHasBeenSaved, kSaveFPRegs);
     }
   } else {
     __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
@@ -3313,7 +3319,8 @@
     if (instr->needs_write_barrier()) {
       // Update the write barrier for the properties array.
       // object is used as a scratch register.
-      __ RecordWriteField(scratch, offset, value, object, kSaveFPRegs);
+      __ RecordWriteField(
+          scratch, offset, value, object, kLRHasBeenSaved, kSaveFPRegs);
     }
   }
 }
@@ -3359,7 +3366,7 @@
   if (instr->hydrogen()->NeedsWriteBarrier()) {
     // Compute address of modified element and store it into key register.
     __ add(key, scratch, Operand(FixedArray::kHeaderSize));
-    __ RecordWrite(elements, key, value, kSaveFPRegs);
+    __ RecordWrite(elements, key, value, kLRHasBeenSaved, kSaveFPRegs);
   }
 }

=======================================
--- /branches/experimental/gc/src/arm/macro-assembler-arm.cc Mon Jun 6 04:22:38 2011 +++ /branches/experimental/gc/src/arm/macro-assembler-arm.cc Tue Jun 7 02:28:08 2011
@@ -482,6 +482,7 @@
     int offset,
     Register value,
     Register dst,
+    LinkRegisterStatus lr_status,
     SaveFPRegsMode save_fp,
     RememberedSetAction remembered_set_action,
     SmiCheck smi_check) {
@@ -506,8 +507,13 @@
     bind(&ok);
   }

-  RecordWrite(
-      object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK);
+  RecordWrite(object,
+              dst,
+              value,
+              lr_status,
+              save_fp,
+              remembered_set_action,
+              OMIT_SMI_CHECK);

   bind(&done);

@@ -525,38 +531,60 @@
 // tag is shifted away.
 void MacroAssembler::RecordWrite(Register object,
                                  Register address,
-                                 Register scratch,
+                                 Register value,
+                                 LinkRegisterStatus lr_status,
                                  SaveFPRegsMode fp_mode,
                                  RememberedSetAction remembered_set_action,
                                  SmiCheck smi_check) {
   // The compiled code assumes that record write doesn't change the
   // context register, so we check that none of the clobbered
   // registers are cp.
-  ASSERT(!address.is(cp) && !scratch.is(cp));
+  ASSERT(!address.is(cp) && !value.is(cp));

   Label done;

-  // First, test that the object is not in the new space.  We cannot set
-  // region marks for new space pages.
-  InNewSpace(object, scratch, eq, &done);
+  if (smi_check == INLINE_SMI_CHECK) {
+    ASSERT_EQ(0, kSmiTag);
+    tst(value, Operand(kSmiTagMask));
+    b(eq, &done);
+  }
+
+  CheckPageFlag(value,
+                value,  // Used as scratch.
+                MemoryChunk::POINTERS_TO_HERE_ARE_INTERESTING,
+                eq,
+                &done);
+  CheckPageFlag(object,
+                value,  // Used as scratch.
+                MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING,
+                eq,
+                &done);

   // Record the actual write.
-  RememberedSetHelper(address, scratch, fp_mode);
+  if (lr_status == kLRHasNotBeenSaved) {
+    push(lr);
+  }
+ RecordWriteStub stub(object, value, address, remembered_set_action, fp_mode);
+  CallStub(&stub);
+  if (lr_status == kLRHasNotBeenSaved) {
+    pop(lr);
+  }

   bind(&done);

-  // Clobber all input registers when running with the debug-code flag
+  // Clobber clobbered registers when running with the debug-code flag
   // turned on to provoke errors.
   if (emit_debug_code()) {
     mov(address, Operand(BitCast<int32_t>(kZapValue + 12)));
-    mov(scratch, Operand(BitCast<int32_t>(kZapValue + 16)));
+    mov(value, Operand(BitCast<int32_t>(kZapValue + 16)));
   }
 }


 void MacroAssembler::RememberedSetHelper(Register address,
                                          Register scratch,
-                                         SaveFPRegsMode fp_mode) {
+                                         SaveFPRegsMode fp_mode,
+ RememberedSetFinalAction and_then) {
   Label done;
   // Load store buffer top.
   ExternalReference store_buffer =
@@ -570,13 +598,21 @@
   // Call stub on end of buffer.
   // Check for end of buffer.
   tst(scratch, Operand(StoreBuffer::kStoreBufferOverflowBit));
-  b(eq, &done);
+  if (and_then == kFallThroughAtEnd) {
+    b(eq, &done);
+  } else {
+    ASSERT(and_then == kReturnAtEnd);
+    Ret(ne);
+  }
   push(lr);
   StoreBufferOverflowStub store_buffer_overflow =
       StoreBufferOverflowStub(fp_mode);
   CallStub(&store_buffer_overflow);
   pop(lr);
   bind(&done);
+  if (and_then == kReturnAtEnd) {
+    Ret();
+  }
 }


@@ -3090,6 +3126,58 @@
   tst(scratch, Operand(1 << flag));
   b(cc, condition_met);
 }
+
+
+void MacroAssembler::IsBlack(Register object,
+                             Register scratch0,
+                             Register scratch1,
+                             Label* is_black) {
+ HasColor(object, scratch0, scratch1, is_black, 1, 0); // kBlackBitPattern.
+  ASSERT(strcmp(Marking::kBlackBitPattern, "10") == 0);
+}
+
+
+void MacroAssembler::HasColor(Register object,
+                              Register bitmap_scratch,
+                              Register mask_scratch,
+                              Label* has_color,
+                              int first_bit,
+                              int second_bit) {
+  ASSERT(!Aliasing(object, bitmap_scratch, mask_scratch, no_reg));
+
+  GetMarkBits(object, bitmap_scratch, mask_scratch);
+
+  Label other_color, word_boundary;
+  ldr(ip, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize));
+  tst(ip, Operand(mask_scratch));
+  b(first_bit == 1 ? eq : ne, &other_color);
+  // Shift left 1 by adding.
+  add(mask_scratch, mask_scratch, Operand(mask_scratch), SetCC);
+  b(eq, &word_boundary);
+  tst(ip, Operand(mask_scratch));
+  b(second_bit == 1 ? ne : eq, has_color);
+  jmp(&other_color);
+
+  bind(&word_boundary);
+ ldr(ip, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize + kPointerSize));
+  tst(ip, Operand(1));
+  b(second_bit == 1 ? ne : eq, has_color);
+  bind(&other_color);
+}
+
+
+void MacroAssembler::GetMarkBits(Register addr_reg,
+                                 Register bitmap_reg,
+                                 Register mask_reg) {
+  ASSERT(!Aliasing(addr_reg, bitmap_reg, mask_reg, no_reg));
+  and_(bitmap_reg, addr_reg, Operand(~Page::kPageAlignmentMask));
+  Ubfx(mask_reg, addr_reg, kPointerSizeLog2, Bitmap::kBitsPerCellLog2);
+  const int kLowBits = kPointerSizeLog2 + Bitmap::kBitsPerCellLog2;
+  Ubfx(ip, addr_reg, kLowBits, kPageSizeBits - kLowBits);
+  add(bitmap_reg, bitmap_reg, Operand(ip, LSL, kPointerSizeLog2));
+  mov(ip, Operand(1));
+  mov(mask_reg, Operand(ip, LSL, mask_reg));
+}


 void MacroAssembler::ClampUint8(Register output_reg, Register input_reg) {
@@ -3139,6 +3227,17 @@
   mov(descriptors, Operand(FACTORY->empty_descriptor_array()));
   bind(&not_smi);
 }
+
+
+bool Aliasing(Register r1, Register r2, Register r3, Register r4) {
+  if (r1.is(r2)) return true;
+  if (r1.is(r3)) return true;
+  if (r1.is(r4)) return true;
+  if (r2.is(r3)) return true;
+  if (r2.is(r4)) return true;
+  if (r3.is(r4)) return true;
+  return false;
+}


 CodePatcher::CodePatcher(byte* address, int instructions)
=======================================
--- /branches/experimental/gc/src/arm/macro-assembler-arm.h Mon Jun 6 04:22:38 2011 +++ /branches/experimental/gc/src/arm/macro-assembler-arm.h Tue Jun 7 02:28:08 2011
@@ -81,6 +81,7 @@

 enum RememberedSetAction { EMIT_REMEMBERED_SET, OMIT_REMEMBERED_SET };
 enum SmiCheck { INLINE_SMI_CHECK, OMIT_SMI_CHECK };
+enum LinkRegisterStatus { kLRHasNotBeenSaved, kLRHasBeenSaved };


 bool Aliasing(Register r1, Register r2, Register r3, Register r4);
@@ -164,11 +165,31 @@
                  Heap::RootListIndex index,
                  Condition cond = al);

- // Enters the address into the store buffer. RememberedSetHelper only works
-  // if the address is not in new space.
-  void RememberedSetHelper(Register address,
+ // ---------------------------------------------------------------------------
+  // GC Support
+
+  void IncrementalMarkingRecordWriteHelper(Register object,
+                                           Register value,
+                                           Register address);
+
+  enum RememberedSetFinalAction {
+    kReturnAtEnd,
+    kFallThroughAtEnd
+  };
+
+  // For page containing |object| mark region covering |addr| dirty.
+  // RememberedSetHelper only works if the object is not in new
+  // space.
+  void RememberedSetHelper(Register addr,
                            Register scratch,
-                           SaveFPRegsMode save_fp);
+                           SaveFPRegsMode save_fp,
+                           RememberedSetFinalAction and_then);
+
+  void CheckPageFlag(Register object,
+                     Register scratch,
+                     MemoryChunk::MemoryChunkFlags flag,
+                     Condition cc,
+                     Label* condition_met);

   // Check if object is in new space.
   // scratch can be object itself, but it will be clobbered.
@@ -177,11 +198,40 @@
                   Condition cond,  // eq for new space, ne otherwise.
                   Label* branch);

-  void CheckPageFlag(Register object,
-                     Register scratch,
-                     MemoryChunk::MemoryChunkFlags flag,
-                     Condition cc,
-                     Label* condition_met);
+ // Check if an object has a given incremental marking color. The color bits
+  // are found by splitting the address at the bit offset indicated by the
+  // mask: bits that are zero in the mask are used for the address of the
+ // bitmap, and bits that are one in the mask are used for the index of the
+  // bit.
+  void HasColor(Register object,
+                Register scratch0,
+                Register scratch1,
+                Label* has_color,
+                int first_bit,
+                int second_bit);
+
+  void IsBlack(Register object,
+               Register scratch0,
+               Register scratch1,
+               Label* is_black);
+
+  // Checks the color of an object.  If the object is already grey or black
+ // then we just fall through, since it is already live. If it is white and + // we can determine that it doesn't need to be scanned, then we just mark it
+  // black and fall through.  For the rest we jump to the label so the
+  // incremental marker can fix its assumptions.
+  void EnsureNotWhite(Register object,
+                      Register scratch1,
+                      Register scratch2,
+                      Label* object_is_white_and_not_data,
+                      Label::Distance distance);
+
+ // Checks whether an object is data-only, ie it does need to be scanned by the
+  // garbage collector.
+  void IsDataObject(Register value,
+                    Register scratch,
+                    Label* not_data_object,
+                    Label::Distance not_data_object_distance);

   // Notify the garbage collector that we wrote a pointer into an object.
   // |object| is the object being stored into, |value| is the object being
@@ -195,6 +245,7 @@
       int offset,
       Register value,
       Register scratch,
+      LinkRegisterStatus lr_status,
       SaveFPRegsMode save_fp,
       RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
       SmiCheck smi_check = INLINE_SMI_CHECK);
@@ -206,6 +257,7 @@
       int offset,
       Register value,
       Register scratch,
+      LinkRegisterStatus lr_status,
       SaveFPRegsMode save_fp,
       RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
       SmiCheck smi_check = INLINE_SMI_CHECK) {
@@ -213,6 +265,7 @@
                      offset + kHeapObjectTag,
                      value,
                      scratch,
+                     lr_status,
                      save_fp,
                      remembered_set_action,
                      smi_check);
@@ -225,6 +278,7 @@
       Register object,
       Register address,
       Register value,
+      LinkRegisterStatus lr_status,
       SaveFPRegsMode save_fp,
       RememberedSetAction remembered_set_action = EMIT_REMEMBERED_SET,
       SmiCheck smi_check = INLINE_SMI_CHECK);
@@ -1086,6 +1140,13 @@
                            Register scratch1,
                            Register scratch2);

+  // Helper for finding the mark bits for an address.  Afterwards, the
+  // bitmap register points at the word with the mark bits and the mask
+  // the position of the first bit.  Leaves addr_reg unchanged.
+  inline void GetMarkBits(Register addr_reg,
+                          Register bitmap_reg,
+                          Register mask_reg);
+
   // Compute memory operands for safepoint stack slots.
   static int SafepointRegisterStackIndex(int reg_code);
   MemOperand SafepointRegisterSlot(Register reg);
=======================================
--- /branches/experimental/gc/src/arm/stub-cache-arm.cc Wed May 25 07:05:16 2011 +++ /branches/experimental/gc/src/arm/stub-cache-arm.cc Tue Jun 7 02:28:08 2011
@@ -433,8 +433,12 @@
     // Update the write barrier for the array address.
     // Pass the now unused name_reg as a scratch register.
     __ mov(name_reg, r0);
-    __ RecordWriteField(
-        receiver_reg, offset, name_reg, scratch, kDontSaveFPRegs);
+    __ RecordWriteField(receiver_reg,
+                        offset,
+                        name_reg,
+                        scratch,
+                        kLRHasNotBeenSaved,
+                        kDontSaveFPRegs);
   } else {
     // Write to the properties array.
     int offset = index * kPointerSize + FixedArray::kHeaderSize;
@@ -445,8 +449,12 @@
     // Update the write barrier for the array address.
     // Ok to clobber receiver_reg and name_reg, since we return.
     __ mov(name_reg, r0);
-    __ RecordWriteField(
-        scratch, offset, name_reg, receiver_reg, kDontSaveFPRegs);
+    __ RecordWriteField(scratch,
+                        offset,
+                        name_reg,
+                        receiver_reg,
+                        kLRHasNotBeenSaved,
+                        kDontSaveFPRegs);
   }

   // Return the value (register r0).
@@ -1594,6 +1602,7 @@
       __ RecordWrite(elements,
                      end_elements,
                      r4,
+                     kLRHasNotBeenSaved,
                      kDontSaveFPRegs,
                      EMIT_REMEMBERED_SET,
                      OMIT_SMI_CHECK);
@@ -4228,6 +4237,7 @@
   __ RecordWrite(elements_reg,  // Object.
                  scratch,       // Address.
                  receiver_reg,  // Value.
+                 kLRHasNotBeenSaved,
                  kDontSaveFPRegs);

   // value_reg (r0) is preserved.
=======================================
--- /branches/experimental/gc/src/ia32/code-stubs-ia32.cc Mon Jun 6 04:22:38 2011 +++ /branches/experimental/gc/src/ia32/code-stubs-ia32.cc Tue Jun 7 02:28:08 2011
@@ -6318,7 +6318,7 @@
     RecordWriteStub::OnNoNeedToInformIncrementalMarker on_no_need) {
   Label object_is_black, need_incremental;

- // Let's look at the colour of the object: If it is not black we don't have + // Let's look at the color of the object: If it is not black we don't have
   // to inform the incremental marker.
   __ IsBlack(regs_.object(),
              regs_.scratch0(),
=======================================
--- /branches/experimental/gc/src/ia32/code-stubs-ia32.h Mon Jun 6 04:22:38 2011 +++ /branches/experimental/gc/src/ia32/code-stubs-ia32.h Tue Jun 7 02:28:08 2011
@@ -525,6 +525,8 @@
   Register index_;
   LookupMode mode_;
 };
+
+
 class RecordWriteStub: public CodeStub {
  public:
   RecordWriteStub(Register object,
=======================================
--- /branches/experimental/gc/src/ia32/macro-assembler-ia32.cc Mon Jun 6 04:22:38 2011 +++ /branches/experimental/gc/src/ia32/macro-assembler-ia32.cc Tue Jun 7 02:28:08 2011
@@ -2294,38 +2294,38 @@
                              Register scratch1,
                              Label* is_black,
                              Label::Distance is_black_near) {
-  HasColour(object, scratch0, scratch1,
-            is_black, is_black_near,
-            1, 0);  // kBlackBitPattern.
+  HasColor(object, scratch0, scratch1,
+           is_black, is_black_near,
+           1, 0);  // kBlackBitPattern.
   ASSERT(strcmp(Marking::kBlackBitPattern, "10") == 0);
 }


-void MacroAssembler::HasColour(Register object,
-                               Register bitmap_scratch,
-                               Register mask_scratch,
-                               Label* has_colour,
-                               Label::Distance has_colour_distance,
-                               int first_bit,
-                               int second_bit) {
+void MacroAssembler::HasColor(Register object,
+                              Register bitmap_scratch,
+                              Register mask_scratch,
+                              Label* has_color,
+                              Label::Distance has_color_distance,
+                              int first_bit,
+                              int second_bit) {
   ASSERT(!Aliasing(object, bitmap_scratch, mask_scratch, ecx));

-  MarkBits(object, bitmap_scratch, mask_scratch);
-
-  Label other_colour, word_boundary;
+  GetMarkBits(object, bitmap_scratch, mask_scratch);
+
+  Label other_color, word_boundary;
   test(mask_scratch, Operand(bitmap_scratch, MemoryChunk::kHeaderSize));
-  j(first_bit == 1 ? zero : not_zero, &other_colour, Label::kNear);
+  j(first_bit == 1 ? zero : not_zero, &other_color, Label::kNear);
   add(mask_scratch, Operand(mask_scratch));  // Shift left 1 by adding.
   j(zero, &word_boundary, Label::kNear);
   test(mask_scratch, Operand(bitmap_scratch, MemoryChunk::kHeaderSize));
-  j(second_bit == 1 ? not_zero : zero, has_colour, has_colour_distance);
-  jmp(&other_colour, Label::kNear);
+  j(second_bit == 1 ? not_zero : zero, has_color, has_color_distance);
+  jmp(&other_color, Label::kNear);

   bind(&word_boundary);
test_b(Operand(bitmap_scratch, MemoryChunk::kHeaderSize + kPointerSize), 1);

-  j(second_bit == 1 ? not_zero : zero, has_colour, has_colour_distance);
-  bind(&other_colour);
+  j(second_bit == 1 ? not_zero : zero, has_color, has_color_distance);
+  bind(&other_color);
 }


@@ -2349,9 +2349,9 @@
 }


-void MacroAssembler::MarkBits(Register addr_reg,
-                              Register bitmap_reg,
-                              Register mask_reg) {
+void MacroAssembler::GetMarkBits(Register addr_reg,
+                                 Register bitmap_reg,
+                                 Register mask_reg) {
   ASSERT(!Aliasing(addr_reg, bitmap_reg, mask_reg, ecx));
   mov(bitmap_reg, Operand(addr_reg));
   and_(bitmap_reg, ~Page::kPageAlignmentMask);
@@ -2377,7 +2377,7 @@
     Label* value_is_white_and_not_data,
     Label::Distance distance) {
   ASSERT(!Aliasing(value, bitmap_scratch, mask_scratch, ecx));
-  MarkBits(value, bitmap_scratch, mask_scratch);
+  GetMarkBits(value, bitmap_scratch, mask_scratch);

   // If the value is black or grey we don't need to do anything.
   ASSERT(strcmp(Marking::kWhiteBitPattern, "00") == 0);
=======================================
--- /branches/experimental/gc/src/ia32/macro-assembler-ia32.h Mon Jun 6 04:22:38 2011 +++ /branches/experimental/gc/src/ia32/macro-assembler-ia32.h Tue Jun 7 02:28:08 2011
@@ -99,18 +99,18 @@
                   Label* condition_met,
                   Label::Distance condition_met_distance = Label::kFar);

- // Check if an object has a given incremental marking colour. Also uses ecx!
-  // The colour bits are found by splitting the address at the bit offset
+ // Check if an object has a given incremental marking color. Also uses ecx!
+  // The color bits are found by splitting the address at the bit offset
   // indicated by the mask: bits that are zero in the mask are used for the
// address of the bitmap, and bits that are one in the mask are used for the
   // index of the bit.
-  void HasColour(Register object,
-                 Register scratch0,
-                 Register scratch1,
-                 Label* has_colour,
-                 Label::Distance has_colour_distance,
-                 int first_bit,
-                 int second_bit);
+  void HasColor(Register object,
+                Register scratch0,
+                Register scratch1,
+                Label* has_color,
+                Label::Distance has_color_distance,
+                int first_bit,
+                int second_bit);

   void IsBlack(Register object,
                Register scratch0,
@@ -118,7 +118,7 @@
                Label* is_black,
                Label::Distance is_black_distance = Label::kFar);

- // Checks the colour of an object. If the object is already grey or black
+  // Checks the color of an object.  If the object is already grey or black
// then we just fall through, since it is already live. If it is white and // we can determine that it doesn't need to be scanned, then we just mark it
   // black and fall through.  For the rest we jump to the label so the
@@ -788,9 +788,9 @@
   // bitmap register points at the word with the mark bits and the mask
// the position of the first bit. Uses ecx as scratch and leaves addr_reg
   // unchanged.
-  inline void MarkBits(Register addr_reg,
-                       Register bitmap_reg,
-                       Register mask_reg);
+  inline void GetMarkBits(Register addr_reg,
+                          Register bitmap_reg,
+                          Register mask_reg);

   // Compute memory operands for safepoint stack slots.
   Operand SafepointRegisterSlot(Register reg);

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to