From 241c1311ca44cf1f42a99b266bc281a96c338cb4 Mon Sep 17 00:00:00 2001 From: "rodolph.perfetta@arm.com" Date: Thu, 7 Aug 2014 10:42:55 +0000 Subject: [PATCH] ARM64: fix Instanceof stub. TF exposed a bug. BUG= R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/443153002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22968 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm64/code-stubs-arm64.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc index 15acc0e..3ef118a 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(); -- 2.7.4