| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index ba29ed969df4e811c9f409ab955b499f8a9ce970..824e3b1a526413c0524c4bfa45519b4835e32ada 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.cc
|
| @@ -2133,7 +2133,7 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
|
| ASSERT(instr->value()->representation().IsTagged());
|
| object = UseTempRegister(instr->elements());
|
| val = needs_write_barrier ? UseTempRegister(instr->value())
|
| - : UseRegisterAtStart(instr->value());
|
| + : UseRegisterOrConstantAtStart(instr->value());
|
| key = (clobbers_key || needs_write_barrier)
|
| ? UseTempRegister(instr->key())
|
| : UseRegisterOrConstantAtStart(instr->key());
|
| @@ -2230,9 +2230,22 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
|
| : UseRegisterAtStart(instr->object());
|
| }
|
|
|
| - LOperand* val = needs_write_barrier
|
| - ? UseTempRegister(instr->value())
|
| - : UseRegister(instr->value());
|
| + LOperand* val = NULL;
|
| + if (needs_write_barrier) {
|
| + val = UseTempRegister(instr->value());
|
| + } else if (instr->value()->IsConstant()) {
|
| + // If it's tagged, it might still be in new space
|
| + HConstant* constant_value = HConstant::cast(instr->value());
|
| + if (constant_value->HasInteger32Value() ||
|
| + constant_value->HasDoubleValue() ||
|
| + constant_value->ImmortalImmovable()) {
|
| + val = UseRegisterOrConstant(instr->value());
|
| + }
|
| + }
|
| +
|
| + if (val == NULL) {
|
| + val = UseRegister(instr->value());
|
| + }
|
|
|
| // We only need a scratch register if we have a write barrier or we
|
| // have a store into the properties array (not in-object-property).
|
| @@ -2375,8 +2388,15 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
|
|
|
| LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
|
| LOperand* args = UseRegister(instr->arguments());
|
| - LOperand* length = UseTempRegister(instr->length());
|
| - LOperand* index = Use(instr->index());
|
| + LOperand* length;
|
| + LOperand* index;
|
| + if (instr->length()->IsConstant() && instr->index()->IsConstant()) {
|
| + length = UseRegisterOrConstant(instr->length());
|
| + index = UseOrConstant(instr->index());
|
| + } else {
|
| + length = UseTempRegister(instr->length());
|
| + index = Use(instr->index());
|
| + }
|
| return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
|
| }
|
|
|
|
|