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

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') | runtime/vm/simulator_arm64.cc » ('J')
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 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 // For an unmodified rm in this case, use Operand(rm, UXTX, 0); 504 // For an unmodified rm in this case, use Operand(rm, UXTX, 0);
505 void add(Register rd, Register rn, Operand o) { 505 void add(Register rd, Register rn, Operand o) {
506 AddSubHelper(kDoubleWord, false, false, rd, rn, o); 506 AddSubHelper(kDoubleWord, false, false, rd, rn, o);
507 } 507 }
508 void adds(Register rd, Register rn, Operand o) { 508 void adds(Register rd, Register rn, Operand o) {
509 AddSubHelper(kDoubleWord, true, false, rd, rn, o); 509 AddSubHelper(kDoubleWord, true, false, rd, rn, o);
510 } 510 }
511 void addw(Register rd, Register rn, Operand o) { 511 void addw(Register rd, Register rn, Operand o) {
512 AddSubHelper(kWord, false, false, rd, rn, o); 512 AddSubHelper(kWord, false, false, rd, rn, o);
513 } 513 }
514 void addsw(Register rd, Register rn, Operand o) {
515 AddSubHelper(kWord, true, false, rd, rn, o);
516 }
514 void sub(Register rd, Register rn, Operand o) { 517 void sub(Register rd, Register rn, Operand o) {
515 AddSubHelper(kDoubleWord, false, true, rd, rn, o); 518 AddSubHelper(kDoubleWord, false, true, rd, rn, o);
516 } 519 }
517 void subs(Register rd, Register rn, Operand o) { 520 void subs(Register rd, Register rn, Operand o) {
518 AddSubHelper(kDoubleWord, true, true, rd, rn, o); 521 AddSubHelper(kDoubleWord, true, true, rd, rn, o);
519 } 522 }
523 void subw(Register rd, Register rn, Operand o) {
524 AddSubHelper(kWord, false, true, rd, rn, o);
525 }
526 void subsw(Register rd, Register rn, Operand o) {
527 AddSubHelper(kWord, true, true, rd, rn, o);
528 }
529
530 // Addition and subtraction with carry.
531 void adc(Register rd, Register rn, Register rm) {
532 AddSubWithCarryHelper(kDoubleWord, false, false, rd, rn, rm);
533 }
534 void adcs(Register rd, Register rn, Register rm) {
535 AddSubWithCarryHelper(kDoubleWord, true, false, rd, rn, rm);
536 }
537 void adcw(Register rd, Register rn, Register rm) {
538 AddSubWithCarryHelper(kWord, false, false, rd, rn, rm);
539 }
540 void adcsw(Register rd, Register rn, Register rm) {
541 AddSubWithCarryHelper(kWord, true, false, rd, rn, rm);
542 }
543 void sbc(Register rd, Register rn, Register rm) {
544 AddSubWithCarryHelper(kDoubleWord, false, true, rd, rn, rm);
545 }
546 void sbcs(Register rd, Register rn, Register rm) {
547 AddSubWithCarryHelper(kDoubleWord, true, true, rd, rn, rm);
548 }
549 void sbcw(Register rd, Register rn, Register rm) {
550 AddSubWithCarryHelper(kWord, false, true, rd, rn, rm);
551 }
552 void sbcsw(Register rd, Register rn, Register rm) {
553 AddSubWithCarryHelper(kWord, true, true, rd, rn, rm);
554 }
520 555
521 // PC relative immediate add. imm is in bytes. 556 // PC relative immediate add. imm is in bytes.
522 void adr(Register rd, const Immediate& imm) { 557 void adr(Register rd, const Immediate& imm) {
523 EmitPCRelOp(ADR, rd, imm); 558 EmitPCRelOp(ADR, rd, imm);
524 } 559 }
525 560
526 // Logical immediate operations. 561 // Logical immediate operations.
527 void andi(Register rd, Register rn, const Immediate& imm) { 562 void andi(Register rd, Register rn, const Immediate& imm) {
528 Operand imm_op; 563 Operand imm_op;
529 const bool immok = 564 const bool immok =
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 } else if (o.type() == Operand::Shifted) { 1406 } else if (o.type() == Operand::Shifted) {
1372 ASSERT((rd != CSP) && (rn != CSP)); 1407 ASSERT((rd != CSP) && (rn != CSP));
1373 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags); 1408 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
1374 } else { 1409 } else {
1375 ASSERT(o.type() == Operand::Extended); 1410 ASSERT(o.type() == Operand::Extended);
1376 ASSERT((rd != CSP) && (rn != ZR)); 1411 ASSERT((rd != CSP) && (rn != ZR));
1377 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags); 1412 EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
1378 } 1413 }
1379 } 1414 }
1380 1415
1416 void AddSubWithCarryHelper(OperandSize sz, bool set_flags, bool subtract,
1417 Register rd, Register rn, Register rm) {
1418 ASSERT((rd != R31) && (rn != R31) && (rm != R31));
1419 ASSERT((rd != CSP) && (rn != CSP) && (rm != CSP));
1420 const Register crd = ConcreteRegister(rd);
1421 const Register crn = ConcreteRegister(rn);
1422 const Register crm = ConcreteRegister(rm);
1423 const int32_t size = (sz == kDoubleWord) ? B31 : 0;
1424 const int32_t s = set_flags ? B29 : 0;
1425 const int32_t op = subtract ? SBC : ADC;
1426 const int32_t encoding =
1427 op | size | s |
1428 (static_cast<int32_t>(crd) << kRdShift) |
1429 (static_cast<int32_t>(crn) << kRnShift) |
1430 (static_cast<int32_t>(crm) << kRmShift);
1431 Emit(encoding);
1432 }
1433
1381 void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn, 1434 void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn,
1382 Operand o, OperandSize sz, bool set_flags) { 1435 Operand o, OperandSize sz, bool set_flags) {
1383 ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord)); 1436 ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
1384 const int32_t size = (sz == kDoubleWord) ? B31 : 0; 1437 const int32_t size = (sz == kDoubleWord) ? B31 : 0;
1385 const int32_t s = set_flags ? B29 : 0; 1438 const int32_t s = set_flags ? B29 : 0;
1386 const int32_t encoding = 1439 const int32_t encoding =
1387 op | size | s | 1440 op | size | s |
1388 (static_cast<int32_t>(rd) << kRdShift) | 1441 (static_cast<int32_t>(rd) << kRdShift) |
1389 (static_cast<int32_t>(rn) << kRnShift) | 1442 (static_cast<int32_t>(rn) << kRnShift) |
1390 o.encoding(); 1443 o.encoding();
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 Register value, 1801 Register value,
1749 Label* no_update); 1802 Label* no_update);
1750 1803
1751 DISALLOW_ALLOCATION(); 1804 DISALLOW_ALLOCATION();
1752 DISALLOW_COPY_AND_ASSIGN(Assembler); 1805 DISALLOW_COPY_AND_ASSIGN(Assembler);
1753 }; 1806 };
1754 1807
1755 } // namespace dart 1808 } // namespace dart
1756 1809
1757 #endif // VM_ASSEMBLER_ARM64_H_ 1810 #endif // VM_ASSEMBLER_ARM64_H_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_arm64_test.cc » ('j') | runtime/vm/simulator_arm64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698