Reviewers: Jakob,

Description:
Fix code gen bug on arm and mips; SeqStringSetChar overwrites a register; Add
better default PrintDataTo for HInstruction
BUG=

Please review this at https://codereview.chromium.org/14895019/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/arm/lithium-arm.cc
  M src/hydrogen-instructions.h
  M src/hydrogen-instructions.cc
  M src/hydrogen.cc
  M src/ia32/lithium-ia32.cc
  M src/mips/lithium-mips.cc
  A + test/mjsunit/regress/regress-seqstrsetchar-ex1.js
  A + test/mjsunit/regress/regress-seqstrsetchar-ex2.js


Index: src/arm/lithium-arm.cc
diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc
index edc1120c5bb5665444b2117848ed632704de4186..ce8f7e09b5e8d03ec16c04fcaba49d3d3a0848d0 100644
--- a/src/arm/lithium-arm.cc
+++ b/src/arm/lithium-arm.cc
@@ -1822,7 +1822,7 @@ LInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
 LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
   LOperand* string = UseRegister(instr->string());
   LOperand* index = UseRegister(instr->index());
-  LOperand* value = UseRegister(instr->value());
+  LOperand* value = UseTempRegister(instr->value());
   LSeqStringSetChar* result =
new(zone()) LSeqStringSetChar(instr->encoding(), string, index, value);
   return DefineAsRegister(result);
Index: src/hydrogen-instructions.cc
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
index 0d116ac0e77f57f01d6175181167036268de4b91..b443cf977bbe94076c950eb2eb39acb789d746b5 100644
--- a/src/hydrogen-instructions.cc
+++ b/src/hydrogen-instructions.cc
@@ -806,6 +806,15 @@ void HInstruction::PrintTo(StringStream* stream) {
 }


+void HInstruction::PrintDataTo(StringStream *stream) {
+  for (int i = 0; i < OperandCount(); ++i) {
+    if (i > 0) stream->Add(" ");
+    HValue *value = OperandAt(i);
+    value->PrintNameTo(stream);
+  }
+}
+
+
 void HInstruction::PrintMnemonicTo(StringStream* stream) {
   stream->Add("%s ", Mnemonic());
 }
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index 138587c43f72b45b9be5193682174eb37b6896be..e2112dd71b4174857b060742a064826eedc840d9 100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -1250,7 +1250,7 @@ class HInstruction: public HValue {
   HInstruction* previous() const { return previous_; }

   virtual void PrintTo(StringStream* stream);
-  virtual void PrintDataTo(StringStream* stream) { }
+  virtual void PrintDataTo(StringStream* stream);

   bool IsLinked() const { return block() != NULL; }
   void Unlink();
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index de3254a2721cfc12c599f6a83639fed48928d2bf..2a5433f627c360a4ac1d6dd14493bad3acf6ed76 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -5448,6 +5448,7 @@ void HGraph::MarkLive(HValue *ref, HValue* instr,
     if (FLAG_trace_dead_code_elimination) {
       HeapStringAllocator allocator;
       StringStream stream(&allocator);
+      ALLOW_HANDLE_DEREF(isolate(), "debug mode printing");
       if (ref != NULL) {
         ref->PrintTo(&stream);
       } else {
Index: src/ia32/lithium-ia32.cc
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc
index f10ab25bc79d7013fc430df6206126cd470deca1..2a4b3f80ba27076554a0944480a027d13192e3c9 100644
--- a/src/ia32/lithium-ia32.cc
+++ b/src/ia32/lithium-ia32.cc
@@ -1840,6 +1840,7 @@ LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
   LOperand* string = UseRegister(instr->string());
   LOperand* index = UseRegister(instr->index());
   ASSERT(ecx.is_byte_register());
+ // TODO(titzer): the machine code for this instruction overwrites ecx! fix!
   LOperand* value = UseFixed(instr->value(), ecx);
   LSeqStringSetChar* result =
new(zone()) LSeqStringSetChar(instr->encoding(), string, index, value);
Index: src/mips/lithium-mips.cc
diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc
index 719acb3b39e3f93ebe3139efc841cf5317d6cdaf..77bb72e671983d08af35bdcf7b34eec94e07a5fc 100644
--- a/src/mips/lithium-mips.cc
+++ b/src/mips/lithium-mips.cc
@@ -1695,7 +1695,7 @@ LInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
 LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
   LOperand* string = UseRegister(instr->string());
   LOperand* index = UseRegister(instr->index());
-  LOperand* value = UseRegister(instr->value());
+  LOperand* value = UseTempRegister(instr->value());
   LSeqStringSetChar* result =
new(zone()) LSeqStringSetChar(instr->encoding(), string, index, value);
   return DefineAsRegister(result);
Index: test/mjsunit/regress/regress-seqstrsetchar-ex1.js
diff --git a/test/mjsunit/regress/regress-grow-store-smi-check.js b/test/mjsunit/regress/regress-seqstrsetchar-ex1.js
similarity index 66%
copy from test/mjsunit/regress/regress-grow-store-smi-check.js
copy to test/mjsunit/regress/regress-seqstrsetchar-ex1.js
index 381141d52317c22cf19547a3626280fa2cb1ba9b..5799a3b8b1704ea947eb8359010130ea0c713fac 100644
--- a/test/mjsunit/regress/regress-grow-store-smi-check.js
+++ b/test/mjsunit/regress/regress-seqstrsetchar-ex1.js
@@ -27,27 +27,33 @@

 // Flags: --allow-natives-syntax

-// The below test function was generated from part of a WebKit layout
-// test library setup routine: fast/canvas/webgl/resources/pnglib.js
+// stubbed version of ToNumber
+function ToNumber(x) {
+    return 311;
+}

-function test(crc32) {
-  for (var i = 0; i < 256; i++) {
-    var c = i;
-    for (var j = 0; j < 8; j++) {
-      if (c & 1) {
-        c = -306674912 ^ ((c >> 1) & 0x7fffffff);
-      } else {
-        c = (c >> 1) & 0x7fffffff;
-      }
-    }
-    crc32[i] = c;
+// Reduced version of String.fromCharCode;
+// does not actually do the same calculation but exhibits untagging bug
+function StringFromCharCode(code) {
+  var n = %_ArgumentsLength();
+  var one_byte = %NewString(n, true);
+  var i;
+  for (i = 0; i < n; i++) {
+    var code = %_Arguments(i);
+    if (!%_IsSmi(code)) code = ToNumber(code) & 0xffff;
+    if (code > 0xff) break;
   }
-}

-var a = [0.5];
-for (var i = 0; i < 256; ++i) a[i] = i;
+  var two_byte = %NewString(n - i, false);
+  for (var j = 0; i < n; i++, j++) {
+    var code = %_Arguments(i);
+    %_TwoByteSeqStringSetChar(two_byte, j, code);
+  }
+  return one_byte + two_byte;
+}

-test([0.5]);
-test(a);
-%OptimizeFunctionOnNextCall(test);
-test(a);
+StringFromCharCode(0xFFF, 0xFFF);
+StringFromCharCode(0x7C, 0x7C);
+%OptimizeFunctionOnNextCall(StringFromCharCode)
+StringFromCharCode(0x7C, 0x7C);
+StringFromCharCode(0xFFF, 0xFFF);
Index: test/mjsunit/regress/regress-seqstrsetchar-ex2.js
diff --git a/test/mjsunit/regress/regress-2565.js b/test/mjsunit/regress/regress-seqstrsetchar-ex2.js
similarity index 89%
copy from test/mjsunit/regress/regress-2565.js
copy to test/mjsunit/regress/regress-seqstrsetchar-ex2.js
index a77806a62e2209d355fce393b98797f1d20f40f8..454fdbc424f014e67ef3995a37cc5fb81f10adc2 100644
--- a/test/mjsunit/regress/regress-2565.js
+++ b/test/mjsunit/regress/regress-seqstrsetchar-ex2.js
@@ -25,8 +25,8 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-Object.freeze(Object.prototype);
-var p = {};
-var o = Object.create(p);
-assertSame(p, o.__proto__);
-assertSame(p, Object.getPrototypeOf(o));
+String.fromCharCode(0xFFF, 0xFFF);
+String.fromCharCode(0x7C, 0x7C);
+%OptimizeFunctionOnNextCall(String.fromCharCode)
+String.fromCharCode(0x7C, 0x7C);
+String.fromCharCode(0xFFF, 0xFFF);


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to