Author: [email protected]
Date: Mon Jun 29 01:14:06 2009
New Revision: 2290

Modified:
    branches/bleeding_edge/src/arm/codegen-arm.cc
    branches/bleeding_edge/src/arm/codegen-arm.h
    branches/bleeding_edge/src/codegen.cc
    branches/bleeding_edge/src/date-delay.js
    branches/bleeding_edge/src/ia32/codegen-ia32.cc
    branches/bleeding_edge/src/ia32/codegen-ia32.h
    branches/bleeding_edge/src/messages.js
    branches/bleeding_edge/src/regexp-delay.js
    branches/bleeding_edge/src/string.js
    branches/bleeding_edge/src/v8natives.js
    branches/bleeding_edge/src/x64/codegen-x64.cc
    branches/bleeding_edge/src/x64/codegen-x64.h

Log:
Optimize %IsConstructCall() on IA-32.
Review URL: http://codereview.chromium.org/150018

Modified: branches/bleeding_edge/src/arm/codegen-arm.cc
==============================================================================
--- branches/bleeding_edge/src/arm/codegen-arm.cc       (original)
+++ branches/bleeding_edge/src/arm/codegen-arm.cc       Mon Jun 29 01:14:06 2009
@@ -3290,6 +3290,14 @@
  }


+void CodeGenerator::GenerateIsConstructCall(ZoneList<Expression*>* args) {
+  VirtualFrame::SpilledScope spilled_scope;
+  ASSERT(args->length() == 0);
+  frame_->CallRuntime(Runtime::kIsConstructCall, 0);
+  frame_->EmitPush(r0);
+}
+
+
  void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) {
    VirtualFrame::SpilledScope spilled_scope;
    ASSERT(args->length() == 0);

Modified: branches/bleeding_edge/src/arm/codegen-arm.h
==============================================================================
--- branches/bleeding_edge/src/arm/codegen-arm.h        (original)
+++ branches/bleeding_edge/src/arm/codegen-arm.h        Mon Jun 29 01:14:06 2009
@@ -333,6 +333,9 @@
    void GenerateIsNonNegativeSmi(ZoneList<Expression*>* args);
    void GenerateIsArray(ZoneList<Expression*>* args);

+  // Support for construct call checks.
+  void GenerateIsConstructCall(ZoneList<Expression*>* args);
+
    // Support for arguments.length and arguments[?].
    void GenerateArgumentsLength(ZoneList<Expression*>* args);
    void GenerateArgumentsAccess(ZoneList<Expression*>* args);

Modified: branches/bleeding_edge/src/codegen.cc
==============================================================================
--- branches/bleeding_edge/src/codegen.cc       (original)
+++ branches/bleeding_edge/src/codegen.cc       Mon Jun 29 01:14:06 2009
@@ -416,6 +416,7 @@
    {&CodeGenerator::GenerateIsSmi, "_IsSmi"},
    {&CodeGenerator::GenerateIsNonNegativeSmi, "_IsNonNegativeSmi"},
    {&CodeGenerator::GenerateIsArray, "_IsArray"},
+  {&CodeGenerator::GenerateIsConstructCall, "_IsConstructCall"},
    {&CodeGenerator::GenerateArgumentsLength, "_ArgumentsLength"},
    {&CodeGenerator::GenerateArgumentsAccess, "_Arguments"},
    {&CodeGenerator::GenerateValueOf, "_ValueOf"},

Modified: branches/bleeding_edge/src/date-delay.js
==============================================================================
--- branches/bleeding_edge/src/date-delay.js    (original)
+++ branches/bleeding_edge/src/date-delay.js    Mon Jun 29 01:14:06 2009
@@ -424,7 +424,7 @@


  %SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) {
-  if (%IsConstructCall()) {
+  if (%_IsConstructCall()) {
      // ECMA 262 - 15.9.3
      var argc = %_ArgumentsLength();
      if (argc == 0) {

Modified: branches/bleeding_edge/src/ia32/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/ia32/codegen-ia32.cc     (original)
+++ branches/bleeding_edge/src/ia32/codegen-ia32.cc     Mon Jun 29 01:14:06 2009
@@ -4987,6 +4987,29 @@
  }


+void CodeGenerator::GenerateIsConstructCall(ZoneList<Expression*>* args) {
+  ASSERT(args->length() == 0);
+
+  // Get the frame pointer for the calling frame.
+  Result fp = allocator()->Allocate();
+  __ mov(fp.reg(), Operand(ebp, StandardFrameConstants::kCallerFPOffset));
+
+  // Skip the arguments adaptor frame if it exists.
+  Label check_frame_marker;
+  __ cmp(Operand(fp.reg(), StandardFrameConstants::kContextOffset),
+         Immediate(ArgumentsAdaptorFrame::SENTINEL));
+  __ j(not_equal, &check_frame_marker);
+  __ mov(fp.reg(), Operand(fp.reg(),  
StandardFrameConstants::kCallerFPOffset));
+
+  // Check the marker in the calling frame.
+  __ bind(&check_frame_marker);
+  __ cmp(Operand(fp.reg(), StandardFrameConstants::kMarkerOffset),
+         Immediate(Smi::FromInt(StackFrame::CONSTRUCT)));
+  fp.Unuse();
+  destination()->Split(equal);
+}
+
+
  void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) {
    ASSERT(args->length() == 0);
    // ArgumentsAccessStub takes the parameter count as an input argument

Modified: branches/bleeding_edge/src/ia32/codegen-ia32.h
==============================================================================
--- branches/bleeding_edge/src/ia32/codegen-ia32.h      (original)
+++ branches/bleeding_edge/src/ia32/codegen-ia32.h      Mon Jun 29 01:14:06 2009
@@ -522,6 +522,9 @@
    void GenerateIsNonNegativeSmi(ZoneList<Expression*>* args);
    void GenerateIsArray(ZoneList<Expression*>* args);

+  // Support for construct call checks.
+  void GenerateIsConstructCall(ZoneList<Expression*>* args);
+
    // Support for arguments.length and arguments[?].
    void GenerateArgumentsLength(ZoneList<Expression*>* args);
    void GenerateArgumentsAccess(ZoneList<Expression*>* args);

Modified: branches/bleeding_edge/src/messages.js
==============================================================================
--- branches/bleeding_edge/src/messages.js      (original)
+++ branches/bleeding_edge/src/messages.js      Mon Jun 29 01:14:06 2009
@@ -659,7 +659,7 @@
    %SetProperty(f.prototype, 'constructor', f, DONT_ENUM);
    f.prototype.name = name;
    %SetCode(f, function(m) {
-    if (%IsConstructCall()) {
+    if (%_IsConstructCall()) {
        if (m === kAddMessageAccessorsMarker) {
          DefineOneShotAccessor(this, 'message', function (obj) {
            return FormatMessage({type: obj.type, args: obj.arguments});

Modified: branches/bleeding_edge/src/regexp-delay.js
==============================================================================
--- branches/bleeding_edge/src/regexp-delay.js  (original)
+++ branches/bleeding_edge/src/regexp-delay.js  Mon Jun 29 01:14:06 2009
@@ -103,7 +103,7 @@


  function RegExpConstructor(pattern, flags) {
-  if (%IsConstructCall()) {
+  if (%_IsConstructCall()) {
      DoConstructRegExp(this, pattern, flags, true);
    } else {
      // RegExp : Called as function; see ECMA-262, section 15.10.3.1.

Modified: branches/bleeding_edge/src/string.js
==============================================================================
--- branches/bleeding_edge/src/string.js        (original)
+++ branches/bleeding_edge/src/string.js        Mon Jun 29 01:14:06 2009
@@ -35,7 +35,7 @@
  // Set the String function and constructor.
  %SetCode($String, function(x) {
    var value = %_ArgumentsLength() == 0 ? '' : ToString(x);
-  if (%IsConstructCall()) {
+  if (%_IsConstructCall()) {
      %_SetValueOf(this, value);
    } else {
      return value;

Modified: branches/bleeding_edge/src/v8natives.js
==============================================================================
--- branches/bleeding_edge/src/v8natives.js     (original)
+++ branches/bleeding_edge/src/v8natives.js     Mon Jun 29 01:14:06 2009
@@ -154,7 +154,7 @@

    // ECMA-262 - 15.1.1.3.
    %SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE);
-
+
    // Setup non-enumerable function on the global object.
    InstallFunctions(global, DONT_ENUM, $Array(
      "isNaN", GlobalIsNaN,
@@ -174,7 +174,7 @@


  %SetCode($Boolean, function(x) {
-  if (%IsConstructCall()) {
+  if (%_IsConstructCall()) {
      %_SetValueOf(this, ToBoolean(x));
    } else {
      return ToBoolean(x);
@@ -273,7 +273,7 @@


  %SetCode($Object, function(x) {
-  if (%IsConstructCall()) {
+  if (%_IsConstructCall()) {
      if (x == null) return this;
      return ToObject(x);
    } else {
@@ -350,7 +350,7 @@
  // Set the Number function and constructor.
  %SetCode($Number, function(x) {
    var value = %_ArgumentsLength() == 0 ? 0 : ToNumber(x);
-  if (%IsConstructCall()) {
+  if (%_IsConstructCall()) {
      %_SetValueOf(this, value);
    } else {
      return value;
@@ -570,4 +570,3 @@
  }

  SetupFunction();
-

Modified: branches/bleeding_edge/src/x64/codegen-x64.cc
==============================================================================
--- branches/bleeding_edge/src/x64/codegen-x64.cc       (original)
+++ branches/bleeding_edge/src/x64/codegen-x64.cc       Mon Jun 29 01:14:06 2009
@@ -3330,6 +3330,14 @@
  }


+void CodeGenerator::GenerateIsConstructCall(ZoneList<Expression*>* args) {
+  // TODO(X64): Optimize this like it's done on IA-32.
+  ASSERT(args->length() == 0);
+  Result answer = frame_->CallRuntime(Runtime::kIsConstructCall, 0);
+  frame_->Push(&answer);
+}
+
+
  void CodeGenerator::GenerateArgumentsLength(ZoneList<Expression*>* args) {
    ASSERT(args->length() == 0);
    // ArgumentsAccessStub takes the parameter count as an input argument

Modified: branches/bleeding_edge/src/x64/codegen-x64.h
==============================================================================
--- branches/bleeding_edge/src/x64/codegen-x64.h        (original)
+++ branches/bleeding_edge/src/x64/codegen-x64.h        Mon Jun 29 01:14:06 2009
@@ -522,6 +522,9 @@
    void GenerateIsNonNegativeSmi(ZoneList<Expression*>* args);
    void GenerateIsArray(ZoneList<Expression*>* args);

+  // Support for construct call checks.
+  void GenerateIsConstructCall(ZoneList<Expression*>* args);
+
    // Support for arguments.length and arguments[?].
    void GenerateArgumentsLength(ZoneList<Expression*>* args);
    void GenerateArgumentsAccess(ZoneList<Expression*>* args);

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

Reply via email to