| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 #ifndef VM_ASSEMBLER_ARM64_H_ | 5 #ifndef VM_ASSEMBLER_ARM64_H_ |
| 6 #define VM_ASSEMBLER_ARM64_H_ | 6 #define VM_ASSEMBLER_ARM64_H_ |
| 7 | 7 |
| 8 #ifndef VM_ASSEMBLER_H_ | 8 #ifndef VM_ASSEMBLER_H_ |
| 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. | 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. |
| 10 #endif | 10 #endif |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 // For an unmodified rm in this case, use Operand(rm, UXTX, 0); | 534 // For an unmodified rm in this case, use Operand(rm, UXTX, 0); |
| 535 void add(Register rd, Register rn, Operand o) { | 535 void add(Register rd, Register rn, Operand o) { |
| 536 AddSubHelper(kDoubleWord, false, false, rd, rn, o); | 536 AddSubHelper(kDoubleWord, false, false, rd, rn, o); |
| 537 } | 537 } |
| 538 void adds(Register rd, Register rn, Operand o) { | 538 void adds(Register rd, Register rn, Operand o) { |
| 539 AddSubHelper(kDoubleWord, true, false, rd, rn, o); | 539 AddSubHelper(kDoubleWord, true, false, rd, rn, o); |
| 540 } | 540 } |
| 541 void addw(Register rd, Register rn, Operand o) { | 541 void addw(Register rd, Register rn, Operand o) { |
| 542 AddSubHelper(kWord, false, false, rd, rn, o); | 542 AddSubHelper(kWord, false, false, rd, rn, o); |
| 543 } | 543 } |
| 544 void addsw(Register rd, Register rn, Operand o) { |
| 545 AddSubHelper(kWord, true, false, rd, rn, o); |
| 546 } |
| 544 void sub(Register rd, Register rn, Operand o) { | 547 void sub(Register rd, Register rn, Operand o) { |
| 545 AddSubHelper(kDoubleWord, false, true, rd, rn, o); | 548 AddSubHelper(kDoubleWord, false, true, rd, rn, o); |
| 546 } | 549 } |
| 547 void subs(Register rd, Register rn, Operand o) { | 550 void subs(Register rd, Register rn, Operand o) { |
| 548 AddSubHelper(kDoubleWord, true, true, rd, rn, o); | 551 AddSubHelper(kDoubleWord, true, true, rd, rn, o); |
| 549 } | 552 } |
| 553 void subw(Register rd, Register rn, Operand o) { |
| 554 AddSubHelper(kWord, false, true, rd, rn, o); |
| 555 } |
| 556 void subsw(Register rd, Register rn, Operand o) { |
| 557 AddSubHelper(kWord, true, true, rd, rn, o); |
| 558 } |
| 559 |
| 560 // Addition and subtraction with carry. |
| 561 void adc(Register rd, Register rn, Register rm) { |
| 562 AddSubWithCarryHelper(kDoubleWord, false, false, rd, rn, rm); |
| 563 } |
| 564 void adcs(Register rd, Register rn, Register rm) { |
| 565 AddSubWithCarryHelper(kDoubleWord, true, false, rd, rn, rm); |
| 566 } |
| 567 void adcw(Register rd, Register rn, Register rm) { |
| 568 AddSubWithCarryHelper(kWord, false, false, rd, rn, rm); |
| 569 } |
| 570 void adcsw(Register rd, Register rn, Register rm) { |
| 571 AddSubWithCarryHelper(kWord, true, false, rd, rn, rm); |
| 572 } |
| 573 void sbc(Register rd, Register rn, Register rm) { |
| 574 AddSubWithCarryHelper(kDoubleWord, false, true, rd, rn, rm); |
| 575 } |
| 576 void sbcs(Register rd, Register rn, Register rm) { |
| 577 AddSubWithCarryHelper(kDoubleWord, true, true, rd, rn, rm); |
| 578 } |
| 579 void sbcw(Register rd, Register rn, Register rm) { |
| 580 AddSubWithCarryHelper(kWord, false, true, rd, rn, rm); |
| 581 } |
| 582 void sbcsw(Register rd, Register rn, Register rm) { |
| 583 AddSubWithCarryHelper(kWord, true, true, rd, rn, rm); |
| 584 } |
| 550 | 585 |
| 551 // PC relative immediate add. imm is in bytes. | 586 // PC relative immediate add. imm is in bytes. |
| 552 void adr(Register rd, const Immediate& imm) { | 587 void adr(Register rd, const Immediate& imm) { |
| 553 EmitPCRelOp(ADR, rd, imm); | 588 EmitPCRelOp(ADR, rd, imm); |
| 554 } | 589 } |
| 555 | 590 |
| 556 // Logical immediate operations. | 591 // Logical immediate operations. |
| 557 void andi(Register rd, Register rn, const Immediate& imm) { | 592 void andi(Register rd, Register rn, const Immediate& imm) { |
| 558 Operand imm_op; | 593 Operand imm_op; |
| 559 const bool immok = | 594 const bool immok = |
| (...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1420 } else if (o.type() == Operand::Shifted) { | 1455 } else if (o.type() == Operand::Shifted) { |
| 1421 ASSERT((rd != CSP) && (rn != CSP)); | 1456 ASSERT((rd != CSP) && (rn != CSP)); |
| 1422 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags); | 1457 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags); |
| 1423 } else { | 1458 } else { |
| 1424 ASSERT(o.type() == Operand::Extended); | 1459 ASSERT(o.type() == Operand::Extended); |
| 1425 ASSERT((rd != CSP) && (rn != ZR)); | 1460 ASSERT((rd != CSP) && (rn != ZR)); |
| 1426 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags); | 1461 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags); |
| 1427 } | 1462 } |
| 1428 } | 1463 } |
| 1429 | 1464 |
| 1465 void AddSubWithCarryHelper(OperandSize sz, bool set_flags, bool subtract, |
| 1466 Register rd, Register rn, Register rm) { |
| 1467 ASSERT((rd != R31) && (rn != R31) && (rm != R31)); |
| 1468 ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP)); |
| 1469 const Register crd = ConcreteRegister(rd); |
| 1470 const Register crn = ConcreteRegister(rn); |
| 1471 const Register crm = ConcreteRegister(rm); |
| 1472 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 1473 const int32_t s = set_flags ? B29 : 0; |
| 1474 const int32_t op = subtract ? SBC : ADC; |
| 1475 const int32_t encoding = |
| 1476 op | size | s | |
| 1477 (static_cast<int32_t>(crd) << kRdShift) | |
| 1478 (static_cast<int32_t>(crn) << kRnShift) | |
| 1479 (static_cast<int32_t>(crm) << kRmShift); |
| 1480 Emit(encoding); |
| 1481 } |
| 1482 |
| 1430 void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn, | 1483 void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn, |
| 1431 Operand o, OperandSize sz, bool set_flags) { | 1484 Operand o, OperandSize sz, bool set_flags) { |
| 1432 ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord)); | 1485 ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord)); |
| 1433 const int32_t size = (sz == kDoubleWord) ? B31 : 0; | 1486 const int32_t size = (sz == kDoubleWord) ? B31 : 0; |
| 1434 const int32_t s = set_flags ? B29 : 0; | 1487 const int32_t s = set_flags ? B29 : 0; |
| 1435 const int32_t encoding = | 1488 const int32_t encoding = |
| 1436 op | size | s | | 1489 op | size | s | |
| 1437 (static_cast<int32_t>(rd) << kRdShift) | | 1490 (static_cast<int32_t>(rd) << kRdShift) | |
| 1438 (static_cast<int32_t>(rn) << kRnShift) | | 1491 (static_cast<int32_t>(rn) << kRnShift) | |
| 1439 o.encoding(); | 1492 o.encoding(); |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1820 Register value, | 1873 Register value, |
| 1821 Label* no_update); | 1874 Label* no_update); |
| 1822 | 1875 |
| 1823 DISALLOW_ALLOCATION(); | 1876 DISALLOW_ALLOCATION(); |
| 1824 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1877 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1825 }; | 1878 }; |
| 1826 | 1879 |
| 1827 } // namespace dart | 1880 } // namespace dart |
| 1828 | 1881 |
| 1829 #endif // VM_ASSEMBLER_ARM64_H_ | 1882 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |