src/cpu/mips/vm/templateTable_mips_64.cpp

changeset 362
e46417a01c32
parent 257
bba1c817d040
child 406
bcbfdb66a6fb
equal deleted inserted replaced
361:63fe053f1032 362:e46417a01c32
659 } 659 }
660 660
661 void TemplateTable::iaload() { 661 void TemplateTable::iaload() {
662 transition(itos, itos); 662 transition(itos, itos);
663 // __ pop(SSR); 663 // __ pop(SSR);
664 index_check(SSR, FSR); 664 if(UseBoundCheckInstruction) {
665 __ dsll(FSR, FSR, 2); 665 __ pop(SSR); //SSR:array FSR: index
666 __ dadd(FSR, SSR, FSR); 666 __ dsll(FSR, FSR, 2);
667 //FSR: index 667 __ dadd(FSR, SSR, FSR);
668 __ lw(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_INT)); 668 __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_INT));
669 } 669
670 670 __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound
671 __ dsll(AT, AT, 2);
672 __ dadd(AT, SSR, AT);
673 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_INT));
674
675 __ gslwle(FSR, FSR, AT);
676 } else {
677 index_check(SSR, FSR);
678 __ dsll(FSR, FSR, 2);
679 __ dadd(FSR, SSR, FSR);
680 //FSR: index
681 __ lw(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_INT));
682 }
683 }
671 684
672 void TemplateTable::laload() { 685 void TemplateTable::laload() {
673 transition(itos, ltos); 686 transition(itos, ltos);
674 // __ pop(SSR); 687 // __ pop(SSR);
675 index_check(SSR, FSR); 688 if(UseBoundCheckInstruction) {
676 __ dsll(AT, FSR, Address::times_8); 689 __ pop(SSR); //SSR:array FSR: index
677 __ dadd(AT, SSR, AT); 690 __ dsll(FSR, FSR, Address::times_8);
678 __ ld(FSR, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 691 __ dadd(FSR, SSR, FSR);
692 __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize);
693
694 __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound
695 __ dsll(AT, AT, Address::times_8);
696 __ dadd(AT, SSR, AT);
697 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize);
698
699 __ gsldle(FSR, FSR, AT);
700 } else {
701 index_check(SSR, FSR);
702 __ dsll(AT, FSR, Address::times_8);
703 __ dadd(AT, SSR, AT);
704 __ ld(FSR, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize);
705 }
679 } 706 }
680 707
681 void TemplateTable::faload() { 708 void TemplateTable::faload() {
682 transition(itos, ftos); 709 transition(itos, ftos);
683 // __ pop(SSR); 710 // __ pop(SSR);
684 index_check(SSR, FSR); 711 if(UseBoundCheckInstruction) {
685 __ shl(FSR, 2); 712 __ pop(SSR); //SSR:array FSR: index
686 __ dadd(FSR, SSR, FSR); 713 __ shl(FSR, 2);
687 __ lwc1(FSF, FSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 714 __ dadd(FSR, SSR, FSR);
715 __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
716
717 __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound
718 __ shl(AT, 2);
719 __ dadd(AT, SSR, AT);
720 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
721
722 __ gslwlec1(FSF, FSR, AT);
723 } else {
724 index_check(SSR, FSR);
725 __ shl(FSR, 2);
726 __ dadd(FSR, SSR, FSR);
727 __ lwc1(FSF, FSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
728 }
688 } 729 }
689 730
690 void TemplateTable::daload() { 731 void TemplateTable::daload() {
691 transition(itos, dtos); 732 transition(itos, dtos);
692 //__ pop(SSR); 733 //__ pop(SSR);
693 index_check(SSR, FSR); 734 if(UseBoundCheckInstruction) {
694 __ dsll(AT, FSR, 3); 735 __ pop(SSR); //SSR:array FSR: index
695 __ dadd(AT, SSR, AT); 736 __ dsll(FSR, FSR, 3);
696 __ ldc1(FSF, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 737 __ dadd(FSR, SSR, FSR);
738 __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize);
739
740 __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound
741 __ dsll(AT, AT, 3);
742 __ dadd(AT, SSR, AT);
743 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize);
744
745 __ gsldlec1(FSF, FSR, AT);
746 } else {
747 index_check(SSR, FSR);
748 __ dsll(AT, FSR, 3);
749 __ dadd(AT, SSR, AT);
750 __ ldc1(FSF, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize);
751 }
697 } 752 }
698 753
699 void TemplateTable::aaload() { 754 void TemplateTable::aaload() {
700 transition(itos, atos); 755 transition(itos, atos);
701 //__ pop(SSR); 756 //__ pop(SSR);
707 } 762 }
708 763
709 void TemplateTable::baload() { 764 void TemplateTable::baload() {
710 transition(itos, itos); 765 transition(itos, itos);
711 //__ pop(SSR); 766 //__ pop(SSR);
712 index_check(SSR, FSR); 767 if(UseBoundCheckInstruction) {
713 __ dadd(FSR, SSR, FSR); 768 __ pop(SSR); //SSR:array FSR:index
714 __ lb(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); 769 __ dadd(FSR, SSR, FSR);
770 __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); //base
771
772 __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes());
773 __ dadd(AT, SSR, AT);
774 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_BYTE)); //bound
775
776 __ gslble(FSR, FSR, AT);
777 } else {
778 index_check(SSR, FSR);
779 __ dadd(FSR, SSR, FSR);
780 __ lb(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_BYTE));
781 }
715 } 782 }
716 783
717 void TemplateTable::caload() { 784 void TemplateTable::caload() {
718 transition(itos, itos); 785 transition(itos, itos);
719 // __ pop(SSR); 786 // __ pop(SSR);
739 } 806 }
740 807
741 void TemplateTable::saload() { 808 void TemplateTable::saload() {
742 transition(itos, itos); 809 transition(itos, itos);
743 // __ pop(SSR); 810 // __ pop(SSR);
744 index_check(SSR, FSR); 811 if(UseBoundCheckInstruction) {
745 __ dsll(FSR, FSR, Address::times_2); 812 __ pop(SSR); //SSR:array FSR: index
746 __ dadd(FSR, SSR, FSR); 813 __ dsll(FSR, FSR, Address::times_2);
747 __ lh(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_SHORT)); 814 __ dadd(FSR, SSR, FSR);
815 __ addi(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_SHORT));
816
817 __ lw(AT, SSR, arrayOopDesc::length_offset_in_bytes()); //bound
818 __ dsll(AT, AT, Address::times_2);
819 __ dadd(AT, SSR, AT);
820 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_SHORT));
821
822 __ gslhle(FSR, FSR, AT);
823 } else {
824 index_check(SSR, FSR);
825 __ dsll(FSR, FSR, Address::times_2);
826 __ dadd(FSR, SSR, FSR);
827 __ lh(FSR, FSR, arrayOopDesc::base_offset_in_bytes(T_SHORT));
828 }
748 } 829 }
749 830
750 void TemplateTable::iload(int n) { 831 void TemplateTable::iload(int n) {
751 transition(vtos, itos); 832 transition(vtos, itos);
752 __ lw(FSR, iaddress(n)); 833 __ lw(FSR, iaddress(n));
914 } 995 }
915 996
916 // used register : T2 997 // used register : T2
917 void TemplateTable::iastore() { 998 void TemplateTable::iastore() {
918 transition(itos, vtos); 999 transition(itos, vtos);
919 __ pop_i(SSR); 1000 __ pop_i(SSR); // T2: array SSR: index
920 index_check(T2, SSR); // prefer index in ebx 1001 if(UseBoundCheckInstruction) {
921 __ dsll(SSR, SSR, Address::times_4); 1002 __ pop_ptr(T2);
922 __ dadd(T2, T2, SSR); 1003 __ dsll(SSR, SSR, Address::times_4);
923 __ sw(FSR, T2, arrayOopDesc::base_offset_in_bytes(T_INT)); 1004 __ dadd(SSR, T2, SSR);
1005 __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_INT)); // base
1006
1007 __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes());
1008 __ dsll(AT, AT, Address::times_4);
1009 __ dadd(AT, T2, AT);
1010 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_INT)); //bound
1011
1012 __ gsswle(FSR, SSR, AT);
1013 } else {
1014 index_check(T2, SSR); // prefer index in ebx
1015 __ dsll(SSR, SSR, Address::times_4);
1016 __ dadd(T2, T2, SSR);
1017 __ sw(FSR, T2, arrayOopDesc::base_offset_in_bytes(T_INT));
1018 }
924 } 1019 }
925 1020
926 1021
927 1022
928 // used register T2, T3 1023 // used register T2, T3
929 void TemplateTable::lastore() { 1024 void TemplateTable::lastore() {
930 transition(ltos, vtos); 1025 transition(ltos, vtos);
931 __ pop_i (T2); 1026 __ pop_i (T2);
932 index_check(T3, T2); 1027 if(UseBoundCheckInstruction) {
933 __ dsll(T2, T2, Address::times_8); 1028 __ pop_ptr(T3);
934 __ dadd(T3, T3, T2); 1029 __ dsll(T2, T2, Address::times_8);
935 __ sd(FSR, T3, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); 1030 __ dadd(T2, T3, T2);
1031 __ addi(T2, T2, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); // base
1032
1033 __ lw(AT, T3, arrayOopDesc::length_offset_in_bytes());
1034 __ dsll(AT, AT, Address::times_8);
1035 __ dadd(AT, T3, AT);
1036 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize); //bound
1037
1038 __ gssdle(FSR, T2, AT);
1039 } else {
1040 index_check(T3, T2);
1041 __ dsll(T2, T2, Address::times_8);
1042 __ dadd(T3, T3, T2);
1043 __ sd(FSR, T3, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize);
1044 }
936 } 1045 }
937 1046
938 // used register T2 1047 // used register T2
939 void TemplateTable::fastore() { 1048 void TemplateTable::fastore() {
940 transition(ftos, vtos); 1049 transition(ftos, vtos);
941 __ pop_i(SSR); 1050 __ pop_i(SSR);
942 index_check(T2, SSR); 1051 if(UseBoundCheckInstruction) {
943 __ dsll(SSR, SSR, Address::times_4); 1052 __ pop_ptr(T2);
944 __ dadd(T2, T2, SSR); 1053 __ dsll(SSR, SSR, Address::times_4);
945 __ swc1(FSF, T2, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); 1054 __ dadd(SSR, T2, SSR);
1055 __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); // base
1056
1057 __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes());
1058 __ dsll(AT, AT, Address::times_4);
1059 __ dadd(AT, T2, AT);
1060 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_FLOAT)); //bound
1061
1062 __ gsswlec1(FSF, SSR, AT);
1063 } else {
1064 index_check(T2, SSR);
1065 __ dsll(SSR, SSR, Address::times_4);
1066 __ dadd(T2, T2, SSR);
1067 __ swc1(FSF, T2, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
1068 }
946 } 1069 }
947 1070
948 // used register T2, T3 1071 // used register T2, T3
949 void TemplateTable::dastore() { 1072 void TemplateTable::dastore() {
950 transition(dtos, vtos); 1073 transition(dtos, vtos);
951 __ pop_i (T2); 1074 __ pop_i (T2);
952 index_check(T3, T2); 1075 if(UseBoundCheckInstruction) {
953 __ dsll(T2, T2, Address::times_8); 1076 __ pop_ptr(T3);
954 __ daddu(T3, T3, T2); 1077 __ dsll(T2, T2, Address::times_8);
955 __ sdc1(FSF, T3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); 1078 __ dadd(T2, T3, T2);
956 1079 __ addi(T2, T2, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); // base
1080
1081 __ lw(AT, T3, arrayOopDesc::length_offset_in_bytes());
1082 __ dsll(AT, AT, Address::times_8);
1083 __ dadd(AT, T3, AT);
1084 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize); //bound
1085
1086 __ gssdlec1(FSF, T2, AT);
1087 } else {
1088 index_check(T3, T2);
1089 __ dsll(T2, T2, Address::times_8);
1090 __ daddu(T3, T3, T2);
1091 __ sdc1(FSF, T3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) + 0 * wordSize);
1092 }
957 } 1093 }
958 1094
959 // used register : T2, T3, T8 1095 // used register : T2, T3, T8
960 // T2 : array 1096 // T2 : array
961 // T3 : subklass 1097 // T3 : subklass
1017 } 1153 }
1018 1154
1019 void TemplateTable::bastore() { 1155 void TemplateTable::bastore() {
1020 transition(itos, vtos); 1156 transition(itos, vtos);
1021 __ pop_i (SSR); 1157 __ pop_i (SSR);
1022 index_check(T2, SSR); 1158 if(UseBoundCheckInstruction) {
1023 __ dadd(SSR, T2, SSR); 1159 __ pop_ptr(T2);
1024 __ sb(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); 1160 __ dadd(SSR, T2, SSR);
1161 __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // base
1162
1163 __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes());
1164 __ dadd(AT, T2, AT);
1165 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_BYTE)); //bound
1166
1167 __ gssble(FSR, SSR, AT);
1168 } else {
1169 index_check(T2, SSR);
1170 __ dadd(SSR, T2, SSR);
1171 __ sb(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_BYTE));
1172 }
1025 } 1173 }
1026 1174
1027 void TemplateTable::castore() { 1175 void TemplateTable::castore() {
1028 transition(itos, vtos); 1176 transition(itos, vtos);
1029 __ pop_i(SSR); 1177 __ pop_i(SSR);
1030 index_check(T2, SSR); 1178 if(UseBoundCheckInstruction) {
1031 __ dsll(SSR, SSR, Address::times_2); 1179 __ pop_ptr(T2);
1032 __ dadd(SSR, T2, SSR); 1180 __ dsll(SSR, SSR, Address::times_2);
1033 __ sh(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_CHAR)); 1181 __ dadd(SSR, T2, SSR);
1182 __ addi(SSR, SSR, arrayOopDesc::base_offset_in_bytes(T_CHAR)); // base
1183
1184 __ lw(AT, T2, arrayOopDesc::length_offset_in_bytes());
1185 __ dsll(AT, AT, Address::times_2);
1186 __ dadd(AT, T2, AT);
1187 __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(T_CHAR)); //bound
1188
1189 __ gsshle(FSR, SSR, AT);
1190 } else {
1191 index_check(T2, SSR);
1192 __ dsll(SSR, SSR, Address::times_2);
1193 __ dadd(SSR, T2, SSR);
1194 __ sh(FSR, SSR, arrayOopDesc::base_offset_in_bytes(T_CHAR));
1195 }
1034 } 1196 }
1035 1197
1036 void TemplateTable::sastore() { 1198 void TemplateTable::sastore() {
1037 castore(); 1199 castore();
1038 } 1200 }

mercurial