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