Reason:fix number ic

Issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/I9JBVX?from=project-issue

Signed-off-by: wupengyong <wupengyong@huawei.com>
Change-Id: I71f023725deef598fad97c48d2a1aba2621df0eb
This commit is contained in:
wupengyong 2024-04-24 16:54:28 +08:00
parent 6f2d77f581
commit da962744ca
6 changed files with 37 additions and 26 deletions

View File

@ -74,8 +74,9 @@ void ICStubBuilder::NamedICAccessor(Variable* cachedHandler, Label *tryICHandler
GateRef glueGlobalEnv = Load(VariableType::NATIVE_POINTER(), glue_, glueGlobalEnvOffset);
auto numberFunction = GetGlobalEnvValue(VariableType::JS_ANY(),
glueGlobalEnv, GlobalEnv::NUMBER_FUNCTION_INDEX);
GateRef hclass = LoadHClass(numberFunction);
BRANCH(BoolAnd(TaggedIsHeapObject(firstValue), Equal(LoadObjectFromWeakRef(firstValue), hclass)),
GateRef ctorProtoOrHC =
Load(VariableType::JS_POINTER(), numberFunction, IntPtr(JSFunction::PROTO_OR_DYNCLASS_OFFSET));
BRANCH(BoolAnd(TaggedIsHeapObject(firstValue), Equal(LoadObjectFromWeakRef(firstValue), ctorProtoOrHC)),
tryICHandler, slowPath_);
}
}
@ -147,29 +148,15 @@ void ICStubBuilder::LoadICByName(
{
auto env = GetEnvironment();
Label loadWithHandler(env);
Label isNumber(env);
Label notNumber(env);
SetLabels(tryFastPath, slowPath, success);
DEFVARIABLE(cachedHandler, VariableType::JS_ANY(), Undefined());
NamedICAccessor(&cachedHandler, &loadWithHandler);
Bind(&loadWithHandler);
{
BRANCH(TaggedIsNumber(receiver_), &isNumber, &notNumber);
Bind(&isNumber);
{
GateRef primitive = NewJSPrimitiveRef(glue_, GlobalEnv::NUMBER_FUNCTION_INDEX, receiver_);
GateRef ret = LoadICWithHandler(glue_, primitive, primitive, *cachedHandler, callback);
result->WriteVariable(ret);
BRANCH(TaggedIsHole(ret), slowPath_, success_);
}
Bind(&notNumber);
{
GateRef ret = LoadICWithHandler(glue_, receiver_, receiver_, *cachedHandler, callback);
result->WriteVariable(ret);
BRANCH(TaggedIsHole(ret), slowPath_, success_);
}
GateRef ret = LoadICWithHandler(glue_, receiver_, receiver_, *cachedHandler, callback);
result->WriteVariable(ret);
BRANCH(TaggedIsHole(ret), slowPath_, success_);
}
}

View File

@ -387,7 +387,6 @@ GateRef StubBuilder::BinarySearch(GateRef glue, GateRef layoutInfo, GateRef key,
BRANCH(Int32LessThanOrEqual(*low, *high), &next, &exit);
Bind(&next);
mid = Int32Add(*low, Int32Div(Int32Sub(*high, *low), Int32(2))); // 2: half
DebugPrint(glue, { Int32(GET_MESSAGE_STRING_ID(INT32_VALUE)), *mid });
GateRef midKey = GetSortedKey(layoutInfo, *mid);
GateRef midHash = GetKeyHashCode(glue, midKey);
BRANCH(Int32UnsignedGreaterThan(midHash, keyHash), &midGreaterKey, &midnotGreaterKey);

View File

@ -98,12 +98,11 @@ ARK_INLINE JSTaggedValue ICRuntimeStub::TryLoadICByName(JSThread *thread, JSTagg
return LoadICWithHandler(thread, receiver, receiver, cachedHandler);
}
} else if (receiver.IsNumber()) {
auto factory = thread->GetEcmaVM()->GetFactory();
JSHandle<JSTaggedValue> handler = JSHandle<JSTaggedValue>(thread, secondValue);
JSHandle<JSPrimitiveRef> primitive =
factory->NewJSPrimitiveRef(PrimitiveType::PRIMITIVE_NUMBER, JSHandle<JSTaggedValue>(thread, receiver));
JSTaggedValue primitiveValue = primitive.GetTaggedValue();
return LoadICWithHandler(thread, primitiveValue, primitiveValue, handler.GetTaggedValue());
JSHandle<JSFunction> function(thread->GetEcmaVM()->GetGlobalEnv()->GetNumberFunction());
auto hclass = reinterpret_cast<JSHClass *>(function->GetProtoOrHClass().GetTaggedObject());
if (firstValue.GetWeakReferentUnChecked() == hclass) {
return LoadICWithHandler(thread, receiver, receiver, secondValue);
}
}
return JSTaggedValue::Hole();
}

View File

@ -21,6 +21,7 @@
#include "ecmascript/js_array.h"
#include "ecmascript/js_object.h"
#include "ecmascript/js_tagged_value.h"
#include "ecmascript/object_operator.h"
#include "ecmascript/tests/test_helper.h"
using namespace panda::ecmascript;
@ -235,6 +236,18 @@ HWTEST_F_L0(ICRuntimeStubTest, TryStoreICAndLoadIC_ByName)
JSTaggedValue resultValue2 = ICRuntimeStub::TryLoadICByName(thread, handleObj.GetTaggedValue(),
handleFirstArrVal, handleSecondPropertyBoxVal);
EXPECT_TRUE(resultValue2.IsHole());
// receiver is number
int a = 32;
JSHandle<JSTaggedValue> numReceiver(thread, JSTaggedValue(a));
JSHandle<JSTaggedValue> receiver =
JSHandle<JSTaggedValue>::Cast(factory->NewJSPrimitiveRef(PrimitiveType::PRIMITIVE_NUMBER, numReceiver));
JSHandle<JSHClass> hclass(thread, receiver->GetTaggedObject()->GetClass());
JSHandle<JSTaggedValue> key = thread->GlobalConstants()->GetHandledValueOfString();
ObjectOperator op(thread, numReceiver, key);
JSHandle<JSTaggedValue> handlerValue = PrototypeHandler::LoadPrototype(thread, op, hclass);
JSTaggedValue resultValue3 = ICRuntimeStub::TryLoadICByName(thread, numReceiver.GetTaggedValue(),
hclass.GetTaggedValue(), handlerValue.GetTaggedValue());
EXPECT_EQ(op.GetValue(), resultValue3);
}
HWTEST_F_L0(ICRuntimeStubTest, TryStoreICAndLoadIC_ByValue1)

View File

@ -14,3 +14,4 @@
primitiveic load success
load ic by name test2 success!
load Number ic by name success!
load Number ic by name success1!

View File

@ -83,3 +83,15 @@ for (let i = 0; i < 100; i++) {
f(Number, 1);
}
print("load Number ic by name success!")
function f(a, b) {
a.valueOf();
}
for (let i = 0; i < 100; i++) {
f(Number.prototype, 1);
}
for (let i = 0; i < 100; i++) {
f(120, 1);
}
print("load Number ic by name success1!")