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 #ifndef VM_ASSEMBLER_ARM_H_ | 5 #ifndef VM_ASSEMBLER_ARM_H_ |
6 #define VM_ASSEMBLER_ARM_H_ | 6 #define VM_ASSEMBLER_ARM_H_ |
7 | 7 |
8 #ifndef VM_ASSEMBLER_H_ | 8 #ifndef VM_ASSEMBLER_H_ |
9 #error Do not include assembler_arm.h directly; use assembler.h instead. | 9 #error Do not include assembler_arm.h directly; use assembler.h instead. |
10 #endif | 10 #endif |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 | 451 |
452 void ldrb(Register rd, Address ad, Condition cond = AL); | 452 void ldrb(Register rd, Address ad, Condition cond = AL); |
453 void strb(Register rd, Address ad, Condition cond = AL); | 453 void strb(Register rd, Address ad, Condition cond = AL); |
454 | 454 |
455 void ldrh(Register rd, Address ad, Condition cond = AL); | 455 void ldrh(Register rd, Address ad, Condition cond = AL); |
456 void strh(Register rd, Address ad, Condition cond = AL); | 456 void strh(Register rd, Address ad, Condition cond = AL); |
457 | 457 |
458 void ldrsb(Register rd, Address ad, Condition cond = AL); | 458 void ldrsb(Register rd, Address ad, Condition cond = AL); |
459 void ldrsh(Register rd, Address ad, Condition cond = AL); | 459 void ldrsh(Register rd, Address ad, Condition cond = AL); |
460 | 460 |
461 void ldrd(Register rd, Address ad, Condition cond = AL); | 461 // ldrd and strd actually support the full range of addressing modes, but |
462 void strd(Register rd, Address ad, Condition cond = AL); | 462 // we don't use them, and we need to split them up into two instructions for |
| 463 // ARMv5TE, so we only support the base + offset mode. |
| 464 void ldrd(Register rd, Register rn, int32_t offset, Condition cond = AL); |
| 465 void strd(Register rd, Register rn, int32_t offset, Condition cond = AL); |
463 | 466 |
464 void ldm(BlockAddressMode am, Register base, | 467 void ldm(BlockAddressMode am, Register base, |
465 RegList regs, Condition cond = AL); | 468 RegList regs, Condition cond = AL); |
466 void stm(BlockAddressMode am, Register base, | 469 void stm(BlockAddressMode am, Register base, |
467 RegList regs, Condition cond = AL); | 470 RegList regs, Condition cond = AL); |
468 | 471 |
469 void ldrex(Register rd, Register rn, Condition cond = AL); | 472 void ldrex(Register rd, Register rn, Condition cond = AL); |
470 void strex(Register rd, Register rt, Register rn, Condition cond = AL); | 473 void strex(Register rd, Register rt, Register rn, Condition cond = AL); |
471 | 474 |
472 // Miscellaneous instructions. | 475 // Miscellaneous instructions. |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 void CompareImmediate(Register rn, int32_t value, Condition cond = AL); | 631 void CompareImmediate(Register rn, int32_t value, Condition cond = AL); |
629 | 632 |
630 | 633 |
631 // Signed integer division of left by right. Checks to see if integer | 634 // Signed integer division of left by right. Checks to see if integer |
632 // division is supported. If not, uses the FPU for division with | 635 // division is supported. If not, uses the FPU for division with |
633 // temporary registers tmpl and tmpr. tmpl and tmpr must be different | 636 // temporary registers tmpl and tmpr. tmpl and tmpr must be different |
634 // registers. | 637 // registers. |
635 void IntegerDivide(Register result, Register left, Register right, | 638 void IntegerDivide(Register result, Register left, Register right, |
636 DRegister tmpl, DRegister tmpr); | 639 DRegister tmpl, DRegister tmpr); |
637 | 640 |
638 // If we aren't on ARMv7, there is no smull. | |
639 void CheckMultSignedOverflow(Register left, | |
640 Register right, | |
641 Register tmp, | |
642 DRegister dtmp0, DRegister dtmp1, | |
643 Label* overflow); | |
644 | |
645 // Load and Store. | 641 // Load and Store. |
646 // These three do not clobber IP. | 642 // These three do not clobber IP. |
647 void LoadPatchableImmediate(Register rd, int32_t value, Condition cond = AL); | 643 void LoadPatchableImmediate(Register rd, int32_t value, Condition cond = AL); |
648 void LoadDecodableImmediate(Register rd, int32_t value, Condition cond = AL); | 644 void LoadDecodableImmediate(Register rd, int32_t value, Condition cond = AL); |
649 void LoadImmediate(Register rd, int32_t value, Condition cond = AL); | 645 void LoadImmediate(Register rd, int32_t value, Condition cond = AL); |
650 // These two may clobber IP. | 646 // These two may clobber IP. |
651 void LoadSImmediate(SRegister sd, float value, Condition cond = AL); | 647 void LoadSImmediate(SRegister sd, float value, Condition cond = AL); |
652 void LoadDImmediate(DRegister dd, double value, | 648 void LoadDImmediate(DRegister dd, double value, |
653 Register scratch, Condition cond = AL); | 649 Register scratch, Condition cond = AL); |
654 | 650 |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 Register new_value, | 1115 Register new_value, |
1120 FieldContent old_content); | 1116 FieldContent old_content); |
1121 | 1117 |
1122 DISALLOW_ALLOCATION(); | 1118 DISALLOW_ALLOCATION(); |
1123 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1119 DISALLOW_COPY_AND_ASSIGN(Assembler); |
1124 }; | 1120 }; |
1125 | 1121 |
1126 } // namespace dart | 1122 } // namespace dart |
1127 | 1123 |
1128 #endif // VM_ASSEMBLER_ARM_H_ | 1124 #endif // VM_ASSEMBLER_ARM_H_ |
OLD | NEW |