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 } |