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