14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#include <thread>
174514f5e3Sopenharmony_ci
184514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h"
194514f5e3Sopenharmony_ci#include "ecmascript/global_env_constants.h"
204514f5e3Sopenharmony_ci#include "ecmascript/global_env_constants-inl.h"
214514f5e3Sopenharmony_ci#include "ecmascript/ic/ic_binary_op.h"
224514f5e3Sopenharmony_ci#include "ecmascript/interpreter/slow_runtime_stub.h"
234514f5e3Sopenharmony_ci#include "ecmascript/object_factory.h"
244514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
254514f5e3Sopenharmony_ci
264514f5e3Sopenharmony_ciusing namespace panda::ecmascript;
274514f5e3Sopenharmony_cinamespace panda::test {
284514f5e3Sopenharmony_ciclass ICBinaryOPTest : public testing::Test {
294514f5e3Sopenharmony_cipublic:
304514f5e3Sopenharmony_ci    static void SetUpTestCase()
314514f5e3Sopenharmony_ci    {
324514f5e3Sopenharmony_ci        GTEST_LOG_(INFO) << "SetUpTestCase";
334514f5e3Sopenharmony_ci    }
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ci    static void TearDownTestCase()
364514f5e3Sopenharmony_ci    {
374514f5e3Sopenharmony_ci        GTEST_LOG_(INFO) << "TearDownCase";
384514f5e3Sopenharmony_ci    }
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_ci    void SetUp() override
414514f5e3Sopenharmony_ci    {
424514f5e3Sopenharmony_ci        TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope);
434514f5e3Sopenharmony_ci    }
444514f5e3Sopenharmony_ci
454514f5e3Sopenharmony_ci    void TearDown() override
464514f5e3Sopenharmony_ci    {
474514f5e3Sopenharmony_ci        TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope);
484514f5e3Sopenharmony_ci    }
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_ci    EcmaHandleScope *scope {nullptr};
514514f5e3Sopenharmony_ci    JSThread *thread {nullptr};
524514f5e3Sopenharmony_ci    EcmaVM *ecmaVm = nullptr;
534514f5e3Sopenharmony_ci};
544514f5e3Sopenharmony_ci
554514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, AddWithTSType)
564514f5e3Sopenharmony_ci{
574514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
584514f5e3Sopenharmony_ci
594514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("AddTest");
604514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str2 = factory->NewFromASCII("IC");
614514f5e3Sopenharmony_ci    JSHandle<JSObject> arg4 = factory->NewEmptyJSObject();
624514f5e3Sopenharmony_ci    JSTaggedValue arg1Value(static_cast<uint32_t>(2));
634514f5e3Sopenharmony_ci    JSTaggedValue arg2Value(static_cast<uint32_t>(3));
644514f5e3Sopenharmony_ci    JSTaggedValue arg3Value(static_cast<double>(9.5561));
654514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg1(thread, arg1Value);
664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg2(thread, arg2Value);
674514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg3(thread, arg3Value);
684514f5e3Sopenharmony_ci
694514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Add2(thread, arg1.GetTaggedValue(),
704514f5e3Sopenharmony_ci                                                            arg2.GetTaggedValue());
714514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
724514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::AddWithTSType(thread,  arg1.GetTaggedValue(), arg2.GetTaggedValue(),
734514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
744514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
754514f5e3Sopenharmony_ci
764514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Add2(thread, arg1.GetTaggedValue(),
774514f5e3Sopenharmony_ci                                                            arg3.GetTaggedValue());
784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
794514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::AddWithTSType(thread,  arg1.GetTaggedValue(), arg3.GetTaggedValue(),
804514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
814514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
824514f5e3Sopenharmony_ci
834514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Add2(thread, Str1.GetTaggedValue(),
844514f5e3Sopenharmony_ci                                                            Str2.GetTaggedValue());
854514f5e3Sopenharmony_ci    JSHandle<EcmaString> slowHandle3(thread, reinterpret_cast<EcmaString *>(resInSlowPath3.GetRawData()));
864514f5e3Sopenharmony_ci    JSTaggedValue resInICPath3 = ICBinaryOP::AddWithTSType(thread,  Str1.GetTaggedValue(), Str2.GetTaggedValue(),
874514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::STRING)));
884514f5e3Sopenharmony_ci    ASSERT_TRUE(resInICPath3.IsString());
894514f5e3Sopenharmony_ci    EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle3, JSHandle<EcmaString>(thread, resInICPath3)), 0);
904514f5e3Sopenharmony_ci
914514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Add2(thread, JSTaggedValue::Undefined(),
924514f5e3Sopenharmony_ci                                                            arg2.GetTaggedValue());
934514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle4(thread, resInSlowPath4);
944514f5e3Sopenharmony_ci    JSTaggedValue resInICPath4 = ICBinaryOP::AddWithTSType(thread,  JSTaggedValue::Undefined(),
954514f5e3Sopenharmony_ci                                                           arg2.GetTaggedValue(),
964514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER_GEN)));
974514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle4.GetTaggedValue(), resInICPath4);
984514f5e3Sopenharmony_ci
994514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Add2(thread, arg3.GetTaggedValue(),
1004514f5e3Sopenharmony_ci                                                            Str1.GetTaggedValue());
1014514f5e3Sopenharmony_ci    JSHandle<EcmaString> slowHandle5(thread, reinterpret_cast<EcmaString *>(resInSlowPath5.GetRawData()));
1024514f5e3Sopenharmony_ci    JSTaggedValue resInICPath5 = ICBinaryOP::AddWithTSType(thread,  arg3.GetTaggedValue(),
1034514f5e3Sopenharmony_ci                                                           Str1.GetTaggedValue(),
1044514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::STRING_GEN)));
1054514f5e3Sopenharmony_ci    ASSERT_TRUE(resInICPath5.IsString());
1064514f5e3Sopenharmony_ci    EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle5, JSHandle<EcmaString>(thread, resInICPath5)), 0);
1074514f5e3Sopenharmony_ci
1084514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath6 = SlowRuntimeStub::Add2(thread, Str1.GetTaggedValue(),
1094514f5e3Sopenharmony_ci                                                            JSTaggedValue::Null());
1104514f5e3Sopenharmony_ci    JSHandle<EcmaString> slowHandle6(thread, reinterpret_cast<EcmaString *>(resInSlowPath6.GetRawData()));
1114514f5e3Sopenharmony_ci    JSTaggedValue resInICPath6 = ICBinaryOP::AddWithTSType(thread,  Str1.GetTaggedValue(), JSTaggedValue::Null(),
1124514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::STRING_GEN)));
1134514f5e3Sopenharmony_ci    ASSERT_TRUE(resInICPath6.IsString());
1144514f5e3Sopenharmony_ci    EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle6, JSHandle<EcmaString>(thread, resInICPath6)), 0);
1154514f5e3Sopenharmony_ci
1164514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath7 = SlowRuntimeStub::Add2(thread, arg1.GetTaggedValue(),
1174514f5e3Sopenharmony_ci                                                            JSTaggedValue::True());
1184514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle7(thread, resInSlowPath7);
1194514f5e3Sopenharmony_ci    JSTaggedValue resInICPath7 = ICBinaryOP::AddWithTSType(thread, arg1.GetTaggedValue(), JSTaggedValue::True(),
1204514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER_GEN)));
1214514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle7.GetTaggedValue(), resInICPath7);
1224514f5e3Sopenharmony_ci
1234514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath8 = SlowRuntimeStub::Add2(thread, arg4.GetTaggedValue(),
1244514f5e3Sopenharmony_ci                                                            JSTaggedValue::Null());
1254514f5e3Sopenharmony_ci    JSHandle<EcmaString> slowHandle8(thread, reinterpret_cast<EcmaString *>(resInSlowPath8.GetRawData()));
1264514f5e3Sopenharmony_ci    JSTaggedValue resInICPath8 = ICBinaryOP::AddWithTSType(thread,  arg4.GetTaggedValue(), JSTaggedValue::Null(),
1274514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
1284514f5e3Sopenharmony_ci    ASSERT_TRUE(resInICPath8.IsString());
1294514f5e3Sopenharmony_ci    EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle8, JSHandle<EcmaString>(thread, resInICPath8)), 0);
1304514f5e3Sopenharmony_ci};
1314514f5e3Sopenharmony_ci
1324514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, SubWithTSType)
1334514f5e3Sopenharmony_ci{
1344514f5e3Sopenharmony_ci    JSTaggedValue arg1Value(static_cast<uint32_t>(-2));
1354514f5e3Sopenharmony_ci    JSTaggedValue arg2Value(static_cast<uint32_t>(INT32_MAX-1));
1364514f5e3Sopenharmony_ci    JSTaggedValue arg3Value(static_cast<double>(9.5561));
1374514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg1(thread, arg1Value);
1384514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg2(thread, arg2Value);
1394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg3(thread, arg3Value);
1404514f5e3Sopenharmony_ci
1414514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Sub2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
1424514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
1434514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::SubWithTSType(thread,  arg1.GetTaggedValue(), arg2.GetTaggedValue(),
1444514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
1454514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
1464514f5e3Sopenharmony_ci
1474514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Sub2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
1484514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
1494514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::SubWithTSType(thread,  arg2.GetTaggedValue(), arg3.GetTaggedValue(),
1504514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
1514514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
1524514f5e3Sopenharmony_ci
1534514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Sub2(thread, arg1.GetTaggedValue(), JSTaggedValue::True());
1544514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
1554514f5e3Sopenharmony_ci    JSTaggedValue resInICPath3 = ICBinaryOP::SubWithTSType(thread,  arg1.GetTaggedValue(), JSTaggedValue::True(),
1564514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
1574514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
1584514f5e3Sopenharmony_ci};
1594514f5e3Sopenharmony_ci
1604514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, MulWithTSType)
1614514f5e3Sopenharmony_ci{
1624514f5e3Sopenharmony_ci    JSTaggedValue arg1Value(static_cast<double>(28.5));
1634514f5e3Sopenharmony_ci    JSTaggedValue arg2Value(static_cast<uint16_t>(354));
1644514f5e3Sopenharmony_ci    JSTaggedValue arg3Value(static_cast<double>(9.5561));
1654514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg1(thread, arg1Value);
1664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg2(thread, arg2Value);
1674514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg3(thread, arg3Value);
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Mul2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
1704514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
1714514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::MulWithTSType(thread,  arg1.GetTaggedValue(), arg2.GetTaggedValue(),
1724514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
1734514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
1744514f5e3Sopenharmony_ci
1754514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Mul2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
1764514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
1774514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::MulWithTSType(thread,  arg2.GetTaggedValue(), arg3.GetTaggedValue(),
1784514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
1794514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
1804514f5e3Sopenharmony_ci
1814514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Mul2(thread, arg1.GetTaggedValue(), JSTaggedValue::True());
1824514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
1834514f5e3Sopenharmony_ci    JSTaggedValue resInICPath3 = ICBinaryOP::MulWithTSType(thread,  arg1.GetTaggedValue(), JSTaggedValue::True(),
1844514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
1854514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
1864514f5e3Sopenharmony_ci
1874514f5e3Sopenharmony_ci};
1884514f5e3Sopenharmony_ci
1894514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, DivWithTSType)
1904514f5e3Sopenharmony_ci{
1914514f5e3Sopenharmony_ci    JSTaggedValue arg1Value(static_cast<uint32_t>(2));
1924514f5e3Sopenharmony_ci    JSTaggedValue arg2Value(static_cast<uint32_t>(39884));
1934514f5e3Sopenharmony_ci    JSTaggedValue arg3Value(static_cast<uint32_t>(0));
1944514f5e3Sopenharmony_ci    JSTaggedValue arg4Value(static_cast<double>(934.5561));
1954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg1(thread, arg1Value);
1964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg2(thread, arg2Value);
1974514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg3(thread, arg3Value);
1984514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg4(thread, arg4Value);
1994514f5e3Sopenharmony_ci
2004514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Div2(thread, arg3.GetTaggedValue(), arg2.GetTaggedValue());
2014514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
2024514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::DivWithTSType(thread,  arg3.GetTaggedValue(), arg2.GetTaggedValue(),
2034514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2044514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Div2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
2074514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
2084514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::DivWithTSType(thread,  arg2.GetTaggedValue(), arg3.GetTaggedValue(),
2094514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2104514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
2114514f5e3Sopenharmony_ci
2124514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Div2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
2134514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
2144514f5e3Sopenharmony_ci    JSTaggedValue resInICPath3 = ICBinaryOP::DivWithTSType(thread,  arg1.GetTaggedValue(), arg2.GetTaggedValue(),
2154514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2164514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
2174514f5e3Sopenharmony_ci
2184514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Div2(thread, arg2.GetTaggedValue(), JSTaggedValue::True());
2194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle4(thread, resInSlowPath4);
2204514f5e3Sopenharmony_ci    JSTaggedValue resInICPath4 = ICBinaryOP::DivWithTSType(thread,  arg2.GetTaggedValue(), JSTaggedValue::True(),
2214514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
2224514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle4.GetTaggedValue(), resInICPath4);
2234514f5e3Sopenharmony_ci
2244514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Div2(thread, arg4.GetTaggedValue(), JSTaggedValue::False());
2254514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle5(thread, resInSlowPath5);
2264514f5e3Sopenharmony_ci    JSTaggedValue resInICPath5 = ICBinaryOP::DivWithTSType(thread,  arg4.GetTaggedValue(),
2274514f5e3Sopenharmony_ci                                                           JSTaggedValue::False(),
2284514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
2294514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle5.GetTaggedValue(), resInICPath5);
2304514f5e3Sopenharmony_ci};
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, ModWithTSType)
2334514f5e3Sopenharmony_ci{
2344514f5e3Sopenharmony_ci    JSTaggedValue arg1Value(static_cast<uint32_t>(2));
2354514f5e3Sopenharmony_ci    JSTaggedValue arg2Value(static_cast<uint32_t>(39884));
2364514f5e3Sopenharmony_ci    JSTaggedValue arg3Value(static_cast<uint32_t>(0));
2374514f5e3Sopenharmony_ci    JSTaggedValue arg4Value(static_cast<double>(934.5561));
2384514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg1(thread, arg1Value);
2394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg2(thread, arg2Value);
2404514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg3(thread, arg3Value);
2414514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg4(thread, arg4Value);
2424514f5e3Sopenharmony_ci
2434514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Mod2(thread, arg3.GetTaggedValue(), arg2.GetTaggedValue());
2444514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
2454514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::ModWithTSType(thread,  arg3.GetTaggedValue(), arg2.GetTaggedValue(),
2464514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2474514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
2484514f5e3Sopenharmony_ci
2494514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Mod2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
2504514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
2514514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::ModWithTSType(thread,  arg2.GetTaggedValue(), arg3.GetTaggedValue(),
2524514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2534514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
2544514f5e3Sopenharmony_ci
2554514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Mod2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
2564514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
2574514f5e3Sopenharmony_ci    JSTaggedValue resInICPath3 = ICBinaryOP::ModWithTSType(thread,  arg1.GetTaggedValue(), arg2.GetTaggedValue(),
2584514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2594514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
2604514f5e3Sopenharmony_ci
2614514f5e3Sopenharmony_ci
2624514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Mod2(thread, arg2.GetTaggedValue(), JSTaggedValue::True());
2634514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle4(thread, resInSlowPath4);
2644514f5e3Sopenharmony_ci    JSTaggedValue resInICPath4 = ICBinaryOP::ModWithTSType(thread,  arg2.GetTaggedValue(), JSTaggedValue::True(),
2654514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
2664514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle4.GetTaggedValue(), resInICPath4);
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci
2694514f5e3Sopenharmony_ci    JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Mod2(thread, arg4.GetTaggedValue(), JSTaggedValue::False());
2704514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> slowHandle5(thread, resInSlowPath5);
2714514f5e3Sopenharmony_ci    JSTaggedValue resInICPath5 = ICBinaryOP::ModWithTSType(thread,  arg4.GetTaggedValue(),
2724514f5e3Sopenharmony_ci                                                           JSTaggedValue::False(),
2734514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
2744514f5e3Sopenharmony_ci    EXPECT_EQ(slowHandle5.GetTaggedValue(), resInICPath5);
2754514f5e3Sopenharmony_ci};
2764514f5e3Sopenharmony_ci
2774514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, ShlWithTSType)
2784514f5e3Sopenharmony_ci{
2794514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVm->GetFactory();
2804514f5e3Sopenharmony_ci
2814514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
2824514f5e3Sopenharmony_ci    JSTaggedValue arg1(static_cast<uint32_t>(286));
2834514f5e3Sopenharmony_ci    JSTaggedValue arg3(static_cast<uint32_t>(5));
2844514f5e3Sopenharmony_ci
2854514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::ShlWithTSType(thread,  arg1, arg3,
2864514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
2874514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(9152), resInICPath1);
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::ShlWithTSType(thread,  Str1.GetTaggedValue(), arg3,
2904514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
2914514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(7200), resInICPath2);
2924514f5e3Sopenharmony_ci};
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, ShrWithTSType)
2954514f5e3Sopenharmony_ci{
2964514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVm->GetFactory();
2974514f5e3Sopenharmony_ci
2984514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
2994514f5e3Sopenharmony_ci    JSTaggedValue arg1(static_cast<uint32_t>(286));
3004514f5e3Sopenharmony_ci    JSTaggedValue arg3(static_cast<uint32_t>(5));
3014514f5e3Sopenharmony_ci
3024514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::ShrWithTSType(thread,  arg1, arg3,
3034514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
3044514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(8), resInICPath1);
3054514f5e3Sopenharmony_ci
3064514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::ShrWithTSType(thread,  Str1.GetTaggedValue(), arg3,
3074514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
3084514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(7), resInICPath2);
3094514f5e3Sopenharmony_ci};
3104514f5e3Sopenharmony_ci
3114514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, AshrWithTSType)
3124514f5e3Sopenharmony_ci{
3134514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVm->GetFactory();
3144514f5e3Sopenharmony_ci
3154514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
3164514f5e3Sopenharmony_ci    JSTaggedValue arg1(static_cast<uint32_t>(286));
3174514f5e3Sopenharmony_ci    JSTaggedValue arg2(static_cast<uint32_t>(-286));
3184514f5e3Sopenharmony_ci    JSTaggedValue arg3(static_cast<uint32_t>(5));
3194514f5e3Sopenharmony_ci
3204514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::AshrWithTSType(thread,  arg1, arg3,
3214514f5e3Sopenharmony_ci                                                            JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
3224514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(8), resInICPath1);
3234514f5e3Sopenharmony_ci
3244514f5e3Sopenharmony_ci    JSTaggedValue resInICPath3 = ICBinaryOP::AshrWithTSType(thread,  arg2, arg3,
3254514f5e3Sopenharmony_ci                                                            JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
3264514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(134217719), resInICPath3);
3274514f5e3Sopenharmony_ci
3284514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::AshrWithTSType(thread,  Str1.GetTaggedValue(), arg3,
3294514f5e3Sopenharmony_ci                                                            JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
3304514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(7), resInICPath2);
3314514f5e3Sopenharmony_ci
3324514f5e3Sopenharmony_ci};
3334514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, AndWithTSType)
3344514f5e3Sopenharmony_ci{
3354514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVm->GetFactory();
3364514f5e3Sopenharmony_ci
3374514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
3384514f5e3Sopenharmony_ci    JSTaggedValue arg1(static_cast<uint32_t>(286));
3394514f5e3Sopenharmony_ci    JSTaggedValue arg3(static_cast<uint32_t>(541));
3404514f5e3Sopenharmony_ci
3414514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::AndWithTSType(thread,  arg1, arg3,
3424514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
3434514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(28), resInICPath1);
3444514f5e3Sopenharmony_ci
3454514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::AndWithTSType(thread,  Str1.GetTaggedValue(), arg3,
3464514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
3474514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(1), resInICPath2);
3484514f5e3Sopenharmony_ci};
3494514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, OrWithTSType)
3504514f5e3Sopenharmony_ci{
3514514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVm->GetFactory();
3524514f5e3Sopenharmony_ci
3534514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
3544514f5e3Sopenharmony_ci    JSTaggedValue arg1(static_cast<uint32_t>(286));
3554514f5e3Sopenharmony_ci    JSTaggedValue arg3(static_cast<uint32_t>(523));
3564514f5e3Sopenharmony_ci
3574514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::OrWithTSType(thread,  arg1, arg3,
3584514f5e3Sopenharmony_ci                                                          JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
3594514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(799), resInICPath1);
3604514f5e3Sopenharmony_ci
3614514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::OrWithTSType(thread,  Str1.GetTaggedValue(), arg3,
3624514f5e3Sopenharmony_ci                                                          JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
3634514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(747), resInICPath2);
3644514f5e3Sopenharmony_ci};
3654514f5e3Sopenharmony_ciHWTEST_F_L0(ICBinaryOPTest, XorWithTSType)
3664514f5e3Sopenharmony_ci{
3674514f5e3Sopenharmony_ci    ObjectFactory *factory = ecmaVm->GetFactory();
3684514f5e3Sopenharmony_ci
3694514f5e3Sopenharmony_ci    JSHandle<EcmaString> Str1 = factory->NewFromASCII("1225");
3704514f5e3Sopenharmony_ci    JSTaggedValue arg1(static_cast<uint32_t>(286));
3714514f5e3Sopenharmony_ci    JSTaggedValue arg3(static_cast<uint32_t>(523));
3724514f5e3Sopenharmony_ci
3734514f5e3Sopenharmony_ci    JSTaggedValue resInICPath1 = ICBinaryOP::XorWithTSType(thread,  arg1, arg3,
3744514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
3754514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(789), resInICPath1);
3764514f5e3Sopenharmony_ci
3774514f5e3Sopenharmony_ci    JSTaggedValue resInICPath2 = ICBinaryOP::XorWithTSType(thread,  Str1.GetTaggedValue(), arg3,
3784514f5e3Sopenharmony_ci                                                           JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
3794514f5e3Sopenharmony_ci    EXPECT_EQ(JSTaggedValue(1730), resInICPath2);
3804514f5e3Sopenharmony_ci};
3814514f5e3Sopenharmony_ci}  // namespace panda::test
382