1 /*
2 * Copyright (c) 2021-2024 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/ecma_vm.h"
19 #include "ecmascript/global_env_constants.h"
20 #include "ecmascript/global_env_constants-inl.h"
21 #include "ecmascript/ic/ic_binary_op.h"
22 #include "ecmascript/interpreter/slow_runtime_stub.h"
23 #include "ecmascript/object_factory.h"
24 #include "ecmascript/tests/test_helper.h"
25
26 using namespace panda::ecmascript;
27 namespace panda::test {
28 class ICBinaryOPTest : public testing::Test {
29 public:
SetUpTestCase()30 static void SetUpTestCase()
31 {
32 GTEST_LOG_(INFO) << "SetUpTestCase";
33 }
34
TearDownTestCase()35 static void TearDownTestCase()
36 {
37 GTEST_LOG_(INFO) << "TearDownCase";
38 }
39
40 void SetUp() override
41 {
42 TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope);
43 }
44
45 void TearDown() override
46 {
47 TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope);
48 }
49
50 EcmaHandleScope *scope {nullptr};
51 JSThread *thread {nullptr};
52 EcmaVM *ecmaVm = nullptr;
53 };
54
HWTEST_F_L0(ICBinaryOPTest, AddWithTSType)55 HWTEST_F_L0(ICBinaryOPTest, AddWithTSType)
56 {
57 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
58
59 JSHandle<EcmaString> Str1 = factory->NewFromASCII("AddTest");
60 JSHandle<EcmaString> Str2 = factory->NewFromASCII("IC");
61 JSHandle<JSObject> arg4 = factory->NewEmptyJSObject();
62 JSTaggedValue arg1Value(static_cast<uint32_t>(2));
63 JSTaggedValue arg2Value(static_cast<uint32_t>(3));
64 JSTaggedValue arg3Value(static_cast<double>(9.5561));
65 JSHandle<JSTaggedValue> arg1(thread, arg1Value);
66 JSHandle<JSTaggedValue> arg2(thread, arg2Value);
67 JSHandle<JSTaggedValue> arg3(thread, arg3Value);
68
69 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Add2(thread, arg1.GetTaggedValue(),
70 arg2.GetTaggedValue());
71 JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
72 JSTaggedValue resInICPath1 = ICBinaryOP::AddWithTSType(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue(),
73 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
74 EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
75
76 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Add2(thread, arg1.GetTaggedValue(),
77 arg3.GetTaggedValue());
78 JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
79 JSTaggedValue resInICPath2 = ICBinaryOP::AddWithTSType(thread, arg1.GetTaggedValue(), arg3.GetTaggedValue(),
80 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
81 EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
82
83 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Add2(thread, Str1.GetTaggedValue(),
84 Str2.GetTaggedValue());
85 JSHandle<EcmaString> slowHandle3(thread, reinterpret_cast<EcmaString *>(resInSlowPath3.GetRawData()));
86 JSTaggedValue resInICPath3 = ICBinaryOP::AddWithTSType(thread, Str1.GetTaggedValue(), Str2.GetTaggedValue(),
87 JSTaggedValue(static_cast<int>(BinaryType::STRING)));
88 ASSERT_TRUE(resInICPath3.IsString());
89 EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle3, JSHandle<EcmaString>(thread, resInICPath3)), 0);
90
91 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Add2(thread, JSTaggedValue::Undefined(),
92 arg2.GetTaggedValue());
93 JSHandle<JSTaggedValue> slowHandle4(thread, resInSlowPath4);
94 JSTaggedValue resInICPath4 = ICBinaryOP::AddWithTSType(thread, JSTaggedValue::Undefined(),
95 arg2.GetTaggedValue(),
96 JSTaggedValue(static_cast<int>(BinaryType::NUMBER_GEN)));
97 EXPECT_EQ(slowHandle4.GetTaggedValue(), resInICPath4);
98
99 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Add2(thread, arg3.GetTaggedValue(),
100 Str1.GetTaggedValue());
101 JSHandle<EcmaString> slowHandle5(thread, reinterpret_cast<EcmaString *>(resInSlowPath5.GetRawData()));
102 JSTaggedValue resInICPath5 = ICBinaryOP::AddWithTSType(thread, arg3.GetTaggedValue(),
103 Str1.GetTaggedValue(),
104 JSTaggedValue(static_cast<int>(BinaryType::STRING_GEN)));
105 ASSERT_TRUE(resInICPath5.IsString());
106 EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle5, JSHandle<EcmaString>(thread, resInICPath5)), 0);
107
108 JSTaggedValue resInSlowPath6 = SlowRuntimeStub::Add2(thread, Str1.GetTaggedValue(),
109 JSTaggedValue::Null());
110 JSHandle<EcmaString> slowHandle6(thread, reinterpret_cast<EcmaString *>(resInSlowPath6.GetRawData()));
111 JSTaggedValue resInICPath6 = ICBinaryOP::AddWithTSType(thread, Str1.GetTaggedValue(), JSTaggedValue::Null(),
112 JSTaggedValue(static_cast<int>(BinaryType::STRING_GEN)));
113 ASSERT_TRUE(resInICPath6.IsString());
114 EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle6, JSHandle<EcmaString>(thread, resInICPath6)), 0);
115
116 JSTaggedValue resInSlowPath7 = SlowRuntimeStub::Add2(thread, arg1.GetTaggedValue(),
117 JSTaggedValue::True());
118 JSHandle<JSTaggedValue> slowHandle7(thread, resInSlowPath7);
119 JSTaggedValue resInICPath7 = ICBinaryOP::AddWithTSType(thread, arg1.GetTaggedValue(), JSTaggedValue::True(),
120 JSTaggedValue(static_cast<int>(BinaryType::NUMBER_GEN)));
121 EXPECT_EQ(slowHandle7.GetTaggedValue(), resInICPath7);
122
123 JSTaggedValue resInSlowPath8 = SlowRuntimeStub::Add2(thread, arg4.GetTaggedValue(),
124 JSTaggedValue::Null());
125 JSHandle<EcmaString> slowHandle8(thread, reinterpret_cast<EcmaString *>(resInSlowPath8.GetRawData()));
126 JSTaggedValue resInICPath8 = ICBinaryOP::AddWithTSType(thread, arg4.GetTaggedValue(), JSTaggedValue::Null(),
127 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
128 ASSERT_TRUE(resInICPath8.IsString());
129 EXPECT_EQ(EcmaStringAccessor::Compare(ecmaVm, slowHandle8, JSHandle<EcmaString>(thread, resInICPath8)), 0);
130 };
131
HWTEST_F_L0(ICBinaryOPTest, SubWithTSType)132 HWTEST_F_L0(ICBinaryOPTest, SubWithTSType)
133 {
134 JSTaggedValue arg1Value(static_cast<uint32_t>(-2));
135 JSTaggedValue arg2Value(static_cast<uint32_t>(INT32_MAX-1));
136 JSTaggedValue arg3Value(static_cast<double>(9.5561));
137 JSHandle<JSTaggedValue> arg1(thread, arg1Value);
138 JSHandle<JSTaggedValue> arg2(thread, arg2Value);
139 JSHandle<JSTaggedValue> arg3(thread, arg3Value);
140
141 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Sub2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
142 JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
143 JSTaggedValue resInICPath1 = ICBinaryOP::SubWithTSType(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue(),
144 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
145 EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
146
147 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Sub2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
148 JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
149 JSTaggedValue resInICPath2 = ICBinaryOP::SubWithTSType(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue(),
150 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
151 EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
152
153 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Sub2(thread, arg1.GetTaggedValue(), JSTaggedValue::True());
154 JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
155 JSTaggedValue resInICPath3 = ICBinaryOP::SubWithTSType(thread, arg1.GetTaggedValue(), JSTaggedValue::True(),
156 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
157 EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
158 };
159
HWTEST_F_L0(ICBinaryOPTest, MulWithTSType)160 HWTEST_F_L0(ICBinaryOPTest, MulWithTSType)
161 {
162 JSTaggedValue arg1Value(static_cast<double>(28.5));
163 JSTaggedValue arg2Value(static_cast<uint16_t>(354));
164 JSTaggedValue arg3Value(static_cast<double>(9.5561));
165 JSHandle<JSTaggedValue> arg1(thread, arg1Value);
166 JSHandle<JSTaggedValue> arg2(thread, arg2Value);
167 JSHandle<JSTaggedValue> arg3(thread, arg3Value);
168
169 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Mul2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
170 JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
171 JSTaggedValue resInICPath1 = ICBinaryOP::MulWithTSType(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue(),
172 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
173 EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
174
175 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Mul2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
176 JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
177 JSTaggedValue resInICPath2 = ICBinaryOP::MulWithTSType(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue(),
178 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
179 EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
180
181 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Mul2(thread, arg1.GetTaggedValue(), JSTaggedValue::True());
182 JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
183 JSTaggedValue resInICPath3 = ICBinaryOP::MulWithTSType(thread, arg1.GetTaggedValue(), JSTaggedValue::True(),
184 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
185 EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
186
187 };
188
HWTEST_F_L0(ICBinaryOPTest, DivWithTSType)189 HWTEST_F_L0(ICBinaryOPTest, DivWithTSType)
190 {
191 JSTaggedValue arg1Value(static_cast<uint32_t>(2));
192 JSTaggedValue arg2Value(static_cast<uint32_t>(39884));
193 JSTaggedValue arg3Value(static_cast<uint32_t>(0));
194 JSTaggedValue arg4Value(static_cast<double>(934.5561));
195 JSHandle<JSTaggedValue> arg1(thread, arg1Value);
196 JSHandle<JSTaggedValue> arg2(thread, arg2Value);
197 JSHandle<JSTaggedValue> arg3(thread, arg3Value);
198 JSHandle<JSTaggedValue> arg4(thread, arg4Value);
199
200 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Div2(thread, arg3.GetTaggedValue(), arg2.GetTaggedValue());
201 JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
202 JSTaggedValue resInICPath1 = ICBinaryOP::DivWithTSType(thread, arg3.GetTaggedValue(), arg2.GetTaggedValue(),
203 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
204 EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
205
206 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Div2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
207 JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
208 JSTaggedValue resInICPath2 = ICBinaryOP::DivWithTSType(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue(),
209 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
210 EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
211
212 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Div2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
213 JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
214 JSTaggedValue resInICPath3 = ICBinaryOP::DivWithTSType(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue(),
215 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
216 EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
217
218 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Div2(thread, arg2.GetTaggedValue(), JSTaggedValue::True());
219 JSHandle<JSTaggedValue> slowHandle4(thread, resInSlowPath4);
220 JSTaggedValue resInICPath4 = ICBinaryOP::DivWithTSType(thread, arg2.GetTaggedValue(), JSTaggedValue::True(),
221 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
222 EXPECT_EQ(slowHandle4.GetTaggedValue(), resInICPath4);
223
224 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Div2(thread, arg4.GetTaggedValue(), JSTaggedValue::False());
225 JSHandle<JSTaggedValue> slowHandle5(thread, resInSlowPath5);
226 JSTaggedValue resInICPath5 = ICBinaryOP::DivWithTSType(thread, arg4.GetTaggedValue(),
227 JSTaggedValue::False(),
228 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
229 EXPECT_EQ(slowHandle5.GetTaggedValue(), resInICPath5);
230 };
231
HWTEST_F_L0(ICBinaryOPTest, ModWithTSType)232 HWTEST_F_L0(ICBinaryOPTest, ModWithTSType)
233 {
234 JSTaggedValue arg1Value(static_cast<uint32_t>(2));
235 JSTaggedValue arg2Value(static_cast<uint32_t>(39884));
236 JSTaggedValue arg3Value(static_cast<uint32_t>(0));
237 JSTaggedValue arg4Value(static_cast<double>(934.5561));
238 JSHandle<JSTaggedValue> arg1(thread, arg1Value);
239 JSHandle<JSTaggedValue> arg2(thread, arg2Value);
240 JSHandle<JSTaggedValue> arg3(thread, arg3Value);
241 JSHandle<JSTaggedValue> arg4(thread, arg4Value);
242
243 JSTaggedValue resInSlowPath1 = SlowRuntimeStub::Mod2(thread, arg3.GetTaggedValue(), arg2.GetTaggedValue());
244 JSHandle<JSTaggedValue> slowHandle1(thread, resInSlowPath1);
245 JSTaggedValue resInICPath1 = ICBinaryOP::ModWithTSType(thread, arg3.GetTaggedValue(), arg2.GetTaggedValue(),
246 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
247 EXPECT_EQ(slowHandle1.GetTaggedValue(), resInICPath1);
248
249 JSTaggedValue resInSlowPath2 = SlowRuntimeStub::Mod2(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue());
250 JSHandle<JSTaggedValue> slowHandle2(thread, resInSlowPath2);
251 JSTaggedValue resInICPath2 = ICBinaryOP::ModWithTSType(thread, arg2.GetTaggedValue(), arg3.GetTaggedValue(),
252 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
253 EXPECT_EQ(slowHandle2.GetTaggedValue(), resInICPath2);
254
255 JSTaggedValue resInSlowPath3 = SlowRuntimeStub::Mod2(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue());
256 JSHandle<JSTaggedValue> slowHandle3(thread, resInSlowPath3);
257 JSTaggedValue resInICPath3 = ICBinaryOP::ModWithTSType(thread, arg1.GetTaggedValue(), arg2.GetTaggedValue(),
258 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
259 EXPECT_EQ(slowHandle3.GetTaggedValue(), resInICPath3);
260
261
262 JSTaggedValue resInSlowPath4 = SlowRuntimeStub::Mod2(thread, arg2.GetTaggedValue(), JSTaggedValue::True());
263 JSHandle<JSTaggedValue> slowHandle4(thread, resInSlowPath4);
264 JSTaggedValue resInICPath4 = ICBinaryOP::ModWithTSType(thread, arg2.GetTaggedValue(), JSTaggedValue::True(),
265 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
266 EXPECT_EQ(slowHandle4.GetTaggedValue(), resInICPath4);
267
268
269 JSTaggedValue resInSlowPath5 = SlowRuntimeStub::Mod2(thread, arg4.GetTaggedValue(), JSTaggedValue::False());
270 JSHandle<JSTaggedValue> slowHandle5(thread, resInSlowPath5);
271 JSTaggedValue resInICPath5 = ICBinaryOP::ModWithTSType(thread, arg4.GetTaggedValue(),
272 JSTaggedValue::False(),
273 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
274 EXPECT_EQ(slowHandle5.GetTaggedValue(), resInICPath5);
275 };
276
HWTEST_F_L0(ICBinaryOPTest, ShlWithTSType)277 HWTEST_F_L0(ICBinaryOPTest, ShlWithTSType)
278 {
279 ObjectFactory *factory = ecmaVm->GetFactory();
280
281 JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
282 JSTaggedValue arg1(static_cast<uint32_t>(286));
283 JSTaggedValue arg3(static_cast<uint32_t>(5));
284
285 JSTaggedValue resInICPath1 = ICBinaryOP::ShlWithTSType(thread, arg1, arg3,
286 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
287 EXPECT_EQ(JSTaggedValue(9152), resInICPath1);
288
289 JSTaggedValue resInICPath2 = ICBinaryOP::ShlWithTSType(thread, Str1.GetTaggedValue(), arg3,
290 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
291 EXPECT_EQ(JSTaggedValue(7200), resInICPath2);
292 };
293
HWTEST_F_L0(ICBinaryOPTest, ShrWithTSType)294 HWTEST_F_L0(ICBinaryOPTest, ShrWithTSType)
295 {
296 ObjectFactory *factory = ecmaVm->GetFactory();
297
298 JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
299 JSTaggedValue arg1(static_cast<uint32_t>(286));
300 JSTaggedValue arg3(static_cast<uint32_t>(5));
301
302 JSTaggedValue resInICPath1 = ICBinaryOP::ShrWithTSType(thread, arg1, arg3,
303 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
304 EXPECT_EQ(JSTaggedValue(8), resInICPath1);
305
306 JSTaggedValue resInICPath2 = ICBinaryOP::ShrWithTSType(thread, Str1.GetTaggedValue(), arg3,
307 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
308 EXPECT_EQ(JSTaggedValue(7), resInICPath2);
309 };
310
HWTEST_F_L0(ICBinaryOPTest, AshrWithTSType)311 HWTEST_F_L0(ICBinaryOPTest, AshrWithTSType)
312 {
313 ObjectFactory *factory = ecmaVm->GetFactory();
314
315 JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
316 JSTaggedValue arg1(static_cast<uint32_t>(286));
317 JSTaggedValue arg2(static_cast<uint32_t>(-286));
318 JSTaggedValue arg3(static_cast<uint32_t>(5));
319
320 JSTaggedValue resInICPath1 = ICBinaryOP::AshrWithTSType(thread, arg1, arg3,
321 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
322 EXPECT_EQ(JSTaggedValue(8), resInICPath1);
323
324 JSTaggedValue resInICPath3 = ICBinaryOP::AshrWithTSType(thread, arg2, arg3,
325 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
326 EXPECT_EQ(JSTaggedValue(134217719), resInICPath3);
327
328 JSTaggedValue resInICPath2 = ICBinaryOP::AshrWithTSType(thread, Str1.GetTaggedValue(), arg3,
329 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
330 EXPECT_EQ(JSTaggedValue(7), resInICPath2);
331
332 };
HWTEST_F_L0(ICBinaryOPTest, AndWithTSType)333 HWTEST_F_L0(ICBinaryOPTest, AndWithTSType)
334 {
335 ObjectFactory *factory = ecmaVm->GetFactory();
336
337 JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
338 JSTaggedValue arg1(static_cast<uint32_t>(286));
339 JSTaggedValue arg3(static_cast<uint32_t>(541));
340
341 JSTaggedValue resInICPath1 = ICBinaryOP::AndWithTSType(thread, arg1, arg3,
342 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
343 EXPECT_EQ(JSTaggedValue(28), resInICPath1);
344
345 JSTaggedValue resInICPath2 = ICBinaryOP::AndWithTSType(thread, Str1.GetTaggedValue(), arg3,
346 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
347 EXPECT_EQ(JSTaggedValue(1), resInICPath2);
348 };
HWTEST_F_L0(ICBinaryOPTest, OrWithTSType)349 HWTEST_F_L0(ICBinaryOPTest, OrWithTSType)
350 {
351 ObjectFactory *factory = ecmaVm->GetFactory();
352
353 JSHandle<EcmaString> Str1 = factory->NewFromASCII("225");
354 JSTaggedValue arg1(static_cast<uint32_t>(286));
355 JSTaggedValue arg3(static_cast<uint32_t>(523));
356
357 JSTaggedValue resInICPath1 = ICBinaryOP::OrWithTSType(thread, arg1, arg3,
358 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
359 EXPECT_EQ(JSTaggedValue(799), resInICPath1);
360
361 JSTaggedValue resInICPath2 = ICBinaryOP::OrWithTSType(thread, Str1.GetTaggedValue(), arg3,
362 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
363 EXPECT_EQ(JSTaggedValue(747), resInICPath2);
364 };
HWTEST_F_L0(ICBinaryOPTest, XorWithTSType)365 HWTEST_F_L0(ICBinaryOPTest, XorWithTSType)
366 {
367 ObjectFactory *factory = ecmaVm->GetFactory();
368
369 JSHandle<EcmaString> Str1 = factory->NewFromASCII("1225");
370 JSTaggedValue arg1(static_cast<uint32_t>(286));
371 JSTaggedValue arg3(static_cast<uint32_t>(523));
372
373 JSTaggedValue resInICPath1 = ICBinaryOP::XorWithTSType(thread, arg1, arg3,
374 JSTaggedValue(static_cast<int>(BinaryType::NUMBER)));
375 EXPECT_EQ(JSTaggedValue(789), resInICPath1);
376
377 JSTaggedValue resInICPath2 = ICBinaryOP::XorWithTSType(thread, Str1.GetTaggedValue(), arg3,
378 JSTaggedValue(static_cast<int>(BinaryType::GENERIC)));
379 EXPECT_EQ(JSTaggedValue(1730), resInICPath2);
380 };
381 } // namespace panda::test
382