OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 TestMoveSmi(masm, &exit, 10, Smi::FromInt(-256)); | 189 TestMoveSmi(masm, &exit, 10, Smi::FromInt(-256)); |
190 TestMoveSmi(masm, &exit, 11, Smi::FromInt(-257)); | 190 TestMoveSmi(masm, &exit, 11, Smi::FromInt(-257)); |
191 TestMoveSmi(masm, &exit, 12, Smi::FromInt(Smi::kMinValue)); | 191 TestMoveSmi(masm, &exit, 12, Smi::FromInt(Smi::kMinValue)); |
192 | 192 |
193 __ xorq(rax, rax); // Success. | 193 __ xorq(rax, rax); // Success. |
194 __ bind(&exit); | 194 __ bind(&exit); |
195 ExitCode(masm); | 195 ExitCode(masm); |
196 __ ret(0); | 196 __ ret(0); |
197 | 197 |
198 CodeDesc desc; | 198 CodeDesc desc; |
199 masm->GetCode(&desc); | 199 masm->GetCode(isolate, &desc); |
200 // Call the function from C++. | 200 // Call the function from C++. |
201 int result = FUNCTION_CAST<F0>(buffer)(); | 201 int result = FUNCTION_CAST<F0>(buffer)(); |
202 CHECK_EQ(0, result); | 202 CHECK_EQ(0, result); |
203 } | 203 } |
204 | 204 |
205 | 205 |
206 void TestSmiCompare(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 206 void TestSmiCompare(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
207 __ Move(rcx, Smi::FromInt(x)); | 207 __ Move(rcx, Smi::FromInt(x)); |
208 __ movq(r8, rcx); | 208 __ movq(r8, rcx); |
209 __ Move(rdx, Smi::FromInt(y)); | 209 __ Move(rdx, Smi::FromInt(y)); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 TestSmiCompare(masm, &exit, 0x110, Smi::kMinValue, Smi::kMaxValue); | 283 TestSmiCompare(masm, &exit, 0x110, Smi::kMinValue, Smi::kMaxValue); |
284 TestSmiCompare(masm, &exit, 0x120, Smi::kMaxValue, Smi::kMinValue); | 284 TestSmiCompare(masm, &exit, 0x120, Smi::kMaxValue, Smi::kMinValue); |
285 TestSmiCompare(masm, &exit, 0x130, Smi::kMaxValue, Smi::kMaxValue); | 285 TestSmiCompare(masm, &exit, 0x130, Smi::kMaxValue, Smi::kMaxValue); |
286 | 286 |
287 __ xorq(rax, rax); // Success. | 287 __ xorq(rax, rax); // Success. |
288 __ bind(&exit); | 288 __ bind(&exit); |
289 ExitCode(masm); | 289 ExitCode(masm); |
290 __ ret(0); | 290 __ ret(0); |
291 | 291 |
292 CodeDesc desc; | 292 CodeDesc desc; |
293 masm->GetCode(&desc); | 293 masm->GetCode(isolate, &desc); |
294 // Call the function from C++. | 294 // Call the function from C++. |
295 int result = FUNCTION_CAST<F0>(buffer)(); | 295 int result = FUNCTION_CAST<F0>(buffer)(); |
296 CHECK_EQ(0, result); | 296 CHECK_EQ(0, result); |
297 } | 297 } |
298 | 298 |
299 | 299 |
300 | 300 |
301 TEST(Integer32ToSmi) { | 301 TEST(Integer32ToSmi) { |
302 // Allocate an executable page of memory. | 302 // Allocate an executable page of memory. |
303 size_t actual_size; | 303 size_t actual_size; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 __ cmpq(r8, rdx); | 385 __ cmpq(r8, rdx); |
386 __ j(not_equal, &exit); | 386 __ j(not_equal, &exit); |
387 | 387 |
388 | 388 |
389 __ xorq(rax, rax); // Success. | 389 __ xorq(rax, rax); // Success. |
390 __ bind(&exit); | 390 __ bind(&exit); |
391 ExitCode(masm); | 391 ExitCode(masm); |
392 __ ret(0); | 392 __ ret(0); |
393 | 393 |
394 CodeDesc desc; | 394 CodeDesc desc; |
395 masm->GetCode(&desc); | 395 masm->GetCode(isolate, &desc); |
396 // Call the function from C++. | 396 // Call the function from C++. |
397 int result = FUNCTION_CAST<F0>(buffer)(); | 397 int result = FUNCTION_CAST<F0>(buffer)(); |
398 CHECK_EQ(0, result); | 398 CHECK_EQ(0, result); |
399 } | 399 } |
400 | 400 |
401 | 401 |
402 void TestI64PlusConstantToSmi(MacroAssembler* masm, | 402 void TestI64PlusConstantToSmi(MacroAssembler* masm, |
403 Label* exit, | 403 Label* exit, |
404 int id, | 404 int id, |
405 int64_t x, | 405 int64_t x, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 TestI64PlusConstantToSmi(masm, &exit, 0xA0, Smi::kMinValue, 0); | 454 TestI64PlusConstantToSmi(masm, &exit, 0xA0, Smi::kMinValue, 0); |
455 TestI64PlusConstantToSmi(masm, &exit, 0xB0, Smi::kMaxValue, 0); | 455 TestI64PlusConstantToSmi(masm, &exit, 0xB0, Smi::kMaxValue, 0); |
456 TestI64PlusConstantToSmi(masm, &exit, 0xC0, twice_max, Smi::kMinValue); | 456 TestI64PlusConstantToSmi(masm, &exit, 0xC0, twice_max, Smi::kMinValue); |
457 | 457 |
458 __ xorq(rax, rax); // Success. | 458 __ xorq(rax, rax); // Success. |
459 __ bind(&exit); | 459 __ bind(&exit); |
460 ExitCode(masm); | 460 ExitCode(masm); |
461 __ ret(0); | 461 __ ret(0); |
462 | 462 |
463 CodeDesc desc; | 463 CodeDesc desc; |
464 masm->GetCode(&desc); | 464 masm->GetCode(isolate, &desc); |
465 // Call the function from C++. | 465 // Call the function from C++. |
466 int result = FUNCTION_CAST<F0>(buffer)(); | 466 int result = FUNCTION_CAST<F0>(buffer)(); |
467 CHECK_EQ(0, result); | 467 CHECK_EQ(0, result); |
468 } | 468 } |
469 | 469 |
470 | 470 |
471 TEST(SmiCheck) { | 471 TEST(SmiCheck) { |
472 // Allocate an executable page of memory. | 472 // Allocate an executable page of memory. |
473 size_t actual_size; | 473 size_t actual_size; |
474 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 474 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 __ j(NegateCondition(cond), &exit); | 627 __ j(NegateCondition(cond), &exit); |
628 | 628 |
629 // Success | 629 // Success |
630 __ xorq(rax, rax); | 630 __ xorq(rax, rax); |
631 | 631 |
632 __ bind(&exit); | 632 __ bind(&exit); |
633 ExitCode(masm); | 633 ExitCode(masm); |
634 __ ret(0); | 634 __ ret(0); |
635 | 635 |
636 CodeDesc desc; | 636 CodeDesc desc; |
637 masm->GetCode(&desc); | 637 masm->GetCode(isolate, &desc); |
638 // Call the function from C++. | 638 // Call the function from C++. |
639 int result = FUNCTION_CAST<F0>(buffer)(); | 639 int result = FUNCTION_CAST<F0>(buffer)(); |
640 CHECK_EQ(0, result); | 640 CHECK_EQ(0, result); |
641 } | 641 } |
642 | 642 |
643 | 643 |
644 | 644 |
645 void TestSmiNeg(MacroAssembler* masm, Label* exit, int id, int x) { | 645 void TestSmiNeg(MacroAssembler* masm, Label* exit, int id, int x) { |
646 __ Move(rcx, Smi::FromInt(x)); | 646 __ Move(rcx, Smi::FromInt(x)); |
647 __ movq(r11, rcx); | 647 __ movq(r11, rcx); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 TestSmiNeg(masm, &exit, 0x60, Smi::kMinValue); | 711 TestSmiNeg(masm, &exit, 0x60, Smi::kMinValue); |
712 TestSmiNeg(masm, &exit, 0x70, Smi::kMaxValue); | 712 TestSmiNeg(masm, &exit, 0x70, Smi::kMaxValue); |
713 TestSmiNeg(masm, &exit, 0x80, -Smi::kMaxValue); | 713 TestSmiNeg(masm, &exit, 0x80, -Smi::kMaxValue); |
714 | 714 |
715 __ xorq(rax, rax); // Success. | 715 __ xorq(rax, rax); // Success. |
716 __ bind(&exit); | 716 __ bind(&exit); |
717 ExitCode(masm); | 717 ExitCode(masm); |
718 __ ret(0); | 718 __ ret(0); |
719 | 719 |
720 CodeDesc desc; | 720 CodeDesc desc; |
721 masm->GetCode(&desc); | 721 masm->GetCode(isolate, &desc); |
722 // Call the function from C++. | 722 // Call the function from C++. |
723 int result = FUNCTION_CAST<F0>(buffer)(); | 723 int result = FUNCTION_CAST<F0>(buffer)(); |
724 CHECK_EQ(0, result); | 724 CHECK_EQ(0, result); |
725 } | 725 } |
726 | 726 |
727 | 727 |
728 static void SmiAddTest(MacroAssembler* masm, | 728 static void SmiAddTest(MacroAssembler* masm, |
729 Label* exit, | 729 Label* exit, |
730 int id, | 730 int id, |
731 int first, | 731 int first, |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 SmiAddOverflowTest(masm, &exit, 0xD0, -2); | 932 SmiAddOverflowTest(masm, &exit, 0xD0, -2); |
933 SmiAddOverflowTest(masm, &exit, 0xE0, -42000); | 933 SmiAddOverflowTest(masm, &exit, 0xE0, -42000); |
934 SmiAddOverflowTest(masm, &exit, 0xF0, Smi::kMinValue); | 934 SmiAddOverflowTest(masm, &exit, 0xF0, Smi::kMinValue); |
935 | 935 |
936 __ xorq(rax, rax); // Success. | 936 __ xorq(rax, rax); // Success. |
937 __ bind(&exit); | 937 __ bind(&exit); |
938 ExitCode(masm); | 938 ExitCode(masm); |
939 __ ret(0); | 939 __ ret(0); |
940 | 940 |
941 CodeDesc desc; | 941 CodeDesc desc; |
942 masm->GetCode(&desc); | 942 masm->GetCode(isolate, &desc); |
943 // Call the function from C++. | 943 // Call the function from C++. |
944 int result = FUNCTION_CAST<F0>(buffer)(); | 944 int result = FUNCTION_CAST<F0>(buffer)(); |
945 CHECK_EQ(0, result); | 945 CHECK_EQ(0, result); |
946 } | 946 } |
947 | 947 |
948 | 948 |
949 static void SmiSubTest(MacroAssembler* masm, | 949 static void SmiSubTest(MacroAssembler* masm, |
950 Label* exit, | 950 Label* exit, |
951 int id, | 951 int id, |
952 int first, | 952 int first, |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 SmiSubOverflowTest(masm, &exit, 0xE0, -42000); | 1149 SmiSubOverflowTest(masm, &exit, 0xE0, -42000); |
1150 SmiSubOverflowTest(masm, &exit, 0xF0, Smi::kMinValue); | 1150 SmiSubOverflowTest(masm, &exit, 0xF0, Smi::kMinValue); |
1151 SmiSubOverflowTest(masm, &exit, 0x100, 0); | 1151 SmiSubOverflowTest(masm, &exit, 0x100, 0); |
1152 | 1152 |
1153 __ xorq(rax, rax); // Success. | 1153 __ xorq(rax, rax); // Success. |
1154 __ bind(&exit); | 1154 __ bind(&exit); |
1155 ExitCode(masm); | 1155 ExitCode(masm); |
1156 __ ret(0); | 1156 __ ret(0); |
1157 | 1157 |
1158 CodeDesc desc; | 1158 CodeDesc desc; |
1159 masm->GetCode(&desc); | 1159 masm->GetCode(isolate, &desc); |
1160 // Call the function from C++. | 1160 // Call the function from C++. |
1161 int result = FUNCTION_CAST<F0>(buffer)(); | 1161 int result = FUNCTION_CAST<F0>(buffer)(); |
1162 CHECK_EQ(0, result); | 1162 CHECK_EQ(0, result); |
1163 } | 1163 } |
1164 | 1164 |
1165 | 1165 |
1166 | 1166 |
1167 void TestSmiMul(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1167 void TestSmiMul(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1168 int64_t result = static_cast<int64_t>(x) * static_cast<int64_t>(y); | 1168 int64_t result = static_cast<int64_t>(x) * static_cast<int64_t>(y); |
1169 bool negative_zero = (result == 0) && (x < 0 || y < 0); | 1169 bool negative_zero = (result == 0) && (x < 0 || y < 0); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 TestSmiMul(masm, &exit, 0xc0, (Smi::kMaxValue / 2) + 1, 2); | 1235 TestSmiMul(masm, &exit, 0xc0, (Smi::kMaxValue / 2) + 1, 2); |
1236 TestSmiMul(masm, &exit, 0xd0, (Smi::kMinValue / 2), 2); | 1236 TestSmiMul(masm, &exit, 0xd0, (Smi::kMinValue / 2), 2); |
1237 TestSmiMul(masm, &exit, 0xe0, (Smi::kMinValue / 2) - 1, 2); | 1237 TestSmiMul(masm, &exit, 0xe0, (Smi::kMinValue / 2) - 1, 2); |
1238 | 1238 |
1239 __ xorq(rax, rax); // Success. | 1239 __ xorq(rax, rax); // Success. |
1240 __ bind(&exit); | 1240 __ bind(&exit); |
1241 ExitCode(masm); | 1241 ExitCode(masm); |
1242 __ ret(0); | 1242 __ ret(0); |
1243 | 1243 |
1244 CodeDesc desc; | 1244 CodeDesc desc; |
1245 masm->GetCode(&desc); | 1245 masm->GetCode(isolate, &desc); |
1246 // Call the function from C++. | 1246 // Call the function from C++. |
1247 int result = FUNCTION_CAST<F0>(buffer)(); | 1247 int result = FUNCTION_CAST<F0>(buffer)(); |
1248 CHECK_EQ(0, result); | 1248 CHECK_EQ(0, result); |
1249 } | 1249 } |
1250 | 1250 |
1251 | 1251 |
1252 void TestSmiDiv(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1252 void TestSmiDiv(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1253 bool division_by_zero = (y == 0); | 1253 bool division_by_zero = (y == 0); |
1254 bool negative_zero = (x == 0 && y < 0); | 1254 bool negative_zero = (x == 0 && y < 0); |
1255 #if V8_TARGET_ARCH_X64 | 1255 #if V8_TARGET_ARCH_X64 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1350 | 1350 |
1351 __ xorq(r15, r15); // Success. | 1351 __ xorq(r15, r15); // Success. |
1352 __ bind(&exit); | 1352 __ bind(&exit); |
1353 __ movq(rax, r15); | 1353 __ movq(rax, r15); |
1354 __ popq(r15); | 1354 __ popq(r15); |
1355 __ popq(r14); | 1355 __ popq(r14); |
1356 ExitCode(masm); | 1356 ExitCode(masm); |
1357 __ ret(0); | 1357 __ ret(0); |
1358 | 1358 |
1359 CodeDesc desc; | 1359 CodeDesc desc; |
1360 masm->GetCode(&desc); | 1360 masm->GetCode(isolate, &desc); |
1361 // Call the function from C++. | 1361 // Call the function from C++. |
1362 int result = FUNCTION_CAST<F0>(buffer)(); | 1362 int result = FUNCTION_CAST<F0>(buffer)(); |
1363 CHECK_EQ(0, result); | 1363 CHECK_EQ(0, result); |
1364 } | 1364 } |
1365 | 1365 |
1366 | 1366 |
1367 void TestSmiMod(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1367 void TestSmiMod(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1368 bool division_by_zero = (y == 0); | 1368 bool division_by_zero = (y == 0); |
1369 bool division_overflow = (x == Smi::kMinValue) && (y == -1); | 1369 bool division_overflow = (x == Smi::kMinValue) && (y == -1); |
1370 bool fraction = !division_by_zero && !division_overflow && ((x % y) != 0); | 1370 bool fraction = !division_by_zero && !division_overflow && ((x % y) != 0); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1458 | 1458 |
1459 __ xorq(r15, r15); // Success. | 1459 __ xorq(r15, r15); // Success. |
1460 __ bind(&exit); | 1460 __ bind(&exit); |
1461 __ movq(rax, r15); | 1461 __ movq(rax, r15); |
1462 __ popq(r15); | 1462 __ popq(r15); |
1463 __ popq(r14); | 1463 __ popq(r14); |
1464 ExitCode(masm); | 1464 ExitCode(masm); |
1465 __ ret(0); | 1465 __ ret(0); |
1466 | 1466 |
1467 CodeDesc desc; | 1467 CodeDesc desc; |
1468 masm->GetCode(&desc); | 1468 masm->GetCode(isolate, &desc); |
1469 // Call the function from C++. | 1469 // Call the function from C++. |
1470 int result = FUNCTION_CAST<F0>(buffer)(); | 1470 int result = FUNCTION_CAST<F0>(buffer)(); |
1471 CHECK_EQ(0, result); | 1471 CHECK_EQ(0, result); |
1472 } | 1472 } |
1473 | 1473 |
1474 | 1474 |
1475 void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) { | 1475 void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) { |
1476 __ movl(rax, Immediate(id)); | 1476 __ movl(rax, Immediate(id)); |
1477 | 1477 |
1478 for (int i = 0; i < 8; i++) { | 1478 for (int i = 0; i < 8; i++) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1533 TestSmiIndex(masm, &exit, 0x30, 100); | 1533 TestSmiIndex(masm, &exit, 0x30, 100); |
1534 TestSmiIndex(masm, &exit, 0x40, 1000); | 1534 TestSmiIndex(masm, &exit, 0x40, 1000); |
1535 TestSmiIndex(masm, &exit, 0x50, Smi::kMaxValue); | 1535 TestSmiIndex(masm, &exit, 0x50, Smi::kMaxValue); |
1536 | 1536 |
1537 __ xorq(rax, rax); // Success. | 1537 __ xorq(rax, rax); // Success. |
1538 __ bind(&exit); | 1538 __ bind(&exit); |
1539 ExitCode(masm); | 1539 ExitCode(masm); |
1540 __ ret(0); | 1540 __ ret(0); |
1541 | 1541 |
1542 CodeDesc desc; | 1542 CodeDesc desc; |
1543 masm->GetCode(&desc); | 1543 masm->GetCode(isolate, &desc); |
1544 // Call the function from C++. | 1544 // Call the function from C++. |
1545 int result = FUNCTION_CAST<F0>(buffer)(); | 1545 int result = FUNCTION_CAST<F0>(buffer)(); |
1546 CHECK_EQ(0, result); | 1546 CHECK_EQ(0, result); |
1547 } | 1547 } |
1548 | 1548 |
1549 | 1549 |
1550 void TestSelectNonSmi(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1550 void TestSelectNonSmi(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1551 __ movl(rax, Immediate(id)); | 1551 __ movl(rax, Immediate(id)); |
1552 __ Move(rcx, Smi::FromInt(x)); | 1552 __ Move(rcx, Smi::FromInt(x)); |
1553 __ Move(rdx, Smi::FromInt(y)); | 1553 __ Move(rdx, Smi::FromInt(y)); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1604 TestSelectNonSmi(masm, &exit, 0x70, 1, 1); | 1604 TestSelectNonSmi(masm, &exit, 0x70, 1, 1); |
1605 TestSelectNonSmi(masm, &exit, 0x80, Smi::kMinValue, Smi::kMaxValue); | 1605 TestSelectNonSmi(masm, &exit, 0x80, Smi::kMinValue, Smi::kMaxValue); |
1606 TestSelectNonSmi(masm, &exit, 0x90, Smi::kMinValue, Smi::kMinValue); | 1606 TestSelectNonSmi(masm, &exit, 0x90, Smi::kMinValue, Smi::kMinValue); |
1607 | 1607 |
1608 __ xorq(rax, rax); // Success. | 1608 __ xorq(rax, rax); // Success. |
1609 __ bind(&exit); | 1609 __ bind(&exit); |
1610 ExitCode(masm); | 1610 ExitCode(masm); |
1611 __ ret(0); | 1611 __ ret(0); |
1612 | 1612 |
1613 CodeDesc desc; | 1613 CodeDesc desc; |
1614 masm->GetCode(&desc); | 1614 masm->GetCode(isolate, &desc); |
1615 // Call the function from C++. | 1615 // Call the function from C++. |
1616 int result = FUNCTION_CAST<F0>(buffer)(); | 1616 int result = FUNCTION_CAST<F0>(buffer)(); |
1617 CHECK_EQ(0, result); | 1617 CHECK_EQ(0, result); |
1618 } | 1618 } |
1619 | 1619 |
1620 | 1620 |
1621 void TestSmiAnd(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1621 void TestSmiAnd(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1622 int result = x & y; | 1622 int result = x & y; |
1623 | 1623 |
1624 __ movl(rax, Immediate(id)); | 1624 __ movl(rax, Immediate(id)); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1683 TestSmiAnd(masm, &exit, 0x90, Smi::kMinValue, Smi::kMinValue); | 1683 TestSmiAnd(masm, &exit, 0x90, Smi::kMinValue, Smi::kMinValue); |
1684 TestSmiAnd(masm, &exit, 0xA0, Smi::kMinValue, -1); | 1684 TestSmiAnd(masm, &exit, 0xA0, Smi::kMinValue, -1); |
1685 TestSmiAnd(masm, &exit, 0xB0, Smi::kMinValue, -1); | 1685 TestSmiAnd(masm, &exit, 0xB0, Smi::kMinValue, -1); |
1686 | 1686 |
1687 __ xorq(rax, rax); // Success. | 1687 __ xorq(rax, rax); // Success. |
1688 __ bind(&exit); | 1688 __ bind(&exit); |
1689 ExitCode(masm); | 1689 ExitCode(masm); |
1690 __ ret(0); | 1690 __ ret(0); |
1691 | 1691 |
1692 CodeDesc desc; | 1692 CodeDesc desc; |
1693 masm->GetCode(&desc); | 1693 masm->GetCode(isolate, &desc); |
1694 // Call the function from C++. | 1694 // Call the function from C++. |
1695 int result = FUNCTION_CAST<F0>(buffer)(); | 1695 int result = FUNCTION_CAST<F0>(buffer)(); |
1696 CHECK_EQ(0, result); | 1696 CHECK_EQ(0, result); |
1697 } | 1697 } |
1698 | 1698 |
1699 | 1699 |
1700 void TestSmiOr(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1700 void TestSmiOr(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1701 int result = x | y; | 1701 int result = x | y; |
1702 | 1702 |
1703 __ movl(rax, Immediate(id)); | 1703 __ movl(rax, Immediate(id)); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 TestSmiOr(masm, &exit, 0xB0, 0x05555555, 0x01234567); | 1764 TestSmiOr(masm, &exit, 0xB0, 0x05555555, 0x01234567); |
1765 TestSmiOr(masm, &exit, 0xC0, 0x05555555, 0x0fedcba9); | 1765 TestSmiOr(masm, &exit, 0xC0, 0x05555555, 0x0fedcba9); |
1766 TestSmiOr(masm, &exit, 0xD0, Smi::kMinValue, -1); | 1766 TestSmiOr(masm, &exit, 0xD0, Smi::kMinValue, -1); |
1767 | 1767 |
1768 __ xorq(rax, rax); // Success. | 1768 __ xorq(rax, rax); // Success. |
1769 __ bind(&exit); | 1769 __ bind(&exit); |
1770 ExitCode(masm); | 1770 ExitCode(masm); |
1771 __ ret(0); | 1771 __ ret(0); |
1772 | 1772 |
1773 CodeDesc desc; | 1773 CodeDesc desc; |
1774 masm->GetCode(&desc); | 1774 masm->GetCode(isolate, &desc); |
1775 // Call the function from C++. | 1775 // Call the function from C++. |
1776 int result = FUNCTION_CAST<F0>(buffer)(); | 1776 int result = FUNCTION_CAST<F0>(buffer)(); |
1777 CHECK_EQ(0, result); | 1777 CHECK_EQ(0, result); |
1778 } | 1778 } |
1779 | 1779 |
1780 | 1780 |
1781 void TestSmiXor(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1781 void TestSmiXor(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
1782 int result = x ^ y; | 1782 int result = x ^ y; |
1783 | 1783 |
1784 __ movl(rax, Immediate(id)); | 1784 __ movl(rax, Immediate(id)); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1845 TestSmiXor(masm, &exit, 0xB0, 0x5555555, 0x01234567); | 1845 TestSmiXor(masm, &exit, 0xB0, 0x5555555, 0x01234567); |
1846 TestSmiXor(masm, &exit, 0xC0, 0x5555555, 0x0fedcba9); | 1846 TestSmiXor(masm, &exit, 0xC0, 0x5555555, 0x0fedcba9); |
1847 TestSmiXor(masm, &exit, 0xD0, Smi::kMinValue, -1); | 1847 TestSmiXor(masm, &exit, 0xD0, Smi::kMinValue, -1); |
1848 | 1848 |
1849 __ xorq(rax, rax); // Success. | 1849 __ xorq(rax, rax); // Success. |
1850 __ bind(&exit); | 1850 __ bind(&exit); |
1851 ExitCode(masm); | 1851 ExitCode(masm); |
1852 __ ret(0); | 1852 __ ret(0); |
1853 | 1853 |
1854 CodeDesc desc; | 1854 CodeDesc desc; |
1855 masm->GetCode(&desc); | 1855 masm->GetCode(isolate, &desc); |
1856 // Call the function from C++. | 1856 // Call the function from C++. |
1857 int result = FUNCTION_CAST<F0>(buffer)(); | 1857 int result = FUNCTION_CAST<F0>(buffer)(); |
1858 CHECK_EQ(0, result); | 1858 CHECK_EQ(0, result); |
1859 } | 1859 } |
1860 | 1860 |
1861 | 1861 |
1862 void TestSmiNot(MacroAssembler* masm, Label* exit, int id, int x) { | 1862 void TestSmiNot(MacroAssembler* masm, Label* exit, int id, int x) { |
1863 int result = ~x; | 1863 int result = ~x; |
1864 __ movl(rax, Immediate(id)); | 1864 __ movl(rax, Immediate(id)); |
1865 | 1865 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1905 TestSmiNot(masm, &exit, 0x60, Smi::kMinValue); | 1905 TestSmiNot(masm, &exit, 0x60, Smi::kMinValue); |
1906 TestSmiNot(masm, &exit, 0x70, Smi::kMaxValue); | 1906 TestSmiNot(masm, &exit, 0x70, Smi::kMaxValue); |
1907 TestSmiNot(masm, &exit, 0x80, 0x05555555); | 1907 TestSmiNot(masm, &exit, 0x80, 0x05555555); |
1908 | 1908 |
1909 __ xorq(rax, rax); // Success. | 1909 __ xorq(rax, rax); // Success. |
1910 __ bind(&exit); | 1910 __ bind(&exit); |
1911 ExitCode(masm); | 1911 ExitCode(masm); |
1912 __ ret(0); | 1912 __ ret(0); |
1913 | 1913 |
1914 CodeDesc desc; | 1914 CodeDesc desc; |
1915 masm->GetCode(&desc); | 1915 masm->GetCode(isolate, &desc); |
1916 // Call the function from C++. | 1916 // Call the function from C++. |
1917 int result = FUNCTION_CAST<F0>(buffer)(); | 1917 int result = FUNCTION_CAST<F0>(buffer)(); |
1918 CHECK_EQ(0, result); | 1918 CHECK_EQ(0, result); |
1919 } | 1919 } |
1920 | 1920 |
1921 | 1921 |
1922 void TestSmiShiftLeft(MacroAssembler* masm, Label* exit, int id, int x) { | 1922 void TestSmiShiftLeft(MacroAssembler* masm, Label* exit, int id, int x) { |
1923 const int shifts[] = { 0, 1, 7, 24, kSmiValueSize - 1}; | 1923 const int shifts[] = { 0, 1, 7, 24, kSmiValueSize - 1}; |
1924 const int kNumShifts = 5; | 1924 const int kNumShifts = 5; |
1925 __ movl(rax, Immediate(id)); | 1925 __ movl(rax, Immediate(id)); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 TestSmiShiftLeft(masm, &exit, 0x110, Smi::kMaxValue); | 1998 TestSmiShiftLeft(masm, &exit, 0x110, Smi::kMaxValue); |
1999 TestSmiShiftLeft(masm, &exit, 0x150, Smi::kMinValue); | 1999 TestSmiShiftLeft(masm, &exit, 0x150, Smi::kMinValue); |
2000 TestSmiShiftLeft(masm, &exit, 0x190, -1); | 2000 TestSmiShiftLeft(masm, &exit, 0x190, -1); |
2001 | 2001 |
2002 __ xorq(rax, rax); // Success. | 2002 __ xorq(rax, rax); // Success. |
2003 __ bind(&exit); | 2003 __ bind(&exit); |
2004 ExitCode(masm); | 2004 ExitCode(masm); |
2005 __ ret(0); | 2005 __ ret(0); |
2006 | 2006 |
2007 CodeDesc desc; | 2007 CodeDesc desc; |
2008 masm->GetCode(&desc); | 2008 masm->GetCode(isolate, &desc); |
2009 // Call the function from C++. | 2009 // Call the function from C++. |
2010 int result = FUNCTION_CAST<F0>(buffer)(); | 2010 int result = FUNCTION_CAST<F0>(buffer)(); |
2011 CHECK_EQ(0, result); | 2011 CHECK_EQ(0, result); |
2012 } | 2012 } |
2013 | 2013 |
2014 | 2014 |
2015 void TestSmiShiftLogicalRight(MacroAssembler* masm, | 2015 void TestSmiShiftLogicalRight(MacroAssembler* masm, |
2016 Label* exit, | 2016 Label* exit, |
2017 int id, | 2017 int id, |
2018 int x) { | 2018 int x) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 TestSmiShiftLogicalRight(masm, &exit, 0x90, Smi::kMaxValue); | 2102 TestSmiShiftLogicalRight(masm, &exit, 0x90, Smi::kMaxValue); |
2103 TestSmiShiftLogicalRight(masm, &exit, 0xB0, Smi::kMinValue); | 2103 TestSmiShiftLogicalRight(masm, &exit, 0xB0, Smi::kMinValue); |
2104 TestSmiShiftLogicalRight(masm, &exit, 0xD0, -1); | 2104 TestSmiShiftLogicalRight(masm, &exit, 0xD0, -1); |
2105 | 2105 |
2106 __ xorq(rax, rax); // Success. | 2106 __ xorq(rax, rax); // Success. |
2107 __ bind(&exit); | 2107 __ bind(&exit); |
2108 ExitCode(masm); | 2108 ExitCode(masm); |
2109 __ ret(0); | 2109 __ ret(0); |
2110 | 2110 |
2111 CodeDesc desc; | 2111 CodeDesc desc; |
2112 masm->GetCode(&desc); | 2112 masm->GetCode(isolate, &desc); |
2113 // Call the function from C++. | 2113 // Call the function from C++. |
2114 int result = FUNCTION_CAST<F0>(buffer)(); | 2114 int result = FUNCTION_CAST<F0>(buffer)(); |
2115 CHECK_EQ(0, result); | 2115 CHECK_EQ(0, result); |
2116 } | 2116 } |
2117 | 2117 |
2118 | 2118 |
2119 void TestSmiShiftArithmeticRight(MacroAssembler* masm, | 2119 void TestSmiShiftArithmeticRight(MacroAssembler* masm, |
2120 Label* exit, | 2120 Label* exit, |
2121 int id, | 2121 int id, |
2122 int x) { | 2122 int x) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2169 TestSmiShiftArithmeticRight(masm, &exit, 0x50, Smi::kMaxValue); | 2169 TestSmiShiftArithmeticRight(masm, &exit, 0x50, Smi::kMaxValue); |
2170 TestSmiShiftArithmeticRight(masm, &exit, 0x60, Smi::kMinValue); | 2170 TestSmiShiftArithmeticRight(masm, &exit, 0x60, Smi::kMinValue); |
2171 TestSmiShiftArithmeticRight(masm, &exit, 0x70, -1); | 2171 TestSmiShiftArithmeticRight(masm, &exit, 0x70, -1); |
2172 | 2172 |
2173 __ xorq(rax, rax); // Success. | 2173 __ xorq(rax, rax); // Success. |
2174 __ bind(&exit); | 2174 __ bind(&exit); |
2175 ExitCode(masm); | 2175 ExitCode(masm); |
2176 __ ret(0); | 2176 __ ret(0); |
2177 | 2177 |
2178 CodeDesc desc; | 2178 CodeDesc desc; |
2179 masm->GetCode(&desc); | 2179 masm->GetCode(isolate, &desc); |
2180 // Call the function from C++. | 2180 // Call the function from C++. |
2181 int result = FUNCTION_CAST<F0>(buffer)(); | 2181 int result = FUNCTION_CAST<F0>(buffer)(); |
2182 CHECK_EQ(0, result); | 2182 CHECK_EQ(0, result); |
2183 } | 2183 } |
2184 | 2184 |
2185 | 2185 |
2186 void TestPositiveSmiPowerUp(MacroAssembler* masm, Label* exit, int id, int x) { | 2186 void TestPositiveSmiPowerUp(MacroAssembler* masm, Label* exit, int id, int x) { |
2187 CHECK(x >= 0); | 2187 CHECK(x >= 0); |
2188 int powers[] = { 0, 1, 2, 3, 8, 16, 24, 31 }; | 2188 int powers[] = { 0, 1, 2, 3, 8, 16, 24, 31 }; |
2189 int power_count = 8; | 2189 int power_count = 8; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2233 TestPositiveSmiPowerUp(masm, &exit, 0x100, 65535); | 2233 TestPositiveSmiPowerUp(masm, &exit, 0x100, 65535); |
2234 TestPositiveSmiPowerUp(masm, &exit, 0x120, 65536); | 2234 TestPositiveSmiPowerUp(masm, &exit, 0x120, 65536); |
2235 TestPositiveSmiPowerUp(masm, &exit, 0x140, Smi::kMaxValue); | 2235 TestPositiveSmiPowerUp(masm, &exit, 0x140, Smi::kMaxValue); |
2236 | 2236 |
2237 __ xorq(rax, rax); // Success. | 2237 __ xorq(rax, rax); // Success. |
2238 __ bind(&exit); | 2238 __ bind(&exit); |
2239 ExitCode(masm); | 2239 ExitCode(masm); |
2240 __ ret(0); | 2240 __ ret(0); |
2241 | 2241 |
2242 CodeDesc desc; | 2242 CodeDesc desc; |
2243 masm->GetCode(&desc); | 2243 masm->GetCode(isolate, &desc); |
2244 // Call the function from C++. | 2244 // Call the function from C++. |
2245 int result = FUNCTION_CAST<F0>(buffer)(); | 2245 int result = FUNCTION_CAST<F0>(buffer)(); |
2246 CHECK_EQ(0, result); | 2246 CHECK_EQ(0, result); |
2247 } | 2247 } |
2248 | 2248 |
2249 | 2249 |
2250 TEST(OperandOffset) { | 2250 TEST(OperandOffset) { |
2251 uint32_t data[256]; | 2251 uint32_t data[256]; |
2252 for (uint32_t i = 0; i < 256; i++) { data[i] = i * 0x01010101; } | 2252 for (uint32_t i = 0; i < 256; i++) { data[i] = i * 0x01010101; } |
2253 | 2253 |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2587 __ leaq(rsp, Operand(rbp, kPointerSize)); | 2587 __ leaq(rsp, Operand(rbp, kPointerSize)); |
2588 __ popq(rbp); | 2588 __ popq(rbp); |
2589 __ popq(rbx); | 2589 __ popq(rbx); |
2590 __ popq(r14); | 2590 __ popq(r14); |
2591 __ popq(r13); | 2591 __ popq(r13); |
2592 ExitCode(masm); | 2592 ExitCode(masm); |
2593 __ ret(0); | 2593 __ ret(0); |
2594 | 2594 |
2595 | 2595 |
2596 CodeDesc desc; | 2596 CodeDesc desc; |
2597 masm->GetCode(&desc); | 2597 masm->GetCode(isolate, &desc); |
2598 // Call the function from C++. | 2598 // Call the function from C++. |
2599 int result = FUNCTION_CAST<F0>(buffer)(); | 2599 int result = FUNCTION_CAST<F0>(buffer)(); |
2600 CHECK_EQ(0, result); | 2600 CHECK_EQ(0, result); |
2601 } | 2601 } |
2602 | 2602 |
2603 | 2603 |
2604 TEST(LoadAndStoreWithRepresentation) { | 2604 TEST(LoadAndStoreWithRepresentation) { |
2605 // Allocate an executable page of memory. | 2605 // Allocate an executable page of memory. |
2606 size_t actual_size; | 2606 size_t actual_size; |
2607 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( | 2607 byte* buffer = static_cast<byte*>(v8::base::OS::Allocate( |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2735 __ cmpq(rcx, rdx); | 2735 __ cmpq(rcx, rdx); |
2736 __ j(not_equal, &exit); | 2736 __ j(not_equal, &exit); |
2737 | 2737 |
2738 __ xorq(rax, rax); // Success. | 2738 __ xorq(rax, rax); // Success. |
2739 __ bind(&exit); | 2739 __ bind(&exit); |
2740 __ addq(rsp, Immediate(1 * kPointerSize)); | 2740 __ addq(rsp, Immediate(1 * kPointerSize)); |
2741 ExitCode(masm); | 2741 ExitCode(masm); |
2742 __ ret(0); | 2742 __ ret(0); |
2743 | 2743 |
2744 CodeDesc desc; | 2744 CodeDesc desc; |
2745 masm->GetCode(&desc); | 2745 masm->GetCode(isolate, &desc); |
2746 // Call the function from C++. | 2746 // Call the function from C++. |
2747 int result = FUNCTION_CAST<F0>(buffer)(); | 2747 int result = FUNCTION_CAST<F0>(buffer)(); |
2748 CHECK_EQ(0, result); | 2748 CHECK_EQ(0, result); |
2749 } | 2749 } |
2750 | 2750 |
2751 void TestFloat32x4Abs(MacroAssembler* masm, Label* exit, float x, float y, | 2751 void TestFloat32x4Abs(MacroAssembler* masm, Label* exit, float x, float y, |
2752 float z, float w) { | 2752 float z, float w) { |
2753 __ subq(rsp, Immediate(kSimd128Size)); | 2753 __ subq(rsp, Immediate(kSimd128Size)); |
2754 | 2754 |
2755 __ Move(xmm1, x); | 2755 __ Move(xmm1, x); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2890 TestFloat32x4Neg(masm, &exit, 1.5, -1.5, 0.5, -0.5); | 2890 TestFloat32x4Neg(masm, &exit, 1.5, -1.5, 0.5, -0.5); |
2891 TestFloat64x2Abs(masm, &exit, 1.75, -1.75); | 2891 TestFloat64x2Abs(masm, &exit, 1.75, -1.75); |
2892 TestFloat64x2Neg(masm, &exit, 1.75, -1.75); | 2892 TestFloat64x2Neg(masm, &exit, 1.75, -1.75); |
2893 | 2893 |
2894 __ xorq(rax, rax); // Success. | 2894 __ xorq(rax, rax); // Success. |
2895 __ bind(&exit); | 2895 __ bind(&exit); |
2896 ExitCode(masm); | 2896 ExitCode(masm); |
2897 __ ret(0); | 2897 __ ret(0); |
2898 | 2898 |
2899 CodeDesc desc; | 2899 CodeDesc desc; |
2900 masm->GetCode(&desc); | 2900 masm->GetCode(isolate, &desc); |
2901 // Call the function from C++. | 2901 // Call the function from C++. |
2902 int result = FUNCTION_CAST<F0>(buffer)(); | 2902 int result = FUNCTION_CAST<F0>(buffer)(); |
2903 CHECK_EQ(0, result); | 2903 CHECK_EQ(0, result); |
2904 } | 2904 } |
2905 | 2905 |
2906 #undef __ | 2906 #undef __ |
OLD | NEW |