| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 EXPECT(test != NULL); | 630 EXPECT(test != NULL); |
| 631 typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor); | 631 typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor); |
| 632 EXPECT_EQ(0x1000400000da8LL, | 632 EXPECT_EQ(0x1000400000da8LL, |
| 633 EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(), | 633 EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(), |
| 634 0x12345678, 0x1234)); | 634 0x12345678, 0x1234)); |
| 635 } | 635 } |
| 636 | 636 |
| 637 | 637 |
| 638 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) { | 638 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) { |
| 639 __ Push(R4); | 639 __ Push(R4); |
| 640 __ Mov(IP, R0); | 640 __ mov(IP, ShifterOperand(R0)); |
| 641 __ mul(R4, R2, R1); | 641 __ mul(R4, R2, R1); |
| 642 __ umull(R0, R1, R2, IP); | 642 __ umull(R0, R1, R2, IP); |
| 643 __ mla(R2, IP, R3, R4); | 643 __ mla(R2, IP, R3, R4); |
| 644 __ add(R1, R2, ShifterOperand(R1)); | 644 __ add(R1, R2, ShifterOperand(R1)); |
| 645 __ Pop(R4); | 645 __ Pop(R4); |
| 646 __ bx(LR); | 646 __ bx(LR); |
| 647 } | 647 } |
| 648 | 648 |
| 649 | 649 |
| 650 ASSEMBLER_TEST_RUN(Multiply64To64, test) { | 650 ASSEMBLER_TEST_RUN(Multiply64To64, test) { |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 | 929 |
| 930 | 930 |
| 931 ASSEMBLER_TEST_RUN(Ldrh1, test) { | 931 ASSEMBLER_TEST_RUN(Ldrh1, test) { |
| 932 EXPECT(test != NULL); | 932 EXPECT(test != NULL); |
| 933 typedef int (*Tst)(); | 933 typedef int (*Tst)(); |
| 934 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 934 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 935 } | 935 } |
| 936 | 936 |
| 937 | 937 |
| 938 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) { | 938 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) { |
| 939 __ Mov(IP, SP); | 939 __ mov(IP, ShifterOperand(SP)); |
| 940 __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex)); | 940 __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex)); |
| 941 __ strd(R0, Address(IP, (-kWordSize * 28))); | 941 __ strd(R0, Address(IP, (-kWordSize * 28))); |
| 942 __ ldrd(R2, Address(IP, (-kWordSize * 28))); | 942 __ ldrd(R2, Address(IP, (-kWordSize * 28))); |
| 943 __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex)); | 943 __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex)); |
| 944 __ sub(R0, R0, ShifterOperand(R2)); | 944 __ sub(R0, R0, ShifterOperand(R2)); |
| 945 __ add(R1, R1, ShifterOperand(R3)); | 945 __ add(R1, R1, ShifterOperand(R3)); |
| 946 __ bx(LR); | 946 __ bx(LR); |
| 947 } | 947 } |
| 948 | 948 |
| 949 | 949 |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1416 typedef int (*Tst)(); | 1416 typedef int (*Tst)(); |
| 1417 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1417 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 | 1420 |
| 1421 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { | 1421 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { |
| 1422 if (CPUFeatures::integer_division_supported()) { | 1422 if (CPUFeatures::integer_division_supported()) { |
| 1423 __ mov(R0, ShifterOperand(27)); | 1423 __ mov(R0, ShifterOperand(27)); |
| 1424 __ mov(R1, ShifterOperand(9)); | 1424 __ mov(R1, ShifterOperand(9)); |
| 1425 __ udiv(R2, R0, R1); | 1425 __ udiv(R2, R0, R1); |
| 1426 __ Mov(R0, R2); | 1426 __ mov(R0, ShifterOperand(R2)); |
| 1427 } else { | 1427 } else { |
| 1428 __ mov(R0, ShifterOperand(3)); | 1428 __ mov(R0, ShifterOperand(3)); |
| 1429 } | 1429 } |
| 1430 __ bx(LR); | 1430 __ bx(LR); |
| 1431 } | 1431 } |
| 1432 | 1432 |
| 1433 | 1433 |
| 1434 ASSEMBLER_TEST_RUN(Udiv, test) { | 1434 ASSEMBLER_TEST_RUN(Udiv, test) { |
| 1435 EXPECT(test != NULL); | 1435 EXPECT(test != NULL); |
| 1436 typedef int (*Tst)(); | 1436 typedef int (*Tst)(); |
| 1437 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1437 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1438 } | 1438 } |
| 1439 | 1439 |
| 1440 | 1440 |
| 1441 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { | 1441 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { |
| 1442 if (CPUFeatures::integer_division_supported()) { | 1442 if (CPUFeatures::integer_division_supported()) { |
| 1443 __ mov(R0, ShifterOperand(27)); | 1443 __ mov(R0, ShifterOperand(27)); |
| 1444 __ LoadImmediate(R1, -9); | 1444 __ LoadImmediate(R1, -9); |
| 1445 __ sdiv(R2, R0, R1); | 1445 __ sdiv(R2, R0, R1); |
| 1446 __ Mov(R0, R2); | 1446 __ mov(R0, ShifterOperand(R2)); |
| 1447 } else { | 1447 } else { |
| 1448 __ LoadImmediate(R0, -3); | 1448 __ LoadImmediate(R0, -3); |
| 1449 } | 1449 } |
| 1450 __ bx(LR); | 1450 __ bx(LR); |
| 1451 } | 1451 } |
| 1452 | 1452 |
| 1453 | 1453 |
| 1454 ASSEMBLER_TEST_RUN(Sdiv, test) { | 1454 ASSEMBLER_TEST_RUN(Sdiv, test) { |
| 1455 EXPECT(test != NULL); | 1455 EXPECT(test != NULL); |
| 1456 typedef int (*Tst)(); | 1456 typedef int (*Tst)(); |
| 1457 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1457 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1458 } | 1458 } |
| 1459 | 1459 |
| 1460 | 1460 |
| 1461 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { | 1461 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { |
| 1462 if (CPUFeatures::integer_division_supported()) { | 1462 if (CPUFeatures::integer_division_supported()) { |
| 1463 __ mov(R0, ShifterOperand(27)); | 1463 __ mov(R0, ShifterOperand(27)); |
| 1464 __ mov(R1, ShifterOperand(0)); | 1464 __ mov(R1, ShifterOperand(0)); |
| 1465 __ udiv(R2, R0, R1); | 1465 __ udiv(R2, R0, R1); |
| 1466 __ Mov(R0, R2); | 1466 __ mov(R0, ShifterOperand(R2)); |
| 1467 } else { | 1467 } else { |
| 1468 __ LoadImmediate(R0, 0); | 1468 __ LoadImmediate(R0, 0); |
| 1469 } | 1469 } |
| 1470 __ bx(LR); | 1470 __ bx(LR); |
| 1471 } | 1471 } |
| 1472 | 1472 |
| 1473 | 1473 |
| 1474 ASSEMBLER_TEST_RUN(Udiv_zero, test) { | 1474 ASSEMBLER_TEST_RUN(Udiv_zero, test) { |
| 1475 EXPECT(test != NULL); | 1475 EXPECT(test != NULL); |
| 1476 typedef int (*Tst)(); | 1476 typedef int (*Tst)(); |
| 1477 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1477 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1478 } | 1478 } |
| 1479 | 1479 |
| 1480 | 1480 |
| 1481 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { | 1481 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { |
| 1482 if (CPUFeatures::integer_division_supported()) { | 1482 if (CPUFeatures::integer_division_supported()) { |
| 1483 __ mov(R0, ShifterOperand(27)); | 1483 __ mov(R0, ShifterOperand(27)); |
| 1484 __ mov(R1, ShifterOperand(0)); | 1484 __ mov(R1, ShifterOperand(0)); |
| 1485 __ udiv(R2, R0, R1); | 1485 __ udiv(R2, R0, R1); |
| 1486 __ Mov(R0, R2); | 1486 __ mov(R0, ShifterOperand(R2)); |
| 1487 } else { | 1487 } else { |
| 1488 __ LoadImmediate(R0, 0); | 1488 __ LoadImmediate(R0, 0); |
| 1489 } | 1489 } |
| 1490 __ bx(LR); | 1490 __ bx(LR); |
| 1491 } | 1491 } |
| 1492 | 1492 |
| 1493 | 1493 |
| 1494 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { | 1494 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { |
| 1495 EXPECT(test != NULL); | 1495 EXPECT(test != NULL); |
| 1496 typedef int (*Tst)(); | 1496 typedef int (*Tst)(); |
| 1497 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1497 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1498 } | 1498 } |
| 1499 | 1499 |
| 1500 | 1500 |
| 1501 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { | 1501 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { |
| 1502 if (CPUFeatures::integer_division_supported()) { | 1502 if (CPUFeatures::integer_division_supported()) { |
| 1503 __ LoadImmediate(R0, 0x80000000); | 1503 __ LoadImmediate(R0, 0x80000000); |
| 1504 __ LoadImmediate(R1, 0xffffffff); | 1504 __ LoadImmediate(R1, 0xffffffff); |
| 1505 __ udiv(R2, R0, R1); | 1505 __ udiv(R2, R0, R1); |
| 1506 __ Mov(R0, R2); | 1506 __ mov(R0, ShifterOperand(R2)); |
| 1507 } else { | 1507 } else { |
| 1508 __ LoadImmediate(R0, 0); | 1508 __ LoadImmediate(R0, 0); |
| 1509 } | 1509 } |
| 1510 __ bx(LR); | 1510 __ bx(LR); |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 | 1513 |
| 1514 ASSEMBLER_TEST_RUN(Udiv_corner, test) { | 1514 ASSEMBLER_TEST_RUN(Udiv_corner, test) { |
| 1515 EXPECT(test != NULL); | 1515 EXPECT(test != NULL); |
| 1516 typedef int (*Tst)(); | 1516 typedef int (*Tst)(); |
| 1517 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 1517 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 1518 } | 1518 } |
| 1519 | 1519 |
| 1520 | 1520 |
| 1521 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { | 1521 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { |
| 1522 if (CPUFeatures::integer_division_supported()) { | 1522 if (CPUFeatures::integer_division_supported()) { |
| 1523 __ LoadImmediate(R0, 0x80000000); | 1523 __ LoadImmediate(R0, 0x80000000); |
| 1524 __ LoadImmediate(R1, 0xffffffff); | 1524 __ LoadImmediate(R1, 0xffffffff); |
| 1525 __ sdiv(R2, R0, R1); | 1525 __ sdiv(R2, R0, R1); |
| 1526 __ Mov(R0, R2); | 1526 __ mov(R0, ShifterOperand(R2)); |
| 1527 } else { | 1527 } else { |
| 1528 __ LoadImmediate(R0, 0x80000000); | 1528 __ LoadImmediate(R0, 0x80000000); |
| 1529 } | 1529 } |
| 1530 __ bx(LR); | 1530 __ bx(LR); |
| 1531 } | 1531 } |
| 1532 | 1532 |
| 1533 | 1533 |
| 1534 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { | 1534 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { |
| 1535 EXPECT(test != NULL); | 1535 EXPECT(test != NULL); |
| 1536 typedef int (*Tst)(); | 1536 typedef int (*Tst)(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1566 __ StoreIntoObject(R2, | 1566 __ StoreIntoObject(R2, |
| 1567 FieldAddress(R2, GrowableObjectArray::data_offset()), | 1567 FieldAddress(R2, GrowableObjectArray::data_offset()), |
| 1568 R1); | 1568 R1); |
| 1569 __ PopList((1 << CTX) | (1 << LR)); | 1569 __ PopList((1 << CTX) | (1 << LR)); |
| 1570 __ Ret(); | 1570 __ Ret(); |
| 1571 } | 1571 } |
| 1572 | 1572 |
| 1573 } // namespace dart | 1573 } // namespace dart |
| 1574 | 1574 |
| 1575 #endif // defined TARGET_ARCH_ARM | 1575 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |