1633 assert(number_of_arguments >= 0 , "cannot have negative number of arguments"); |
1633 assert(number_of_arguments >= 0 , "cannot have negative number of arguments"); |
1634 LP64_ONLY(assert(java_thread == r15_thread, "unexpected register")); |
1634 LP64_ONLY(assert(java_thread == r15_thread, "unexpected register")); |
1635 #ifdef ASSERT |
1635 #ifdef ASSERT |
1636 // TraceBytecodes does not use r12 but saves it over the call, so don't verify |
1636 // TraceBytecodes does not use r12 but saves it over the call, so don't verify |
1637 // r12 is the heapbase. |
1637 // r12 is the heapbase. |
1638 LP64_ONLY(if ((UseCompressedOops || UseCompressedKlassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");) |
1638 LP64_ONLY(if ((UseCompressedOops || UseCompressedClassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");) |
1639 #endif // ASSERT |
1639 #endif // ASSERT |
1640 |
1640 |
1641 assert(java_thread != oop_result , "cannot use the same register for java_thread & oop_result"); |
1641 assert(java_thread != oop_result , "cannot use the same register for java_thread & oop_result"); |
1642 assert(java_thread != last_java_sp, "cannot use the same register for java_thread & last_java_sp"); |
1642 assert(java_thread != last_java_sp, "cannot use the same register for java_thread & last_java_sp"); |
1643 |
1643 |
4800 } |
4800 } |
4801 |
4801 |
4802 |
4802 |
4803 void MacroAssembler::load_klass(Register dst, Register src) { |
4803 void MacroAssembler::load_klass(Register dst, Register src) { |
4804 #ifdef _LP64 |
4804 #ifdef _LP64 |
4805 if (UseCompressedKlassPointers) { |
4805 if (UseCompressedClassPointers) { |
4806 movl(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
4806 movl(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
4807 decode_klass_not_null(dst); |
4807 decode_klass_not_null(dst); |
4808 } else |
4808 } else |
4809 #endif |
4809 #endif |
4810 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
4810 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
4815 movptr(dst, Address(dst, Klass::prototype_header_offset())); |
4815 movptr(dst, Address(dst, Klass::prototype_header_offset())); |
4816 } |
4816 } |
4817 |
4817 |
4818 void MacroAssembler::store_klass(Register dst, Register src) { |
4818 void MacroAssembler::store_klass(Register dst, Register src) { |
4819 #ifdef _LP64 |
4819 #ifdef _LP64 |
4820 if (UseCompressedKlassPointers) { |
4820 if (UseCompressedClassPointers) { |
4821 encode_klass_not_null(src); |
4821 encode_klass_not_null(src); |
4822 movl(Address(dst, oopDesc::klass_offset_in_bytes()), src); |
4822 movl(Address(dst, oopDesc::klass_offset_in_bytes()), src); |
4823 } else |
4823 } else |
4824 #endif |
4824 #endif |
4825 movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src); |
4825 movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src); |
5073 // Function instr_size_for_decode_klass_not_null() counts the instructions |
5073 // Function instr_size_for_decode_klass_not_null() counts the instructions |
5074 // generated by decode_klass_not_null(register r) and reinit_heapbase(), |
5074 // generated by decode_klass_not_null(register r) and reinit_heapbase(), |
5075 // when (Universe::heap() != NULL). Hence, if the instructions they |
5075 // when (Universe::heap() != NULL). Hence, if the instructions they |
5076 // generate change, then this method needs to be updated. |
5076 // generate change, then this method needs to be updated. |
5077 int MacroAssembler::instr_size_for_decode_klass_not_null() { |
5077 int MacroAssembler::instr_size_for_decode_klass_not_null() { |
5078 assert (UseCompressedKlassPointers, "only for compressed klass ptrs"); |
5078 assert (UseCompressedClassPointers, "only for compressed klass ptrs"); |
5079 // mov64 + addq + shlq? + mov64 (for reinit_heapbase()). |
5079 // mov64 + addq + shlq? + mov64 (for reinit_heapbase()). |
5080 return (Universe::narrow_klass_shift() == 0 ? 20 : 24); |
5080 return (Universe::narrow_klass_shift() == 0 ? 20 : 24); |
5081 } |
5081 } |
5082 |
5082 |
5083 // !!! If the instructions that get generated here change then function |
5083 // !!! If the instructions that get generated here change then function |
5084 // instr_size_for_decode_klass_not_null() needs to get updated. |
5084 // instr_size_for_decode_klass_not_null() needs to get updated. |
5085 void MacroAssembler::decode_klass_not_null(Register r) { |
5085 void MacroAssembler::decode_klass_not_null(Register r) { |
5086 // Note: it will change flags |
5086 // Note: it will change flags |
5087 assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); |
5087 assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); |
5088 assert (UseCompressedKlassPointers, "should only be used for compressed headers"); |
5088 assert (UseCompressedClassPointers, "should only be used for compressed headers"); |
5089 assert(r != r12_heapbase, "Decoding a klass in r12"); |
5089 assert(r != r12_heapbase, "Decoding a klass in r12"); |
5090 // Cannot assert, unverified entry point counts instructions (see .ad file) |
5090 // Cannot assert, unverified entry point counts instructions (see .ad file) |
5091 // vtableStubs also counts instructions in pd_code_size_limit. |
5091 // vtableStubs also counts instructions in pd_code_size_limit. |
5092 // Also do not verify_oop as this is called by verify_oop. |
5092 // Also do not verify_oop as this is called by verify_oop. |
5093 if (Universe::narrow_klass_shift() != 0) { |
5093 if (Universe::narrow_klass_shift() != 0) { |
5101 } |
5101 } |
5102 |
5102 |
5103 void MacroAssembler::decode_klass_not_null(Register dst, Register src) { |
5103 void MacroAssembler::decode_klass_not_null(Register dst, Register src) { |
5104 // Note: it will change flags |
5104 // Note: it will change flags |
5105 assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); |
5105 assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); |
5106 assert (UseCompressedKlassPointers, "should only be used for compressed headers"); |
5106 assert (UseCompressedClassPointers, "should only be used for compressed headers"); |
5107 if (dst == src) { |
5107 if (dst == src) { |
5108 decode_klass_not_null(dst); |
5108 decode_klass_not_null(dst); |
5109 } else { |
5109 } else { |
5110 // Cannot assert, unverified entry point counts instructions (see .ad file) |
5110 // Cannot assert, unverified entry point counts instructions (see .ad file) |
5111 // vtableStubs also counts instructions in pd_code_size_limit. |
5111 // vtableStubs also counts instructions in pd_code_size_limit. |
5139 RelocationHolder rspec = oop_Relocation::spec(oop_index); |
5139 RelocationHolder rspec = oop_Relocation::spec(oop_index); |
5140 mov_narrow_oop(dst, oop_index, rspec); |
5140 mov_narrow_oop(dst, oop_index, rspec); |
5141 } |
5141 } |
5142 |
5142 |
5143 void MacroAssembler::set_narrow_klass(Register dst, Klass* k) { |
5143 void MacroAssembler::set_narrow_klass(Register dst, Klass* k) { |
5144 assert (UseCompressedKlassPointers, "should only be used for compressed headers"); |
5144 assert (UseCompressedClassPointers, "should only be used for compressed headers"); |
5145 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5145 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5146 int klass_index = oop_recorder()->find_index(k); |
5146 int klass_index = oop_recorder()->find_index(k); |
5147 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5147 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5148 mov_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5148 mov_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5149 } |
5149 } |
5150 |
5150 |
5151 void MacroAssembler::set_narrow_klass(Address dst, Klass* k) { |
5151 void MacroAssembler::set_narrow_klass(Address dst, Klass* k) { |
5152 assert (UseCompressedKlassPointers, "should only be used for compressed headers"); |
5152 assert (UseCompressedClassPointers, "should only be used for compressed headers"); |
5153 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5153 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5154 int klass_index = oop_recorder()->find_index(k); |
5154 int klass_index = oop_recorder()->find_index(k); |
5155 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5155 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5156 mov_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5156 mov_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5157 } |
5157 } |
5173 RelocationHolder rspec = oop_Relocation::spec(oop_index); |
5173 RelocationHolder rspec = oop_Relocation::spec(oop_index); |
5174 Assembler::cmp_narrow_oop(dst, oop_index, rspec); |
5174 Assembler::cmp_narrow_oop(dst, oop_index, rspec); |
5175 } |
5175 } |
5176 |
5176 |
5177 void MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) { |
5177 void MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) { |
5178 assert (UseCompressedKlassPointers, "should only be used for compressed headers"); |
5178 assert (UseCompressedClassPointers, "should only be used for compressed headers"); |
5179 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5179 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5180 int klass_index = oop_recorder()->find_index(k); |
5180 int klass_index = oop_recorder()->find_index(k); |
5181 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5181 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5182 Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5182 Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5183 } |
5183 } |
5184 |
5184 |
5185 void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) { |
5185 void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) { |
5186 assert (UseCompressedKlassPointers, "should only be used for compressed headers"); |
5186 assert (UseCompressedClassPointers, "should only be used for compressed headers"); |
5187 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5187 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder"); |
5188 int klass_index = oop_recorder()->find_index(k); |
5188 int klass_index = oop_recorder()->find_index(k); |
5189 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5189 RelocationHolder rspec = metadata_Relocation::spec(klass_index); |
5190 Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5190 Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec); |
5191 } |
5191 } |
5192 |
5192 |
5193 void MacroAssembler::reinit_heapbase() { |
5193 void MacroAssembler::reinit_heapbase() { |
5194 if (UseCompressedOops || UseCompressedKlassPointers) { |
5194 if (UseCompressedOops || UseCompressedClassPointers) { |
5195 if (Universe::heap() != NULL) { |
5195 if (Universe::heap() != NULL) { |
5196 if (Universe::narrow_oop_base() == NULL) { |
5196 if (Universe::narrow_oop_base() == NULL) { |
5197 MacroAssembler::xorptr(r12_heapbase, r12_heapbase); |
5197 MacroAssembler::xorptr(r12_heapbase, r12_heapbase); |
5198 } else { |
5198 } else { |
5199 mov64(r12_heapbase, (int64_t)Universe::narrow_ptrs_base()); |
5199 mov64(r12_heapbase, (int64_t)Universe::narrow_ptrs_base()); |