740
741 void TemplateTable::index_check(Register array, Register index) {
742 // Pop ptr into array
743 __ pop_ptr(array);
744 index_check_without_pop(array, index);
745 }
746
747 void TemplateTable::index_check_without_pop(Register array, Register index) {
748 // destroys rbx
749 // check array
750 __ null_check(array, arrayOopDesc::length_offset_in_bytes());
751 // sign extend index for use by indexed load
752 __ movl2ptr(index, index);
753 // check index
754 __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
755 if (index != rbx) {
756 // ??? convention: move aberrant index into rbx for exception message
757 assert(rbx != array, "different registers");
758 __ movl(rbx, index);
759 }
760 __ jump_cc(Assembler::aboveEqual,
761 ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
762 }
763
764
765 void TemplateTable::iaload() {
766 transition(itos, itos);
767 // rax: index
768 // rdx: array
769 index_check(rdx, rax); // kills rbx
770 __ movl(rax, Address(rdx, rax,
771 Address::times_4,
772 arrayOopDesc::base_offset_in_bytes(T_INT)));
773 }
774
775 void TemplateTable::laload() {
776 transition(itos, ltos);
777 // rax: index
778 // rdx: array
779 index_check(rdx, rax); // kills rbx
780 NOT_LP64(__ mov(rbx, rax));
781 // rbx,: index
|
740
741 void TemplateTable::index_check(Register array, Register index) {
742 // Pop ptr into array
743 __ pop_ptr(array);
744 index_check_without_pop(array, index);
745 }
746
747 void TemplateTable::index_check_without_pop(Register array, Register index) {
748 // destroys rbx
749 // check array
750 __ null_check(array, arrayOopDesc::length_offset_in_bytes());
751 // sign extend index for use by indexed load
752 __ movl2ptr(index, index);
753 // check index
754 __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
755 if (index != rbx) {
756 // ??? convention: move aberrant index into rbx for exception message
757 assert(rbx != array, "different registers");
758 __ movl(rbx, index);
759 }
760 Label skip;
761 __ jccb(Assembler::below, skip);
762 // Pass array to create more detailed exceptions.
763 #ifdef IA32
764 __ mov(rax, array);
765 #else // AMD64
766 __ mov(c_rarg1, array);
767 #endif
768 __ jump(ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
769 __ bind(skip);
770 }
771
772
773 void TemplateTable::iaload() {
774 transition(itos, itos);
775 // rax: index
776 // rdx: array
777 index_check(rdx, rax); // kills rbx
778 __ movl(rax, Address(rdx, rax,
779 Address::times_4,
780 arrayOopDesc::base_offset_in_bytes(T_INT)));
781 }
782
783 void TemplateTable::laload() {
784 transition(itos, ltos);
785 // rax: index
786 // rdx: array
787 index_check(rdx, rax); // kills rbx
788 NOT_LP64(__ mov(rbx, rax));
789 // rbx,: index
|