1/* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <thread> 17 18#include "ecmascript/builtins/builtins_boolean.h" 19#include "ecmascript/ecma_runtime_call_info.h" 20#include "ecmascript/ecma_string.h" 21#include "ecmascript/ecma_vm.h" 22#include "ecmascript/global_env.h" 23#include "ecmascript/global_env_constants.h" 24#include "ecmascript/global_env_constants-inl.h" 25#include "ecmascript/ic/ic_compare_op.cpp" 26#include "ecmascript/ic/ic_compare_op.h" 27#include "ecmascript/interpreter/slow_runtime_stub.h" 28#include "ecmascript/js_primitive_ref.h" 29#include "ecmascript/js_tagged_value-inl.h" 30#include "ecmascript/object_factory.h" 31#include "ecmascript/tests/test_helper.h" 32 33using namespace panda::ecmascript; 34namespace panda::test { 35class IcCompareOPTest : public testing::Test { 36public: 37 static void SetUpTestCase() 38 { 39 GTEST_LOG_(INFO) << "SetUpTestCase"; 40 } 41 42 static void TearDownTestCase() 43 { 44 GTEST_LOG_(INFO) << "TearDownCase"; 45 } 46 47 void SetUp() override 48 { 49 TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope); 50 } 51 52 void TearDown() override 53 { 54 TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope); 55 } 56 57 EcmaVM *ecmaVm {nullptr}; 58 EcmaHandleScope *scope {nullptr}; 59 JSThread *thread {nullptr}; 60}; 61 62HWTEST_F_L0(IcCompareOPTest, EqualWithIC) 63{ 64 ObjectFactory *factory = ecmaVm->GetFactory(); 65 66 JSHandle<JSTaggedValue> Str1 = JSHandle<JSTaggedValue>(factory->NewFromASCII("1")); 67 JSTaggedValue arg1(static_cast<uint32_t>(1)); 68 JSTaggedValue arg2(static_cast<double>(1.0)); 69 JSTaggedValue arg3(false); 70 JSTaggedValue arg4(true); 71 JSHandle<JSTaggedValue> arg1Handle(thread, arg1); 72 JSHandle<JSTaggedValue> arg2Handle(thread, arg2); 73 JSHandle<JSTaggedValue> arg3Handle(thread, arg3); 74 JSHandle<JSTaggedValue> arg4Handle(thread, arg4); 75 76 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv(); 77 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 78 79 JSHandle<JSFunction> boolean(env->GetBooleanFunction()); 80 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*boolean), 6); 81 ecmaRuntimeCallInfo->SetFunction(boolean.GetTaggedValue()); 82 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue()); 83 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1))); 84 85 JSTaggedValue booleanObj = builtins::BuiltinsBoolean::BooleanConstructor(ecmaRuntimeCallInfo); 86 JSHandle<JSTaggedValue> booleanObjHandle(thread, booleanObj); 87 88 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Eq(thread, arg1Handle.GetTaggedValue(), 89 arg2Handle.GetTaggedValue()); 90 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Eq(thread, Str1.GetTaggedValue(), arg1Handle.GetTaggedValue()); 91 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Eq(thread, Str1.GetTaggedValue(), arg3Handle.GetTaggedValue()); 92 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Eq(thread, Str1.GetTaggedValue(), arg4Handle.GetTaggedValue()); 93 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Eq(thread, booleanObjHandle.GetTaggedValue(), 94 arg4Handle.GetTaggedValue()); 95 JSTaggedValue resInSlowPath9 = SlowRuntimeStub::Eq(thread, JSTaggedValue::Undefined(), JSTaggedValue::Null()); 96 JSTaggedValue resInSlowPath10 = SlowRuntimeStub::Eq(thread, JSTaggedValue::Undefined(), JSTaggedValue::True()); 97 98 JSTaggedValue resInICPath1 = CompareOp::EqualWithIC(thread, arg1Handle.GetTaggedValue(), 99 arg2Handle.GetTaggedValue(), CompareOpType::NUMBER_NUMBER); 100 JSTaggedValue resInICPath2 = CompareOp::EqualWithIC(thread, Str1.GetTaggedValue(), 101 arg1Handle.GetTaggedValue(), CompareOpType::STRING_NUMBER); 102 JSTaggedValue resInICPath3 = CompareOp::EqualWithIC(thread, Str1.GetTaggedValue(), 103 arg3Handle.GetTaggedValue(), CompareOpType::STRING_BOOLEAN); 104 JSTaggedValue resInICPath4 = CompareOp::EqualWithIC(thread, Str1.GetTaggedValue(), 105 arg4Handle.GetTaggedValue(), CompareOpType::STRING_BOOLEAN); 106 JSTaggedValue resInICPath5 = CompareOp::EqualWithIC(thread, booleanObjHandle.GetTaggedValue(), 107 arg4Handle.GetTaggedValue(), CompareOpType::OBJ_BOOLEAN); 108 JSTaggedValue resInICPath9 = CompareOp::EqualWithIC(thread, JSTaggedValue::Undefined(), 109 JSTaggedValue::Null(), CompareOpType::UNDEFINED_NULL); 110 JSTaggedValue resInICPath10 = CompareOp::EqualWithIC(thread, JSTaggedValue::Undefined(), 111 JSTaggedValue::True(), CompareOpType::OTHER); 112 113 EXPECT_EQ(resInSlowPath1, resInICPath1); 114 EXPECT_EQ(resInSlowPath2, resInICPath2); 115 EXPECT_EQ(resInSlowPath3, resInICPath3); 116 EXPECT_EQ(resInSlowPath4, resInICPath4); 117 EXPECT_EQ(resInSlowPath5, resInICPath5); 118 EXPECT_EQ(resInSlowPath9, resInICPath9); 119 EXPECT_EQ(resInSlowPath10, resInICPath10); 120}; 121 122HWTEST_F_L0(IcCompareOPTest, NotEqualWithIC) 123{ 124 ObjectFactory *factory = ecmaVm->GetFactory(); 125 126 JSHandle<JSTaggedValue> Str1 = JSHandle<JSTaggedValue>(factory->NewFromASCII("1")); 127 JSTaggedValue arg1(static_cast<uint32_t>(1)); 128 JSTaggedValue arg2(static_cast<double>(2.0)); 129 JSTaggedValue arg3(false); 130 JSTaggedValue arg4(true); 131 JSHandle<JSTaggedValue> arg1Handle(thread, arg1); 132 JSHandle<JSTaggedValue> arg2Handle(thread, arg2); 133 JSHandle<JSTaggedValue> arg3Handle(thread, arg3); 134 JSHandle<JSTaggedValue> arg4Handle(thread, arg4); 135 136 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv(); 137 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 138 139 JSHandle<JSFunction> boolean(env->GetBooleanFunction()); 140 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*boolean), 6); 141 ecmaRuntimeCallInfo->SetFunction(boolean.GetTaggedValue()); 142 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue()); 143 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(123))); 144 145 JSTaggedValue booleanObj = builtins::BuiltinsBoolean::BooleanConstructor(ecmaRuntimeCallInfo); 146 JSHandle<JSTaggedValue> booleanObjHandle(thread, booleanObj); 147 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::NotEq(thread, arg1Handle.GetTaggedValue(), 148 arg2Handle.GetTaggedValue()); 149 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::NotEq(thread, Str1.GetTaggedValue(), 150 arg1Handle.GetTaggedValue()); 151 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::NotEq(thread, Str1.GetTaggedValue(), 152 arg3Handle.GetTaggedValue()); 153 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::NotEq(thread, Str1.GetTaggedValue(), 154 arg4Handle.GetTaggedValue()); 155 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::NotEq(thread, arg1Handle.GetTaggedValue(), 156 booleanObjHandle.GetTaggedValue()); 157 JSTaggedValue resInSlowPath9 = SlowRuntimeStub::NotEq(thread, JSTaggedValue::Undefined(), 158 JSTaggedValue::Null()); 159 JSTaggedValue resInSlowPath10 = SlowRuntimeStub::NotEq(thread, JSTaggedValue::Undefined(), 160 JSTaggedValue::True()); 161 162 JSTaggedValue resInICPath1 = CompareOp::NotEqualWithIC(thread, arg1Handle.GetTaggedValue(), 163 arg2Handle.GetTaggedValue(), 164 CompareOpType::NUMBER_NUMBER); 165 JSTaggedValue resInICPath2 = CompareOp::NotEqualWithIC(thread, Str1.GetTaggedValue(), 166 arg1Handle.GetTaggedValue(), CompareOpType::STRING_NUMBER); 167 JSTaggedValue resInICPath3 = CompareOp::NotEqualWithIC(thread, Str1.GetTaggedValue(), 168 arg3Handle.GetTaggedValue(), CompareOpType::STRING_BOOLEAN); 169 JSTaggedValue resInICPath4 = CompareOp::NotEqualWithIC(thread, Str1.GetTaggedValue(), 170 arg4Handle.GetTaggedValue(), CompareOpType::STRING_BOOLEAN); 171 JSTaggedValue resInICPath5 = CompareOp::NotEqualWithIC(thread, arg1Handle.GetTaggedValue(), 172 booleanObjHandle.GetTaggedValue(), 173 CompareOpType::NUMBER_OBJ); 174 JSTaggedValue resInICPath9 = CompareOp::NotEqualWithIC(thread, JSTaggedValue::Undefined(), 175 JSTaggedValue::Null(), CompareOpType::UNDEFINED_NULL); 176 JSTaggedValue resInICPath10 = CompareOp::NotEqualWithIC(thread, JSTaggedValue::Undefined(), 177 JSTaggedValue::True(), CompareOpType::OTHER); 178 179 EXPECT_EQ(resInSlowPath1, resInICPath1); 180 EXPECT_EQ(resInSlowPath2, resInICPath2); 181 EXPECT_EQ(resInSlowPath3, resInICPath3); 182 EXPECT_EQ(resInSlowPath4, resInICPath4); 183 EXPECT_EQ(resInSlowPath5, resInICPath5); 184 EXPECT_EQ(resInSlowPath9, resInICPath9); 185 EXPECT_EQ(resInSlowPath10, resInICPath10); 186}; 187 188 189HWTEST_F_L0(IcCompareOPTest, LessWithIC) 190{ 191 ObjectFactory *factory = ecmaVm->GetFactory(); 192 193 JSHandle<JSTaggedValue> Str1 = JSHandle<JSTaggedValue>(factory->NewFromASCII("0")); 194 JSTaggedValue arg1(static_cast<uint32_t>(1)); 195 JSTaggedValue arg2(static_cast<double>(0.5)); 196 JSTaggedValue arg3(false); 197 JSTaggedValue arg4(true); 198 JSHandle<JSTaggedValue> arg1Handle(thread, arg1); 199 JSHandle<JSTaggedValue> arg2Handle(thread, arg2); 200 JSHandle<JSTaggedValue> arg3Handle(thread, arg3); 201 JSHandle<JSTaggedValue> arg4Handle(thread, arg4); 202 203 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv(); 204 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 205 206 JSHandle<JSFunction> boolean(env->GetBooleanFunction()); 207 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*boolean), 6); 208 ecmaRuntimeCallInfo->SetFunction(boolean.GetTaggedValue()); 209 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue()); 210 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(123))); 211 212 JSTaggedValue booleanObj = builtins::BuiltinsBoolean::BooleanConstructor(ecmaRuntimeCallInfo); 213 JSHandle<JSTaggedValue> booleanObjHandle(thread, booleanObj); 214 215 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Less(thread, arg1Handle.GetTaggedValue(), 216 arg2Handle.GetTaggedValue()); 217 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Less(thread, Str1.GetTaggedValue(), 218 arg1Handle.GetTaggedValue()); 219 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Less(thread, Str1.GetTaggedValue(), 220 arg3Handle.GetTaggedValue()); 221 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Less(thread, Str1.GetTaggedValue(), 222 arg4Handle.GetTaggedValue()); 223 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Less(thread, arg1Handle.GetTaggedValue(), 224 booleanObjHandle.GetTaggedValue()); 225 JSTaggedValue resInSlowPath9 = SlowRuntimeStub::Less(thread, 226 JSTaggedValue::Undefined(), JSTaggedValue::Null()); 227 JSTaggedValue resInSlowPath10 = SlowRuntimeStub::Less(thread, 228 JSTaggedValue::Undefined(), JSTaggedValue::True()); 229 230 JSTaggedValue resInICPath1 = CompareOp::LessWithIC(thread, arg1Handle.GetTaggedValue(), 231 arg2Handle.GetTaggedValue(), CompareOpType::NUMBER_NUMBER); 232 JSTaggedValue resInICPath2 = CompareOp::LessWithIC(thread, Str1.GetTaggedValue(), 233 arg1Handle.GetTaggedValue(), CompareOpType::STRING_NUMBER); 234 JSTaggedValue resInICPath3 = CompareOp::LessWithIC(thread, Str1.GetTaggedValue(), 235 arg3Handle.GetTaggedValue(), CompareOpType::STRING_BOOLEAN); 236 JSTaggedValue resInICPath4 = CompareOp::LessWithIC(thread, Str1.GetTaggedValue(), 237 arg4Handle.GetTaggedValue(), CompareOpType::STRING_BOOLEAN); 238 JSTaggedValue resInICPath5 = CompareOp::LessWithIC(thread, arg1Handle.GetTaggedValue(), 239 booleanObjHandle.GetTaggedValue(), 240 CompareOpType::NUMBER_OBJ); 241 JSTaggedValue resInICPath9 = CompareOp::LessWithIC(thread, JSTaggedValue::Undefined(), 242 JSTaggedValue::Null(), CompareOpType::UNDEFINED_NULL); 243 JSTaggedValue resInICPath10 = CompareOp::LessWithIC(thread, JSTaggedValue::Undefined(), 244 JSTaggedValue::True(), CompareOpType::OTHER); 245 246 EXPECT_EQ(resInSlowPath1, resInICPath1); 247 EXPECT_EQ(resInSlowPath2, resInICPath2); 248 EXPECT_EQ(resInSlowPath3, resInICPath3); 249 EXPECT_EQ(resInSlowPath4, resInICPath4); 250 EXPECT_EQ(resInSlowPath5, resInICPath5); 251 EXPECT_EQ(resInSlowPath9, resInICPath9); 252 EXPECT_EQ(resInSlowPath10, resInICPath10); 253}; 254 255 256HWTEST_F_L0(IcCompareOPTest, LessEqWithIC) 257{ 258 ObjectFactory *factory = ecmaVm->GetFactory(); 259 260 JSHandle<JSTaggedValue> Str1 = JSHandle<JSTaggedValue>(factory->NewFromASCII("1")); 261 JSTaggedValue arg1(static_cast<uint32_t>(1)); 262 JSTaggedValue arg2(static_cast<double>(0.5)); 263 JSTaggedValue arg3(false); 264 JSTaggedValue arg4(true); 265 JSHandle<JSTaggedValue> arg1Handle(thread, arg1); 266 JSHandle<JSTaggedValue> arg2Handle(thread, arg2); 267 JSHandle<JSTaggedValue> arg3Handle(thread, arg3); 268 JSHandle<JSTaggedValue> arg4Handle(thread, arg4); 269 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv(); 270 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 271 272 JSHandle<JSFunction> boolean(env->GetBooleanFunction()); 273 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*boolean), 6); 274 ecmaRuntimeCallInfo->SetFunction(boolean.GetTaggedValue()); 275 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue()); 276 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(123))); 277 278 JSTaggedValue booleanObj = builtins::BuiltinsBoolean::BooleanConstructor(ecmaRuntimeCallInfo); 279 JSHandle<JSTaggedValue> booleanObjHandle(thread, booleanObj); 280 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::LessEq(thread, arg1Handle.GetTaggedValue(), 281 arg2Handle.GetTaggedValue()); 282 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::LessEq(thread, Str1.GetTaggedValue(), 283 arg1Handle.GetTaggedValue()); 284 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::LessEq(thread, Str1.GetTaggedValue(), 285 arg3Handle.GetTaggedValue()); 286 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::LessEq(thread, Str1.GetTaggedValue(), 287 arg4Handle.GetTaggedValue()); 288 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::LessEq(thread, arg1Handle.GetTaggedValue(), 289 booleanObjHandle.GetTaggedValue()); 290 JSTaggedValue resInSlowPath9 = SlowRuntimeStub::LessEq(thread, JSTaggedValue::Undefined(), 291 JSTaggedValue::Null()); 292 JSTaggedValue resInSlowPath10 = SlowRuntimeStub::LessEq(thread, JSTaggedValue::Undefined(), 293 JSTaggedValue::True()); 294 JSTaggedValue resInICPath1 = CompareOp::LessEqWithIC(thread, arg1Handle.GetTaggedValue(), 295 arg2Handle.GetTaggedValue(), 296 CompareOpType::NUMBER_NUMBER); 297 JSTaggedValue resInICPath2 = CompareOp::LessEqWithIC(thread, Str1.GetTaggedValue(), 298 arg1Handle.GetTaggedValue(), 299 CompareOpType::STRING_NUMBER); 300 JSTaggedValue resInICPath3 = CompareOp::LessEqWithIC(thread, Str1.GetTaggedValue(), 301 arg3Handle.GetTaggedValue(), 302 CompareOpType::STRING_BOOLEAN); 303 JSTaggedValue resInICPath4 = CompareOp::LessEqWithIC(thread, Str1.GetTaggedValue(), 304 arg4Handle.GetTaggedValue(), 305 CompareOpType::STRING_BOOLEAN); 306 JSTaggedValue resInICPath5 = CompareOp::LessEqWithIC(thread, 307 arg1Handle.GetTaggedValue(), 308 booleanObjHandle.GetTaggedValue(), 309 CompareOpType::NUMBER_OBJ); 310 JSTaggedValue resInICPath9 = CompareOp::LessEqWithIC(thread, JSTaggedValue::Undefined(), 311 JSTaggedValue::Null(), CompareOpType::UNDEFINED_NULL); 312 JSTaggedValue resInICPath10 = CompareOp::LessEqWithIC(thread, JSTaggedValue::Undefined(), 313 JSTaggedValue::True(), CompareOpType::OTHER); 314 315 EXPECT_EQ(resInSlowPath1, resInICPath1); 316 EXPECT_EQ(resInSlowPath2, resInICPath2); 317 EXPECT_EQ(resInSlowPath3, resInICPath3); 318 EXPECT_EQ(resInSlowPath4, resInICPath4); 319 EXPECT_EQ(resInSlowPath5, resInICPath5); 320 EXPECT_EQ(resInSlowPath9, resInICPath9); 321 EXPECT_EQ(resInSlowPath10, resInICPath10); 322}; 323 324 325HWTEST_F_L0(IcCompareOPTest, GreaterWithIC) 326{ 327 ObjectFactory *factory = ecmaVm->GetFactory(); 328 329 JSHandle<JSTaggedValue> Str1 = JSHandle<JSTaggedValue>(factory->NewFromASCII("1")); 330 JSTaggedValue arg1(static_cast<uint32_t>(1)); 331 JSTaggedValue arg2(static_cast<double>(1.0)); 332 JSTaggedValue arg3(false); 333 JSTaggedValue arg4(true); 334 JSHandle<JSTaggedValue> arg1Handle(thread, arg1); 335 JSHandle<JSTaggedValue> arg2Handle(thread, arg2); 336 JSHandle<JSTaggedValue> arg3Handle(thread, arg3); 337 JSHandle<JSTaggedValue> arg4Handle(thread, arg4); 338 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv(); 339 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 340 341 JSHandle<JSFunction> boolean(env->GetBooleanFunction()); 342 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*boolean), 6); 343 ecmaRuntimeCallInfo->SetFunction(boolean.GetTaggedValue()); 344 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue()); 345 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(1))); 346 347 JSTaggedValue booleanObj = builtins::BuiltinsBoolean::BooleanConstructor(ecmaRuntimeCallInfo); 348 JSHandle<JSTaggedValue> booleanObjHandle(thread, booleanObj); 349 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Greater(thread, arg1Handle.GetTaggedValue(), 350 arg2Handle.GetTaggedValue()); 351 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Greater(thread, Str1.GetTaggedValue(), 352 arg1Handle.GetTaggedValue()); 353 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Greater(thread, Str1.GetTaggedValue(), 354 arg3Handle.GetTaggedValue()); 355 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Greater(thread, Str1.GetTaggedValue(), 356 arg4Handle.GetTaggedValue()); 357 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Greater(thread, arg1Handle.GetTaggedValue(), 358 booleanObjHandle.GetTaggedValue()); 359 JSTaggedValue resInSlowPath9 = SlowRuntimeStub::Greater(thread, JSTaggedValue::Undefined(), 360 JSTaggedValue::Null()); 361 JSTaggedValue resInSlowPath10 = SlowRuntimeStub::Greater(thread, JSTaggedValue::Undefined(), 362 JSTaggedValue::True()); 363 364 JSTaggedValue resInICPath1 = CompareOp::GreaterWithIC(thread, arg1Handle.GetTaggedValue(), 365 arg2Handle.GetTaggedValue(), 366 CompareOpType::NUMBER_NUMBER); 367 JSTaggedValue resInICPath2 = CompareOp::GreaterWithIC(thread, Str1.GetTaggedValue(), 368 arg1Handle.GetTaggedValue(), 369 CompareOpType::STRING_NUMBER); 370 JSTaggedValue resInICPath3 = CompareOp::GreaterWithIC(thread, Str1.GetTaggedValue(), 371 arg3Handle.GetTaggedValue(), 372 CompareOpType::STRING_BOOLEAN); 373 JSTaggedValue resInICPath4 = CompareOp::GreaterWithIC(thread, Str1.GetTaggedValue(), 374 arg4Handle.GetTaggedValue(), 375 CompareOpType::STRING_BOOLEAN); 376 JSTaggedValue resInICPath5 = CompareOp::GreaterWithIC(thread, arg1Handle.GetTaggedValue(), 377 booleanObjHandle.GetTaggedValue(), 378 CompareOpType::NUMBER_OBJ); 379 JSTaggedValue resInICPath9 = CompareOp::GreaterWithIC(thread, JSTaggedValue::Undefined(), 380 JSTaggedValue::Null(), CompareOpType::UNDEFINED_NULL); 381 JSTaggedValue resInICPath10 = CompareOp::GreaterWithIC(thread, JSTaggedValue::Undefined(), 382 JSTaggedValue::True(), CompareOpType::OTHER); 383 384 EXPECT_EQ(resInSlowPath1, resInICPath1); 385 EXPECT_EQ(resInSlowPath2, resInICPath2); 386 EXPECT_EQ(resInSlowPath3, resInICPath3); 387 EXPECT_EQ(resInSlowPath4, resInICPath4); 388 EXPECT_EQ(resInSlowPath5, resInICPath5); 389 EXPECT_EQ(resInSlowPath9, resInICPath9); 390 EXPECT_EQ(resInSlowPath10, resInICPath10); 391}; 392 393 394HWTEST_F_L0(IcCompareOPTest, GreaterEqWithIC) 395{ 396 ObjectFactory *factory = ecmaVm->GetFactory(); 397 398 JSHandle<JSTaggedValue> Str1 = JSHandle<JSTaggedValue>(factory->NewFromASCII("1")); 399 JSTaggedValue arg1(static_cast<uint32_t>(1)); 400 JSTaggedValue arg2(static_cast<double>(1.0)); 401 JSTaggedValue arg3(false); 402 JSTaggedValue arg4(true); 403 JSHandle<JSTaggedValue> arg1Handle(thread, arg1); 404 JSHandle<JSTaggedValue> arg2Handle(thread, arg2); 405 JSHandle<JSTaggedValue> arg3Handle(thread, arg3); 406 JSHandle<JSTaggedValue> arg4Handle(thread, arg4); 407 408 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv(); 409 JSHandle<JSObject> globalObject(thread, env->GetGlobalObject()); 410 411 JSHandle<JSFunction> boolean(env->GetBooleanFunction()); 412 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*boolean), 6); 413 ecmaRuntimeCallInfo->SetFunction(boolean.GetTaggedValue()); 414 ecmaRuntimeCallInfo->SetThis(globalObject.GetTaggedValue()); 415 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(static_cast<int32_t>(0))); 416 417 JSTaggedValue booleanObj = builtins::BuiltinsBoolean::BooleanConstructor(ecmaRuntimeCallInfo); 418 JSHandle<JSTaggedValue> booleanObjHandle(thread, booleanObj); 419 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::GreaterEq(thread, arg1Handle.GetTaggedValue(), 420 arg2Handle.GetTaggedValue()); 421 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::GreaterEq(thread, Str1.GetTaggedValue(), 422 arg1Handle.GetTaggedValue()); 423 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::GreaterEq(thread, Str1.GetTaggedValue(), 424 arg3Handle.GetTaggedValue()); 425 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::GreaterEq(thread, Str1.GetTaggedValue(), 426 arg4Handle.GetTaggedValue()); 427 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::GreaterEq(thread, arg1Handle.GetTaggedValue(), 428 booleanObjHandle.GetTaggedValue()); 429 JSTaggedValue resInSlowPath9 = SlowRuntimeStub::GreaterEq(thread, JSTaggedValue::Undefined(), 430 JSTaggedValue::Null()); 431 JSTaggedValue resInSlowPath10 = SlowRuntimeStub::GreaterEq(thread, JSTaggedValue::Undefined(), 432 JSTaggedValue::True()); 433 434 JSTaggedValue resInICPath1 = CompareOp::GreaterEqWithIC(thread, arg1Handle.GetTaggedValue(), 435 arg2Handle.GetTaggedValue(), 436 CompareOpType::NUMBER_NUMBER); 437 JSTaggedValue resInICPath2 = CompareOp::GreaterEqWithIC(thread, Str1.GetTaggedValue(), 438 arg1Handle.GetTaggedValue(), 439 CompareOpType::STRING_NUMBER); 440 JSTaggedValue resInICPath3 = CompareOp::GreaterEqWithIC(thread, Str1.GetTaggedValue(), 441 arg3Handle.GetTaggedValue(), 442 CompareOpType::STRING_BOOLEAN); 443 JSTaggedValue resInICPath4 = CompareOp::GreaterEqWithIC(thread, Str1.GetTaggedValue(), 444 arg4Handle.GetTaggedValue(), 445 CompareOpType::STRING_BOOLEAN); 446 JSTaggedValue resInICPath5 = CompareOp::GreaterEqWithIC(thread, arg1Handle.GetTaggedValue(), 447 booleanObjHandle.GetTaggedValue(), 448 CompareOpType::NUMBER_OBJ); 449 JSTaggedValue resInICPath9 = CompareOp::GreaterEqWithIC(thread, JSTaggedValue::Undefined(), 450 JSTaggedValue::Null(), CompareOpType::UNDEFINED_NULL); 451 JSTaggedValue resInICPath10 = CompareOp::GreaterEqWithIC(thread, JSTaggedValue::Undefined(), 452 JSTaggedValue::True(), CompareOpType::OTHER); 453 454 EXPECT_EQ(resInSlowPath1, resInICPath1); 455 EXPECT_EQ(resInSlowPath2, resInICPath2); 456 EXPECT_EQ(resInSlowPath3, resInICPath3); 457 EXPECT_EQ(resInSlowPath4, resInICPath4); 458 EXPECT_EQ(resInSlowPath5, resInICPath5); 459 EXPECT_EQ(resInSlowPath9, resInICPath9); 460 EXPECT_EQ(resInSlowPath10, resInICPath10); 461}; 462} // namespace panda::test 463