| Index: src/arm/code-stubs-arm.cc
|
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
|
| index e61cce5371426049095cca4711bc1ecac20904eb..23da69c30bb3bf3e46ff19cd24f81ec5df7459fe 100644
|
| --- a/src/arm/code-stubs-arm.cc
|
| +++ b/src/arm/code-stubs-arm.cc
|
| @@ -5958,8 +5958,36 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| __ AllocateAsciiConsString(r7, r6, r4, r5, &call_runtime);
|
| __ bind(&allocated);
|
| // Fill the fields of the cons string.
|
| + Label skip_write_barrier, after_writing;
|
| + ExternalReference high_promotion_mode = ExternalReference::
|
| + new_space_high_promotion_mode_active_address(masm->isolate());
|
| + __ mov(r4, Operand(high_promotion_mode));
|
| + __ ldr(r4, MemOperand(r4, 0));
|
| + __ cmp(r4, Operand::Zero());
|
| + __ b(eq, &skip_write_barrier);
|
| +
|
| + __ str(r0, FieldMemOperand(r7, ConsString::kFirstOffset));
|
| + __ RecordWriteField(r7,
|
| + ConsString::kFirstOffset,
|
| + r0,
|
| + r4,
|
| + kLRHasNotBeenSaved,
|
| + kDontSaveFPRegs);
|
| + __ str(r1, FieldMemOperand(r7, ConsString::kSecondOffset));
|
| + __ RecordWriteField(r7,
|
| + ConsString::kSecondOffset,
|
| + r1,
|
| + r4,
|
| + kLRHasNotBeenSaved,
|
| + kDontSaveFPRegs);
|
| + __ jmp(&after_writing);
|
| +
|
| + __ bind(&skip_write_barrier);
|
| __ str(r0, FieldMemOperand(r7, ConsString::kFirstOffset));
|
| __ str(r1, FieldMemOperand(r7, ConsString::kSecondOffset));
|
| +
|
| + __ bind(&after_writing);
|
| +
|
| __ mov(r0, Operand(r7));
|
| __ IncrementCounter(counters->string_add_native(), 1, r2, r3);
|
| __ add(sp, sp, Operand(2 * kPointerSize));
|
| @@ -6805,6 +6833,9 @@ static const AheadOfTimeWriteBarrierStubList kAheadOfTime[] = {
|
| { REG(r5), REG(r0), REG(r6), EMIT_REMEMBERED_SET },
|
| // FastNewClosureStub::Generate
|
| { REG(r2), REG(r4), REG(r1), EMIT_REMEMBERED_SET },
|
| + // StringAddStub::Generate
|
| + { REG(r7), REG(r1), REG(r4), EMIT_REMEMBERED_SET },
|
| + { REG(r7), REG(r0), REG(r4), EMIT_REMEMBERED_SET },
|
| // Null termination.
|
| { REG(no_reg), REG(no_reg), REG(no_reg), EMIT_REMEMBERED_SET}
|
| };
|
|
|