hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp
changeset 19979 ebe1dbb6e1aa
parent 19319 0ad35be0733a
child 20403 45a89fbcd8f7
equal deleted inserted replaced
19766:b6d8784a1037 19979:ebe1dbb6e1aa
  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);
  4890 #endif
  4890 #endif
  4891 }
  4891 }
  4892 
  4892 
  4893 #ifdef _LP64
  4893 #ifdef _LP64
  4894 void MacroAssembler::store_klass_gap(Register dst, Register src) {
  4894 void MacroAssembler::store_klass_gap(Register dst, Register src) {
  4895   if (UseCompressedKlassPointers) {
  4895   if (UseCompressedClassPointers) {
  4896     // Store to klass gap in destination
  4896     // Store to klass gap in destination
  4897     movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
  4897     movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
  4898   }
  4898   }
  4899 }
  4899 }
  4900 
  4900 
  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());