Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: runtime/vm/assembler_arm64.h

Issue 630093004: Fix 32-bit and 64-bit carry out calculation in arm64 simulator. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698