Chromium Code Reviews| Index: src/ia32/code-stubs-ia32.cc |
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
| index 73f452ac5cdde057eb04d9bb3834d3c8ee11043f..066f9afd05651f6eb7dfb2565022527d23d6a849 100644 |
| --- a/src/ia32/code-stubs-ia32.cc |
| +++ b/src/ia32/code-stubs-ia32.cc |
| @@ -5838,8 +5838,33 @@ void StringAddStub::Generate(MacroAssembler* masm) { |
| __ mov(FieldOperand(ecx, ConsString::kLengthOffset), ebx); |
| __ mov(FieldOperand(ecx, ConsString::kHashFieldOffset), |
| Immediate(String::kEmptyHashField)); |
| + |
| + Label skip_write_barrier, after_writing; |
| + ExternalReference high_promotion_mode = ExternalReference:: |
| + new_space_high_promotion_mode_active_address(masm->isolate()); |
| + __ test(Operand::StaticVariable(high_promotion_mode), Immediate(1)); |
| + __ j(zero, &skip_write_barrier); |
| + |
| + __ mov(FieldOperand(ecx, ConsString::kFirstOffset), eax); |
| + __ RecordWriteField(ecx, |
| + ConsString::kFirstOffset, |
| + eax, |
| + ebx, |
| + kDontSaveFPRegs); |
| + __ mov(FieldOperand(ecx, ConsString::kSecondOffset), edx); |
| + __ RecordWriteField(ecx, |
| + ConsString::kSecondOffset, |
| + edx, |
| + ebx, |
| + kDontSaveFPRegs); |
| + __ jmp(&after_writing); |
| + |
| + __ bind(&skip_write_barrier); |
| __ mov(FieldOperand(ecx, ConsString::kFirstOffset), eax); |
| __ mov(FieldOperand(ecx, ConsString::kSecondOffset), edx); |
| + |
| + __ bind(&after_writing); |
| + |
| __ mov(eax, ecx); |
| __ IncrementCounter(counters->string_add_native(), 1); |
| __ ret(2 * kPointerSize); |
| @@ -7373,6 +7398,9 @@ static const AheadOfTimeWriteBarrierStubList kAheadOfTime[] = { |
| { REG(ebx), REG(eax), REG(ecx), EMIT_REMEMBERED_SET}, |
| // FastNewClosureStub |
| { REG(ecx), REG(edx), REG(ebx), EMIT_REMEMBERED_SET}, |
| + // StringAddStub::Generate |
| + { REG(ecx), REG(eax), REG(ebx), EMIT_REMEMBERED_SET}, |
| + { REG(ecx), REG(edx), REG(ebx), EMIT_REMEMBERED_SET}, |
|
Michael Starzinger
2013/05/03 09:58:21
The ecx/edx/ebx stub seems to be duplicated.
Hannes Payer (out of office)
2013/05/03 10:27:32
Done.
|
| // Null termination. |
| { REG(no_reg), REG(no_reg), REG(no_reg), EMIT_REMEMBERED_SET} |
| }; |