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.