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

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

Issue 14556002: Uses slt and sltu for signed vs. unsigned comparison by the MIPS assembler. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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 | « runtime/tests/vm/vm.status ('k') | runtime/vm/assembler_mips.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) 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_MIPS_H_ 5 #ifndef VM_ASSEMBLER_MIPS_H_
6 #define VM_ASSEMBLER_MIPS_H_ 6 #define VM_ASSEMBLER_MIPS_H_
7 7
8 #ifndef VM_ASSEMBLER_H_ 8 #ifndef VM_ASSEMBLER_H_
9 #error Do not include assembler_mips.h directly; use assembler.h instead. 9 #error Do not include assembler_mips.h directly; use assembler.h instead.
10 #endif 10 #endif
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 LoadImmediate(CMPRES, value); 702 LoadImmediate(CMPRES, value);
703 bne(rd, CMPRES, l); 703 bne(rd, CMPRES, l);
704 } 704 }
705 705
706 void BranchNotEqual(Register rd, const Object& object, Label* l) { 706 void BranchNotEqual(Register rd, const Object& object, Label* l) {
707 ASSERT(rd != CMPRES); 707 ASSERT(rd != CMPRES);
708 LoadObject(CMPRES, object); 708 LoadObject(CMPRES, object);
709 bne(rd, CMPRES, l); 709 bne(rd, CMPRES, l);
710 } 710 }
711 711
712 void BranchGreater(Register rd, int32_t value, Label* l) { 712 void BranchSignedGreater(Register rd, Register rs, Label* l) {
713 if (Utils::IsInt(kImmBits, -value)) { 713 slt(CMPRES, rs, rd); // CMPRES = rd > rs ? 1 : 0.
714 addiu(CMPRES, rd, Immediate(-value)); 714 bne(CMPRES, ZR, l);
715 bgtz(CMPRES, l); 715 }
716 } else { 716
717 LoadImmediate(CMPRES, value); 717 void BranchSignedGreater(Register rd, int32_t value, Label* l) {
718 subu(CMPRES, rd, CMPRES); 718 LoadImmediate(CMPRES, value);
719 bgtz(CMPRES, l); 719 BranchSignedGreater(rd, CMPRES, l);
720 }
721 } 720 }
722 721
723 void BranchGreater(Register rd, Register rs, Label* l) { 722 void BranchGreater(Register rd, Register rs, Label* l) {
regis 2013/04/30 00:14:50 I suppose this is an unsigned compare? The name i
zra 2013/04/30 00:30:07 Done.
724 subu(CMPRES, rd, rs); 723 sltu(CMPRES, rs, rd);
725 bgtz(CMPRES, l); 724 bne(CMPRES, ZR, l);
725 }
726
727 void BranchGreater(Register rd, int32_t value, Label* l) {
728 LoadImmediate(CMPRES, value);
729 BranchGreater(rd, CMPRES, l);
730 }
731
732 void BranchSignedGreaterEqual(Register rd, Register rs, Label* l) {
733 slt(CMPRES, rd, rs); // CMPRES = rd < rs ? 1 : 0.
734 beq(CMPRES, ZR, l); // If CMPRES = 0, then rd >= rs.
735 }
736
737 void BranchSignedGreaterEqual(Register rd, int32_t value, Label* l) {
738 LoadImmediate(CMPRES, value);
739 BranchSignedGreaterEqual(rd, CMPRES, l);
740 }
741
742 void BranchGreaterEqual(Register rd, Register rs, Label* l) {
743 sltu(CMPRES, rd, rs); // CMPRES = rd < rs ? 1 : 0.
744 beq(CMPRES, ZR, l);
726 } 745 }
727 746
728 void BranchGreaterEqual(Register rd, int32_t value, Label* l) { 747 void BranchGreaterEqual(Register rd, int32_t value, Label* l) {
729 if (Utils::IsInt(kImmBits, -value)) { 748 LoadImmediate(CMPRES, value);
730 addiu(CMPRES, rd, Immediate(-value)); 749 BranchGreaterEqual(rd, CMPRES, l);
731 bgez(CMPRES, l);
732 } else {
733 LoadImmediate(CMPRES, value);
734 subu(CMPRES, rd, CMPRES);
735 bgez(CMPRES, l);
736 }
737 } 750 }
738 751
739 void BranchGreaterEqual(Register rd, Register rs, Label* l) { 752 void BranchSignedLess(Register rd, Register rs, Label* l) {
740 subu(CMPRES, rd, rs); 753 BranchSignedGreater(rs, rd, l);
741 bgez(CMPRES, l); 754 }
755
756 void BranchSignedLess(Register rd, int32_t value, Label* l) {
757 LoadImmediate(CMPRES, value);
758 BranchSignedGreater(CMPRES, rd, l);
759 }
760
761 void BranchLess(Register rd, Register rs, Label* l) {
762 BranchGreater(rs, rd, l);
742 } 763 }
743 764
744 void BranchLess(Register rd, int32_t value, Label* l) { 765 void BranchLess(Register rd, int32_t value, Label* l) {
745 if (Utils::IsInt(kImmBits, -value)) { 766 LoadImmediate(CMPRES, value);
746 addiu(CMPRES, rd, Immediate(-value)); 767 BranchGreater(CMPRES, rd, l);
747 bltz(CMPRES, l);
748 } else {
749 LoadImmediate(CMPRES, value);
750 subu(CMPRES, rd, CMPRES);
751 bltz(CMPRES, l);
752 }
753 } 768 }
754 769
755 void BranchLess(Register rd, Register rs, Label* l) { 770 void BranchSignedLessEqual(Register rd, Register rs, Label* l) {
756 subu(CMPRES, rd, rs); 771 BranchSignedGreaterEqual(rs, rd, l);
757 bltz(CMPRES, l); 772 }
773
774 void BranchSignedLessEqual(Register rd, int32_t value, Label* l) {
775 LoadImmediate(CMPRES, value);
776 BranchSignedGreaterEqual(CMPRES, rd, l);
777 }
778
779 void BranchLessEqual(Register rd, Register rs, Label* l) {
780 BranchGreaterEqual(rs, rd, l);
758 } 781 }
759 782
760 void BranchLessEqual(Register rd, int32_t value, Label* l) { 783 void BranchLessEqual(Register rd, int32_t value, Label* l) {
761 if (Utils::IsInt(kImmBits, -value)) { 784 LoadImmediate(CMPRES, value);
762 addiu(CMPRES, rd, Immediate(-value)); 785 BranchGreaterEqual(CMPRES, rd, l);
763 blez(CMPRES, l);
764 } else {
765 LoadImmediate(CMPRES, value);
766 subu(CMPRES, rd, CMPRES);
767 blez(CMPRES, l);
768 }
769 }
770
771 void BranchLessEqual(Register rd, Register rs, Label* l) {
772 subu(CMPRES, rd, rs);
773 blez(CMPRES, l);
774 } 786 }
775 787
776 void Push(Register rt) { 788 void Push(Register rt) {
777 addiu(SP, SP, Immediate(-kWordSize)); 789 addiu(SP, SP, Immediate(-kWordSize));
778 sw(rt, Address(SP)); 790 sw(rt, Address(SP));
779 } 791 }
780 792
781 void Pop(Register rt) { 793 void Pop(Register rt) {
782 lw(rt, Address(SP)); 794 lw(rt, Address(SP));
783 addiu(SP, SP, Immediate(kWordSize)); 795 addiu(SP, SP, Immediate(kWordSize));
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 Register value, 1001 Register value,
990 Label* no_update); 1002 Label* no_update);
991 1003
992 DISALLOW_ALLOCATION(); 1004 DISALLOW_ALLOCATION();
993 DISALLOW_COPY_AND_ASSIGN(Assembler); 1005 DISALLOW_COPY_AND_ASSIGN(Assembler);
994 }; 1006 };
995 1007
996 } // namespace dart 1008 } // namespace dart
997 1009
998 #endif // VM_ASSEMBLER_MIPS_H_ 1010 #endif // VM_ASSEMBLER_MIPS_H_
OLDNEW
« no previous file with comments | « runtime/tests/vm/vm.status ('k') | runtime/vm/assembler_mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698