From 67bda150df5b3b1d86df46f5a21b583cea588fe4 Mon Sep 17 00:00:00 2001 From: chenjx-huawei Date: Fri, 29 Aug 2025 16:47:53 +0800 Subject: [PATCH] Add numberToString cache in IR Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICVGEY?from=project-issue Signed-off-by: chenjx-huawei Change-Id: I2575365446b14f2a2c0956d6bbbed684a816a5c4 --- ecmascript/builtins/builtins_number.h | 1 - .../builtins/builtins_number_stub_builder.cpp | 35 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/ecmascript/builtins/builtins_number.h b/ecmascript/builtins/builtins_number.h index 63d4cf3bd2..142aae9b90 100644 --- a/ecmascript/builtins/builtins_number.h +++ b/ecmascript/builtins/builtins_number.h @@ -190,7 +190,6 @@ public: return value & mask; } -private: static constexpr int INITIAL_CACHE_NUMBER = 256; static constexpr int NUMBER_INDEX = 0; static constexpr int RESULT_INDEX = 1; diff --git a/ecmascript/compiler/builtins/builtins_number_stub_builder.cpp b/ecmascript/compiler/builtins/builtins_number_stub_builder.cpp index cfb2b8ec40..01f520d286 100644 --- a/ecmascript/compiler/builtins/builtins_number_stub_builder.cpp +++ b/ecmascript/compiler/builtins/builtins_number_stub_builder.cpp @@ -15,6 +15,7 @@ #include "ecmascript/compiler/builtins/builtins_number_stub_builder.h" +#include "ecmascript/builtins/builtins_number.h" #include "ecmascript/compiler/new_object_stub_builder.h" #include "ecmascript/js_primitive_ref.h" @@ -344,8 +345,38 @@ void BuiltinsNumberStubBuilder::ToStringFunc(Variable *result, Label *exit, Labe } Bind(¬ThrowError); { - *result = NumberToString(thisValueInt, msgValue); - Jump(exit); + Label cacheMiss(env); + Label cacheNumIsNotUndefined(env); + Label numberIsEqual(env); + GateRef globalEnv = GetCurrentGlobalEnv(); + auto cacheArray = GetGlobalEnvValue(VariableType::JS_ANY(), glue_, globalEnv, + GlobalEnv::NUMBER_TO_STRING_RESULT_CACHE_INDEX); + GateRef entry = Int32And(thisValueInt, + Int32Sub(Int32(builtins::NumberToStringResultCache::INITIAL_CACHE_NUMBER), Int32(1))); + GateRef index = Int32Mul(entry, Int32(builtins::NumberToStringResultCache::ENTRY_SIZE)); + GateRef cacheNumber = GetValueFromTaggedArray(glue_, cacheArray, + Int32Add(index, Int32(builtins::NumberToStringResultCache::NUMBER_INDEX))); + GateRef cacheStr = GetValueFromTaggedArray(glue_, cacheArray, + Int32Add(index, Int32(builtins::NumberToStringResultCache::RESULT_INDEX))); + BRANCH(TaggedIsUndefined(cacheNumber), &cacheMiss, &cacheNumIsNotUndefined); + Bind(&cacheNumIsNotUndefined); + { + BRANCH(Int32Equal(thisValueInt, GetInt32OfTInt(cacheNumber)), &numberIsEqual, &cacheMiss); + Bind(&numberIsEqual); + *result = cacheStr; + Jump(exit); + } + Bind(&cacheMiss); + { + GateRef resStr = NumberToString(thisValueInt, Int32(10)); // 10: means radix + // Update cache + SetValueToTaggedArray(VariableType::JS_ANY(), glue_, cacheArray, + Int32Add(index, Int32(builtins::NumberToStringResultCache::NUMBER_INDEX)), thisValue_); + SetValueToTaggedArray(VariableType::JS_ANY(), glue_, cacheArray, + Int32Add(index, Int32(builtins::NumberToStringResultCache::RESULT_INDEX)), resStr); + *result = resStr; + Jump(exit); + } } } } -- Gitee