< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page

5253   if (CompressedOops::base() != nullptr) {
5254     sub(dst, src, rheapbase);
5255     data = dst;
5256   }
5257   if (CompressedOops::shift() != 0) {
5258     assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5259     lsr(dst, data, LogMinObjAlignmentInBytes);
5260     data = dst;
5261   }
5262   if (data == src)
5263     mov(dst, src);
5264 }
5265 
5266 void  MacroAssembler::decode_heap_oop(Register d, Register s) {
5267 #ifdef ASSERT
5268   verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
5269 #endif
5270   if (CompressedOops::base() == nullptr) {
5271     if (CompressedOops::shift() != 0) {
5272       lsl(d, s, CompressedOops::shift());
5273     } else if (d != s) {
5274       mov(d, s);
5275     }
5276   } else {
5277     Label done;
5278     if (d != s)
5279       mov(d, s);
5280     cbz(s, done);
5281     add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
5282     bind(done);
5283   }
5284   verify_oop_msg(d, "broken oop in decode_heap_oop");
5285 }
5286 
5287 void  MacroAssembler::decode_heap_oop_not_null(Register r) {
5288   assert (UseCompressedOops, "should only be used for compressed headers");
5289   assert (Universe::heap() != nullptr, "java heap should be initialized");
5290   // Cannot assert, unverified entry point counts instructions (see .ad file)
5291   // vtableStubs also counts instructions in pd_code_size_limit.
5292   // Also do not verify_oop as this is called by verify_oop.
5293   if (CompressedOops::shift() != 0) {
5294     assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5295     if (CompressedOops::base() != nullptr) {
5296       add(r, rheapbase, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5297     } else {
5298       add(r, zr, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5299     }
5300   } else {
5301     assert (CompressedOops::base() == nullptr, "sanity");
5302   }
5303 }
5304 
5305 void  MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
5306   assert (UseCompressedOops, "should only be used for compressed headers");
5307   assert (Universe::heap() != nullptr, "java heap should be initialized");
5308   // Cannot assert, unverified entry point counts instructions (see .ad file)
5309   // vtableStubs also counts instructions in pd_code_size_limit.
5310   // Also do not verify_oop as this is called by verify_oop.
5311   if (CompressedOops::shift() != 0) {
5312     assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5313     if (CompressedOops::base() != nullptr) {
5314       add(dst, rheapbase, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5315     } else {
5316       add(dst, zr, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5317     }
5318   } else {
5319     assert (CompressedOops::base() == nullptr, "sanity");
5320     if (dst != src) {
5321       mov(dst, src);
5322     }
5323   }
5324 }
5325 
5326 MacroAssembler::KlassDecodeMode MacroAssembler::_klass_decode_mode(KlassDecodeNone);
5327 
5328 MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode() {
5329   assert(Metaspace::initialized(), "metaspace not initialized yet");
5330   assert(_klass_decode_mode != KlassDecodeNone, "should be initialized");
5331   return _klass_decode_mode;
5332 }
5333 
5334 MacroAssembler::KlassDecodeMode  MacroAssembler::klass_decode_mode(address base, int shift, const size_t range) {
5335   assert(UseCompressedClassPointers, "not using compressed class pointers");
5336 
5337   // KlassDecodeMode shouldn't be set already.
5338   assert(_klass_decode_mode == KlassDecodeNone, "set once");
5339 
5340   if (base == nullptr) {
5341     return KlassDecodeZero;
5342   }

5253   if (CompressedOops::base() != nullptr) {
5254     sub(dst, src, rheapbase);
5255     data = dst;
5256   }
5257   if (CompressedOops::shift() != 0) {
5258     assert (LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5259     lsr(dst, data, LogMinObjAlignmentInBytes);
5260     data = dst;
5261   }
5262   if (data == src)
5263     mov(dst, src);
5264 }
5265 
5266 void  MacroAssembler::decode_heap_oop(Register d, Register s) {
5267 #ifdef ASSERT
5268   verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
5269 #endif
5270   if (CompressedOops::base() == nullptr) {
5271     if (CompressedOops::shift() != 0) {
5272       lsl(d, s, CompressedOops::shift());
5273     } else {
5274       mov(d, s);
5275     }
5276   } else {
5277     Label done;
5278     mov(d, s);

5279     cbz(s, done);
5280     add(d, rheapbase, s, Assembler::LSL, LogMinObjAlignmentInBytes);
5281     bind(done);
5282   }
5283   verify_oop_msg(d, "broken oop in decode_heap_oop");
5284 }
5285 
5286 void  MacroAssembler::decode_heap_oop_not_null(Register r) {
5287   assert (UseCompressedOops, "should only be used for compressed headers");
5288   assert (Universe::heap() != nullptr, "java heap should be initialized");
5289   // Cannot assert, unverified entry point counts instructions (see .ad file)
5290   // vtableStubs also counts instructions in pd_code_size_limit.
5291   // Also do not verify_oop as this is called by verify_oop.
5292   if (CompressedOops::shift() != 0) {
5293     assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5294     if (CompressedOops::base() != nullptr) {
5295       add(r, rheapbase, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5296     } else {
5297       add(r, zr, r, Assembler::LSL, LogMinObjAlignmentInBytes);
5298     }
5299   } else {
5300     assert (CompressedOops::base() == nullptr, "sanity");
5301   }
5302 }
5303 
5304 void  MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
5305   assert (UseCompressedOops, "should only be used for compressed headers");
5306   assert (Universe::heap() != nullptr, "java heap should be initialized");
5307   // Cannot assert, unverified entry point counts instructions (see .ad file)
5308   // vtableStubs also counts instructions in pd_code_size_limit.
5309   // Also do not verify_oop as this is called by verify_oop.
5310   if (CompressedOops::shift() != 0) {
5311     assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
5312     if (CompressedOops::base() != nullptr) {
5313       add(dst, rheapbase, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5314     } else {
5315       add(dst, zr, src, Assembler::LSL, LogMinObjAlignmentInBytes);
5316     }
5317   } else {
5318     assert (CompressedOops::base() == nullptr, "sanity");
5319     mov(dst, src);


5320   }
5321 }
5322 
5323 MacroAssembler::KlassDecodeMode MacroAssembler::_klass_decode_mode(KlassDecodeNone);
5324 
5325 MacroAssembler::KlassDecodeMode MacroAssembler::klass_decode_mode() {
5326   assert(Metaspace::initialized(), "metaspace not initialized yet");
5327   assert(_klass_decode_mode != KlassDecodeNone, "should be initialized");
5328   return _klass_decode_mode;
5329 }
5330 
5331 MacroAssembler::KlassDecodeMode  MacroAssembler::klass_decode_mode(address base, int shift, const size_t range) {
5332   assert(UseCompressedClassPointers, "not using compressed class pointers");
5333 
5334   // KlassDecodeMode shouldn't be set already.
5335   assert(_klass_decode_mode == KlassDecodeNone, "set once");
5336 
5337   if (base == nullptr) {
5338     return KlassDecodeZero;
5339   }
< prev index next >