Revision: 2799
Author: [email protected]
Date: Tue Sep  1 08:23:35 2009
Log: Reverting 2797.
Review URL: http://codereview.chromium.org/176060
http://code.google.com/p/v8/source/detail?r=2799

Modified:
  /branches/bleeding_edge/src/arm/builtins-arm.cc
  /branches/bleeding_edge/src/arm/codegen-arm.cc
  /branches/bleeding_edge/src/arm/macro-assembler-arm.cc
  /branches/bleeding_edge/src/arm/macro-assembler-arm.h
  /branches/bleeding_edge/src/objects.h

=======================================
--- /branches/bleeding_edge/src/arm/builtins-arm.cc     Tue Sep  1 07:18:27 2009
+++ /branches/bleeding_edge/src/arm/builtins-arm.cc     Tue Sep  1 08:23:35 2009
@@ -88,144 +88,23 @@
    // Enter a construct frame.
    __ EnterConstructFrame();

-  // Preserve the two incoming parameters on the stack.
+  // Preserve the two incoming parameters
    __ mov(r0, Operand(r0, LSL, kSmiTagSize));
-  __ push(r0);  // Smi-tagged arguments count.
-  __ push(r1);  // Constructor function.
-
-  // Use r7 for holding undefined which is used in several places below.
-  __ LoadRoot(r7, Heap::kUndefinedValueRootIndex);
-
-  // Try to allocate the object without transitioning into C code. If any  
of the
-  // preconditions is not met, the code bails out to the runtime call.
-  Label rt_call, allocated;
-  if (FLAG_inline_new) {
-    Label undo_allocation;
-#ifdef ENABLE_DEBUGGER_SUPPORT
-    ExternalReference debug_step_in_fp =
-        ExternalReference::debug_step_in_fp_address();
-    __ mov(r2, Operand(debug_step_in_fp));
-    __ ldr(r2, MemOperand(r2));
-    __ tst(r2, r2);
-    __ b(nz, &rt_call);
-#endif
-
-    // Load the initial map and verify that it is in fact a map.
-    // r1: constructor function
-    // r7: undefined
-    __ ldr(r2, FieldMemOperand(r1,  
JSFunction::kPrototypeOrInitialMapOffset));
-    __ tst(r2, Operand(kSmiTagMask));
-    __ b(eq, &rt_call);
-    __ CompareObjectType(r2, r3, r4, MAP_TYPE);
-    __ b(ne, &rt_call);
-
-    // Check that the constructor is not constructing a JSFunction (see  
comments
-    // in Runtime_NewObject in runtime.cc). In which case the initial map's
-    // instance type would be JS_FUNCTION_TYPE.
-    // r1: constructor function
-    // r2: initial map
-    // r7: undefined
-    __ CompareInstanceType(r2, r3, JS_FUNCTION_TYPE);
-    __ b(eq, &rt_call);
-
-    // Now allocate the JSObject on the heap.
-    // r1: constructor function
-    // r2: initial map
-    // r7: undefined
-    __ ldrb(r3, FieldMemOperand(r2, Map::kInstanceSizeOffset));
-    // Make sure that the maximum heap object size will never cause us
-    // problem here, because it is always greater than the maximum
-    // instance size that can be represented in a byte.
-    ASSERT(Heap::MaxObjectSizeInPagedSpace() >=  
JSObject::kMaxInstanceSize);
-    __ AllocateObjectInNewSpace(r3, r4, r5, r6, &rt_call, false);
-    // Allocated the JSObject, now initialize the fields. Map is set to  
initial
-    // map and properties and elements are set to empty fixed array.
-    // r1: constructor function
-    // r2: initial map
-    // r3: object size
-    // r4: JSObject (not tagged)
-    // r7: undefined
-    __ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex);
-    __ mov(r5, r4);
-    ASSERT_EQ(0 * kPointerSize, JSObject::kMapOffset);
-    __ str(r2, MemOperand(r5, kPointerSize, PostIndex));
-    ASSERT_EQ(1 * kPointerSize, JSObject::kPropertiesOffset);
-    __ str(r6, MemOperand(r5, kPointerSize, PostIndex));
-    ASSERT_EQ(2 * kPointerSize, JSObject::kElementsOffset);
-    __ str(r6, MemOperand(r5, kPointerSize, PostIndex));
-
-    // Fill all the in-object properties with undefined.
-    // r1: constructor function
-    // r2: initial map
-    // r3: object size (in words)
-    // r4: JSObject (not tagged)
-    // r5: First in-object property of JSObject (not tagged)
-    // r7: undefined
-    __ add(r6, r4, Operand(r3, LSL, kPointerSizeLog2));  // End of object.
-    ASSERT_EQ(12, JSObject::kHeaderSize);
-    { Label loop, entry;
-      __ b(&entry);
-      __ bind(&loop);
-      __ str(r7, MemOperand(r5, kPointerSize, PostIndex));
-      __ bind(&entry);
-      __ cmp(r5, Operand(r6));
-      __ b(lt, &loop);
-    }
-
-    // Add the object tag to make the JSObject real, so that we can  
continue and
-    // jump into the continuation code at any time from now on. Any  
failures
-    // need to undo the allocation, so that the heap is in a consistent  
state
-    // and verifiable.
-    __ add(r4, r4, Operand(kHeapObjectTag));
-
-    // Check if a non-empty properties array is needed. Continue with  
allocated
-    // object if not fall through to runtime call if it is.
-    // r1: constructor function
-    // r2: initial map
-    // r4: JSObject
-    // r5: start of next object (not tagged)
-    // r7: undefined
-    __ ldrb(r3, FieldMemOperand(r2, Map::kUnusedPropertyFieldsOffset));
-    // The field instance sizes contains both pre-allocated property  
fields and
-    // in-object properties.
-    __ ldr(r0, FieldMemOperand(r2, Map::kInstanceSizesOffset));
-    __ and_(r6,
-            r0,
-            Operand(0x000000FF << Map::kPreAllocatedPropertyFieldsByte *  
8));
-    __ add(r3, r3, Operand(r6, LSR, Map::kPreAllocatedPropertyFieldsByte *  
8));
-    __ and_(r6, r0, Operand(0x000000FF << Map::kInObjectPropertiesByte *  
8));
-    __ sub(r3, r3, Operand(r6, LSR, Map::kInObjectPropertiesByte * 8),  
SetCC);
-
-    // Done if no extra properties are to be allocated.
-    __ b(eq, &allocated);
-    __ Assert(pl, "Property allocation count failed.");
-
-    // Undo the setting of the new top so that the heap is verifiable. For
-    // example, the map's unused properties potentially do not match the
-    // allocated objects unused properties.
-    // r4: JSObject (previous new top)
-    __ bind(&undo_allocation);
-    __ UndoAllocationInNewSpace(r4, r5);
-  }
-
-  // Allocate the new receiver object using the runtime call.
-  __ bind(&rt_call);
+  __ push(r0);  // smi-tagged arguments count
+  __ push(r1);  // constructor function
+
+  // Allocate the new receiver object.
    __ push(r1);  // argument for Runtime_NewObject
    __ CallRuntime(Runtime::kNewObject, 1);
-  __ mov(r4, r0);
-
-  // Receiver for constructor call allocated.
-  // r4: JSObject
-  __ bind(&allocated);
-  __ push(r4);
+  __ push(r0);  // save the receiver

    // Push the function and the allocated receiver from the stack.
    // sp[0]: receiver (newly allocated object)
    // sp[1]: constructor function
    // sp[2]: number of arguments (smi-tagged)
    __ ldr(r1, MemOperand(sp, kPointerSize));
-  __ push(r1);  // Constructor function.
-  __ push(r4);  // Receiver.
+  __ push(r1);  // function
+  __ push(r0);  // receiver

    // Reload the number of arguments from the stack.
    // r1: constructor function
@@ -315,7 +194,6 @@
    __ LeaveConstructFrame();
    __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2 - 1));
    __ add(sp, sp, Operand(kPointerSize));
-  __ IncrementCounter(&Counters::constructed_objects, 1, r1, r2);
    __ Jump(lr);
  }

=======================================
--- /branches/bleeding_edge/src/arm/codegen-arm.cc      Tue Sep  1 07:18:27 2009
+++ /branches/bleeding_edge/src/arm/codegen-arm.cc      Tue Sep  1 08:23:35 2009
@@ -4950,7 +4950,7 @@
      Register scratch2) {  // Another scratch register.
    // Allocate an object in the heap for the heap number and tag it as a  
heap
    // object.
-  __ AllocateObjectInNewSpace(HeapNumber::kSize / kPointerSize,
+  __ AllocateObjectInNewSpace(HeapNumber::kSize,
                                result,
                                scratch1,
                                scratch2,
=======================================
--- /branches/bleeding_edge/src/arm/macro-assembler-arm.cc      Tue Sep  1  
07:18:27 2009
+++ /branches/bleeding_edge/src/arm/macro-assembler-arm.cc      Tue Sep  1  
08:23:35 2009
@@ -790,7 +790,7 @@
        ExternalReference::new_space_allocation_limit_address();
    mov(scratch2, Operand(new_space_allocation_limit));
    ldr(scratch2, MemOperand(scratch2));
-  add(result, result, Operand(object_size * kPointerSize));
+  add(result, result, Operand(object_size));
    cmp(result, Operand(scratch2));
    b(hi, gc_required);

@@ -799,70 +799,11 @@

    // Tag and adjust back to start of new object.
    if (tag_allocated_object) {
-    sub(result, result, Operand((object_size * kPointerSize) -
-                                kHeapObjectTag));
+    sub(result, result, Operand(object_size - kHeapObjectTag));
    } else {
-    sub(result, result, Operand(object_size * kPointerSize));
+    sub(result, result, Operand(object_size));
    }
  }
-
-
-void MacroAssembler::AllocateObjectInNewSpace(Register object_size,
-                                              Register result,
-                                              Register scratch1,
-                                              Register scratch2,
-                                              Label* gc_required,
-                                              bool tag_allocated_object) {
-  ASSERT(!result.is(scratch1));
-  ASSERT(!scratch1.is(scratch2));
-
-  // Load address of new object into result and allocation top address into
-  // scratch1.
-  ExternalReference new_space_allocation_top =
-      ExternalReference::new_space_allocation_top_address();
-  mov(scratch1, Operand(new_space_allocation_top));
-  ldr(result, MemOperand(scratch1));
-
-  // Calculate new top and bail out if new space is exhausted. Use result
-  // to calculate the new top. Object size is in words so a shift is  
required to
-  // get the number of bytes
-  ExternalReference new_space_allocation_limit =
-      ExternalReference::new_space_allocation_limit_address();
-  mov(scratch2, Operand(new_space_allocation_limit));
-  ldr(scratch2, MemOperand(scratch2));
-  add(result, result, Operand(object_size, LSL, kPointerSizeLog2));
-
-  cmp(result, Operand(scratch2));
-  b(hi, gc_required);
-
-  // Update allocation top. result temporarily holds the new top,
-  str(result, MemOperand(scratch1));
-
-  // Tag and adjust back to start of new object.
-  if (tag_allocated_object) {
-    sub(result, result, Operand(object_size, LSL, kPointerSizeLog2));
-    add(result, result, Operand(kHeapObjectTag));
-  } else {
-    sub(result, result, Operand(object_size, LSL, kPointerSizeLog2));
-  }
-}
-
-
-void MacroAssembler::UndoAllocationInNewSpace(Register object,
-                                              Register scratch) {
-  ExternalReference new_space_allocation_top =
-      ExternalReference::new_space_allocation_top_address();
-
-  // Make sure the object has no tag before resetting top.
-  and_(object, object, Operand(~kHeapObjectTagMask));
-#ifdef DEBUG
-  mov(scratch, Operand(new_space_allocation_top));
-  ldr(scratch, MemOperand(scratch));
-  cmp(object, scratch);
-  Check(lt, "Undo allocation of non allocated memory");
-#endif
-  str(object, MemOperand(scratch));
-}


  void MacroAssembler::CompareObjectType(Register function,
@@ -870,13 +811,6 @@
                                         Register type_reg,
                                         InstanceType type) {
    ldr(map, FieldMemOperand(function, HeapObject::kMapOffset));
-  CompareInstanceType(map, type_reg, type);
-}
-
-
-void MacroAssembler::CompareInstanceType(Register map,
-                                         Register type_reg,
-                                         InstanceType type) {
    ldrb(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
    cmp(type_reg, Operand(type));
  }
=======================================
--- /branches/bleeding_edge/src/arm/macro-assembler-arm.h       Tue Sep  1  
07:18:27 2009
+++ /branches/bleeding_edge/src/arm/macro-assembler-arm.h       Tue Sep  1  
08:23:35 2009
@@ -190,28 +190,16 @@
    //  
---------------------------------------------------------------------------
    // Allocation support

-  // Allocate an object in new space. The object_size is specified in  
words (not
-  // bytes). If the new space is exhausted control continues at the  
gc_required
-  // label. The allocated object is returned in result. If the flag
-  // tag_allocated_object is true the result is tagged as as a heap object.
+  // Allocate an object in new space. If the new space is exhausted control
+  // continues at the gc_required label. The allocated object is returned  
in
+  // result. If the flag tag_allocated_object is true the result is tagged  
as
+  // as a heap object.
    void AllocateObjectInNewSpace(int object_size,
                                  Register result,
                                  Register scratch1,
                                  Register scratch2,
                                  Label* gc_required,
                                  bool tag_allocated_object);
-  void AllocateObjectInNewSpace(Register object_size,
-                                Register result,
-                                Register scratch1,
-                                Register scratch2,
-                                Label* gc_required,
-                                bool tag_allocated_object);
-
-  // Undo allocation in new space. The object passed and objects allocated  
after
-  // it will no longer be allocated. The caller must make sure that no  
pointers
-  // are left to the object(s) no longer allocated as they would be  
invalid when
-  // allocation is undone.
-  void UndoAllocationInNewSpace(Register object, Register scratch);

    //  
---------------------------------------------------------------------------
    // Support functions.
@@ -232,21 +220,12 @@
    // It leaves the map in the map register (unless the type_reg and map  
register
    // are the same register).  It leaves the heap object in the heap_object
    // register unless the heap_object register is the same register as one  
of the
-  // other registers.
+  // other // registers.
    void CompareObjectType(Register heap_object,
                           Register map,
                           Register type_reg,
                           InstanceType type);

-  // Compare instance type in a map.  map contains a valid map object whose
-  // object type should be compared with the given type.  This both
-  // sets the flags and leaves the object type in the type_reg register.   
It
-  // leaves the heap object in the heap_object register unless the  
heap_object
-  // register is the same register as type_reg.
-  void CompareInstanceType(Register map,
-                           Register type_reg,
-                           InstanceType type);
-
    inline void BranchOnSmi(Register value, Label* smi_label) {
      tst(value, Operand(kSmiTagMask));
      b(eq, smi_label);
=======================================
--- /branches/bleeding_edge/src/objects.h       Tue Sep  1 07:18:27 2009
+++ /branches/bleeding_edge/src/objects.h       Tue Sep  1 08:23:35 2009
@@ -2891,12 +2891,8 @@

    // Byte offsets within kInstanceSizesOffset.
    static const int kInstanceSizeOffset = kInstanceSizesOffset + 0;
-  static const int kInObjectPropertiesByte = 1;
-  static const int kInObjectPropertiesOffset =
-      kInstanceSizesOffset + kInObjectPropertiesByte;
-  static const int kPreAllocatedPropertyFieldsByte = 2;
-  static const int kPreAllocatedPropertyFieldsOffset =
-      kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte;
+  static const int kInObjectPropertiesOffset = kInstanceSizesOffset + 1;
+  static const int kPreAllocatedPropertyFieldsOffset =  
kInstanceSizesOffset + 2;
    // The byte at position 3 is not in use at the moment.

    // Byte offsets within kInstanceAttributesOffset attributes.

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

Reply via email to