Chromium Code Reviews| Index: src/arm/ic-arm.cc |
| diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc |
| index e84365789be42805a1d3e91eb76c6b93f3298f81..26924b38999e7324c628e5c163e65bf6c5336b88 100644 |
| --- a/src/arm/ic-arm.cc |
| +++ b/src/arm/ic-arm.cc |
| @@ -1690,12 +1690,12 @@ void CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { |
| // Activate inlined smi code. |
| if (previous_state == UNINITIALIZED) { |
| - PatchInlinedSmiCode(address()); |
| + PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
| } |
| } |
| -void PatchInlinedSmiCode(Address address) { |
| +void PatchInlinedSmiCode(Address address, InlinedSmiCheck check) { |
| Address cmp_instruction_address = |
| address + Assembler::kCallTargetAddressOffset; |
| @@ -1729,34 +1729,31 @@ void PatchInlinedSmiCode(Address address) { |
| Instr instr_at_patch = Assembler::instr_at(patch_address); |
| Instr branch_instr = |
| Assembler::instr_at(patch_address + Instruction::kInstrSize); |
| - ASSERT(Assembler::IsCmpRegister(instr_at_patch)); |
| - ASSERT_EQ(Assembler::GetRn(instr_at_patch).code(), |
| - Assembler::GetRm(instr_at_patch).code()); |
| + // This is patching a conditional "jump if/if-not smi" site. |
|
Vyacheslav Egorov (Chromium)
2012/05/02 11:29:48
I think to align with code snippets below this sho
Michael Starzinger
2012/05/03 10:56:21
Done.
|
| + // Enabling by changing from |
| + // cmp rx, rx |
| + // b eq/ne, <target> |
| + // to |
| + // tst rx, #kSmiTagMask |
| + // b ne/eq, <target> |
| + // and vice-versa to be disabled again. |
| + CodePatcher patcher(patch_address, 2); |
| + Register reg = Assembler::GetRn(instr_at_patch); |
| + if (check == ENABLE_INLINED_SMI_CHECK) { |
| + ASSERT(Assembler::IsCmpRegister(instr_at_patch)); |
| + ASSERT_EQ(Assembler::GetRn(instr_at_patch).code(), |
| + Assembler::GetRm(instr_at_patch).code()); |
| + patcher.masm()->tst(reg, Operand(kSmiTagMask)); |
| + } else { |
| + ASSERT(check == DISABLE_INLINED_SMI_CHECK); |
| + ASSERT(Assembler::IsTstImmediate(instr_at_patch)); |
| + patcher.masm()->cmp(reg, reg); |
| + } |
| ASSERT(Assembler::IsBranch(branch_instr)); |
| if (Assembler::GetCondition(branch_instr) == eq) { |
| - // This is patching a "jump if not smi" site to be active. |
| - // Changing |
| - // cmp rx, rx |
| - // b eq, <target> |
| - // to |
| - // tst rx, #kSmiTagMask |
| - // b ne, <target> |
| - CodePatcher patcher(patch_address, 2); |
| - Register reg = Assembler::GetRn(instr_at_patch); |
| - patcher.masm()->tst(reg, Operand(kSmiTagMask)); |
| patcher.EmitCondition(ne); |
| } else { |
| ASSERT(Assembler::GetCondition(branch_instr) == ne); |
| - // This is patching a "jump if smi" site to be active. |
| - // Changing |
| - // cmp rx, rx |
| - // b ne, <target> |
| - // to |
| - // tst rx, #kSmiTagMask |
| - // b eq, <target> |
| - CodePatcher patcher(patch_address, 2); |
| - Register reg = Assembler::GetRn(instr_at_patch); |
| - patcher.masm()->tst(reg, Operand(kSmiTagMask)); |
| patcher.EmitCondition(eq); |
| } |
| } |