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