Index: src/arm64/code-stubs-arm64.cc |
diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc |
index 15acc0ee9dd41c0c24bfd7d0374430d4e3334566..3ef118aae9e6a7742276610346bd2dc79244d4b3 100644 |
--- a/src/arm64/code-stubs-arm64.cc |
+++ b/src/arm64/code-stubs-arm64.cc |
@@ -1766,7 +1766,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
// If there is a call site cache, don't look in the global cache, but do the |
// real lookup and update the call site cache. |
- if (!HasCallSiteInlineCheck()) { |
+ if (!HasCallSiteInlineCheck() && !ReturnTrueFalseObject()) { |
Label miss; |
__ JumpIfNotRoot(function, Heap::kInstanceofCacheFunctionRootIndex, &miss); |
__ JumpIfNotRoot(map, Heap::kInstanceofCacheMapRootIndex, &miss); |
@@ -1798,6 +1798,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
} |
Label return_true, return_result; |
+ Register smi_value = scratch1; |
{ |
// Loop through the prototype chain looking for the function prototype. |
Register chain_map = x1; |
@@ -1808,6 +1809,10 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
__ LoadRoot(null_value, Heap::kNullValueRootIndex); |
// Speculatively set a result. |
__ Mov(result, res_false); |
+ if (!HasCallSiteInlineCheck() && ReturnTrueFalseObject()) { |
+ // Value to store in the cache cannot be an object. |
+ __ Mov(smi_value, Smi::FromInt(1)); |
+ } |
__ Bind(&loop); |
@@ -1830,6 +1835,10 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
// We cannot fall through to here. |
__ Bind(&return_true); |
__ Mov(result, res_true); |
+ if (!HasCallSiteInlineCheck() && ReturnTrueFalseObject()) { |
+ // Value to store in the cache cannot be an object. |
+ __ Mov(smi_value, Smi::FromInt(0)); |
+ } |
__ Bind(&return_result); |
if (HasCallSiteInlineCheck()) { |
DCHECK(ReturnTrueFalseObject()); |
@@ -1837,7 +1846,8 @@ void InstanceofStub::Generate(MacroAssembler* masm) { |
__ GetRelocatedValueLocation(map_check_site, scratch2); |
__ Str(result, MemOperand(scratch2)); |
} else { |
- __ StoreRoot(result, Heap::kInstanceofCacheAnswerRootIndex); |
+ Register cached_value = ReturnTrueFalseObject() ? smi_value : result; |
+ __ StoreRoot(cached_value, Heap::kInstanceofCacheAnswerRootIndex); |
} |
__ Ret(); |