Index: src/mips/ic-mips.cc |
diff --git a/src/mips/ic-mips.cc b/src/mips/ic-mips.cc |
index 2c4da1a886455d6edd64004ed3c18d18c111bfdc..aba71af8877f2942a67b7bf8f95a61a867e6d9c5 100644 |
--- a/src/mips/ic-mips.cc |
+++ b/src/mips/ic-mips.cc |
@@ -1688,12 +1688,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 andi_instruction_address = |
address + Assembler::kCallTargetAddressOffset; |
@@ -1727,33 +1727,30 @@ 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::IsAndImmediate(instr_at_patch)); |
- ASSERT_EQ(0, Assembler::GetImmediate16(instr_at_patch)); |
+ // This is patching a conditional "jump if not smi/jump if smi" site. |
+ // Enabling by changing from |
+ // andi at, rx, 0 |
+ // Branch <target>, eq, at, Operand(zero_reg) |
+ // to: |
+ // andi at, rx, #kSmiTagMask |
+ // Branch <target>, ne, at, Operand(zero_reg) |
+ // and vice-versa to be disabled again. |
+ CodePatcher patcher(patch_address, 2); |
+ Register reg = Register::from_code(Assembler::GetRs(instr_at_patch)); |
+ if (check == ENABLE_INLINED_SMI_CHECK) { |
+ ASSERT(Assembler::IsAndImmediate(instr_at_patch)); |
+ ASSERT_EQ(0, Assembler::GetImmediate16(instr_at_patch)); |
+ patcher.masm()->andi(at, reg, kSmiTagMask); |
+ } else { |
+ ASSERT(check == DISABLE_INLINED_SMI_CHECK); |
+ ASSERT(Assembler::IsAndImmediate(instr_at_patch)); |
+ patcher.masm()->andi(at, reg, 0); |
+ } |
ASSERT(Assembler::IsBranch(branch_instr)); |
if (Assembler::IsBeq(branch_instr)) { |
- // This is patching a "jump if not smi" site to be active. |
- // Changing: |
- // andi at, rx, 0 |
- // Branch <target>, eq, at, Operand(zero_reg) |
- // to: |
- // andi at, rx, #kSmiTagMask |
- // Branch <target>, ne, at, Operand(zero_reg) |
- CodePatcher patcher(patch_address, 2); |
- Register reg = Register::from_code(Assembler::GetRs(instr_at_patch)); |
- patcher.masm()->andi(at, reg, kSmiTagMask); |
patcher.ChangeBranchCondition(ne); |
} else { |
ASSERT(Assembler::IsBne(branch_instr)); |
- // This is patching a "jump if smi" site to be active. |
- // Changing: |
- // andi at, rx, 0 |
- // Branch <target>, ne, at, Operand(zero_reg) |
- // to: |
- // andi at, rx, #kSmiTagMask |
- // Branch <target>, eq, at, Operand(zero_reg) |
- CodePatcher patcher(patch_address, 2); |
- Register reg = Register::from_code(Assembler::GetRs(instr_at_patch)); |
- patcher.masm()->andi(at, reg, kSmiTagMask); |
patcher.ChangeBranchCondition(eq); |
} |
} |