Fix bug in register requirements for function.apply.

Whenever we use a fixed temp at a call that can eagerly deopt we
now allow fixed register exclusively to avoid any overlap.

Review URL: http://codereview.chromium.org/6479014

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6714 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent ebebcae4
...@@ -70,7 +70,6 @@ void LInstruction::VerifyCall() { ...@@ -70,7 +70,6 @@ void LInstruction::VerifyCall() {
for (UseIterator it(this); it.HasNext(); it.Advance()) { for (UseIterator it(this); it.HasNext(); it.Advance()) {
LOperand* operand = it.Next(); LOperand* operand = it.Next();
ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() || ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() ||
LUnallocated::cast(operand)->IsUsedAtStart() ||
!LUnallocated::cast(operand)->HasRegisterPolicy()); !LUnallocated::cast(operand)->HasRegisterPolicy());
} }
for (TempIterator it(this); it.HasNext(); it.Advance()) { for (TempIterator it(this); it.HasNext(); it.Advance()) {
...@@ -1133,8 +1132,8 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( ...@@ -1133,8 +1132,8 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
LOperand* function = UseFixed(instr->function(), r1); LOperand* function = UseFixed(instr->function(), r1);
LOperand* receiver = UseFixed(instr->receiver(), r0); LOperand* receiver = UseFixed(instr->receiver(), r0);
LOperand* length = UseRegisterAtStart(instr->length()); LOperand* length = UseFixed(instr->length(), r2);
LOperand* elements = UseRegisterAtStart(instr->elements()); LOperand* elements = UseFixed(instr->elements(), r3);
LApplyArguments* result = new LApplyArguments(function, LApplyArguments* result = new LApplyArguments(function,
receiver, receiver,
length, length,
......
...@@ -82,7 +82,6 @@ void LInstruction::VerifyCall() { ...@@ -82,7 +82,6 @@ void LInstruction::VerifyCall() {
for (UseIterator it(this); it.HasNext(); it.Advance()) { for (UseIterator it(this); it.HasNext(); it.Advance()) {
LOperand* operand = it.Next(); LOperand* operand = it.Next();
ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() || ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() ||
LUnallocated::cast(operand)->IsUsedAtStart() ||
!LUnallocated::cast(operand)->HasRegisterPolicy()); !LUnallocated::cast(operand)->HasRegisterPolicy());
} }
for (TempIterator it(this); it.HasNext(); it.Advance()) { for (TempIterator it(this); it.HasNext(); it.Advance()) {
...@@ -1157,9 +1156,9 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( ...@@ -1157,9 +1156,9 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
LOperand* function = UseFixed(instr->function(), edi); LOperand* function = UseFixed(instr->function(), edi);
LOperand* receiver = UseFixed(instr->receiver(), eax); LOperand* receiver = UseFixed(instr->receiver(), eax);
LOperand* length = UseRegisterAtStart(instr->length()); LOperand* length = UseFixed(instr->length(), ebx);
LOperand* elements = UseRegisterAtStart(instr->elements()); LOperand* elements = UseFixed(instr->elements(), ecx);
LOperand* temp = FixedTemp(ebx); LOperand* temp = FixedTemp(edx);
LApplyArguments* result = new LApplyArguments(function, LApplyArguments* result = new LApplyArguments(function,
receiver, receiver,
length, length,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment