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