Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index 5858eac6294610656a0df56b7fc5c64d0d739856..f815dca1e815f572089a90456f90db4f954e32fb 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -359,6 +359,7 @@ void FastNewClosureStub::Generate(MacroAssembler* masm) { |
__ LoadRoot(r4, Heap::kUndefinedValueRootIndex); |
__ str(r4, FieldMemOperand(r0, JSFunction::kNextFunctionLinkOffset)); |
__ ldr(r3, FieldMemOperand(r3, SharedFunctionInfo::kCodeOffset)); |
+ __ CheckModeBit(r3); |
__ add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); |
__ str(r3, FieldMemOperand(r0, JSFunction::kCodeEntryOffset)); |
@@ -405,6 +406,7 @@ void FastNewClosureStub::Generate(MacroAssembler* masm) { |
// TODO(fschneider): Idea: store proper code pointers in the map and either |
// unmangle them on marking or do nothing as the whole map is discarded on |
// major GC anyway. |
+ __ CheckModeBit(r4); |
__ add(r4, r4, Operand(Code::kHeaderSize - kHeapObjectTag)); |
__ str(r4, FieldMemOperand(r0, JSFunction::kCodeEntryOffset)); |
@@ -3241,6 +3243,8 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
// (See LCodeGen::DoDeferredLInstanceOfKnownGlobal) |
__ LoadFromSafepointRegisterSlot(scratch, r4); |
__ sub(inline_site, lr, scratch); |
+ __ tst(inline_site, Operand(3)); |
+ __ add(inline_site, inline_site, Operand(4), LeaveCC, ne); |
// Get the map location in scratch and patch it. |
__ GetRelocatedValueLocation(inline_site, scratch); |
__ ldr(scratch, MemOperand(scratch)); |
@@ -3273,7 +3277,10 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
} else { |
// Patch the call site to return true. |
__ LoadRoot(r0, Heap::kTrueValueRootIndex); |
- __ add(inline_site, inline_site, Operand(kDeltaToLoadBoolResult)); |
+ __ tst(inline_site, Operand(3)); |
+ __ add(inline_site, inline_site, Operand(kDeltaToLoadBoolResult), |
+ LeaveCC, eq); |
+ __ add(inline_site, inline_site, Operand(14), LeaveCC, ne); |
// Get the boolean result location in scratch and patch it. |
__ GetRelocatedValueLocation(inline_site, scratch); |
__ str(r0, MemOperand(scratch)); |
@@ -3291,7 +3298,10 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
} else { |
// Patch the call site to return false. |
__ LoadRoot(r0, Heap::kFalseValueRootIndex); |
- __ add(inline_site, inline_site, Operand(kDeltaToLoadBoolResult)); |
+ __ tst(inline_site, Operand(3)); |
+ __ add(inline_site, inline_site, Operand(kDeltaToLoadBoolResult), |
+ LeaveCC, eq); |
+ __ add(inline_site, inline_site, Operand(14), LeaveCC, ne); |
// Get the boolean result location in scratch and patch it. |
__ GetRelocatedValueLocation(inline_site, scratch); |
__ str(r0, MemOperand(scratch)); |
@@ -6847,6 +6857,8 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { |
// Save all caller-save registers as this may be called from anywhere. |
__ stm(db_w, sp, kSavedRegs | lr.bit()); |
+ __ tst(lr, Operand(1)); |
+ __ add(lr, lr, Operand(1), LeaveCC, ne); |
// Compute the function's address for the first argument. |
__ sub(r0, lr, Operand(kReturnAddressDistanceFromFunctionStart)); |