< prev index next >

src/cpu/aarch64/vm/aarch64.ad

Print this page
rev 9227 : 8143067: aarch64: guarantee failure in javac
Summary: Fix adrp going out of range during code relocation
Reviewed-by: duke


4381   %}
4382 
4383   enc_class aarch64_enc_mov_p(iRegP dst, immP src) %{
4384     MacroAssembler _masm(&cbuf);
4385     Register dst_reg = as_Register($dst$$reg);
4386     address con = (address)$src$$constant;
4387     if (con == NULL || con == (address)1) {
4388       ShouldNotReachHere();
4389     } else {
4390       relocInfo::relocType rtype = $src->constant_reloc();
4391       if (rtype == relocInfo::oop_type) {
4392         __ movoop(dst_reg, (jobject)con, /*immediate*/true);
4393       } else if (rtype == relocInfo::metadata_type) {
4394         __ mov_metadata(dst_reg, (Metadata*)con);
4395       } else {
4396         assert(rtype == relocInfo::none, "unexpected reloc type");
4397         if (con < (address)(uintptr_t)os::vm_page_size()) {
4398           __ mov(dst_reg, con);
4399         } else {
4400           unsigned long offset;
4401           __ adrp(dst_reg, con, offset);
4402           __ add(dst_reg, dst_reg, offset);
4403         }
4404       }
4405     }
4406   %}
4407 
4408   enc_class aarch64_enc_mov_p0(iRegP dst, immP0 src) %{
4409     MacroAssembler _masm(&cbuf);
4410     Register dst_reg = as_Register($dst$$reg);
4411     __ mov(dst_reg, zr);
4412   %}
4413 
4414   enc_class aarch64_enc_mov_p1(iRegP dst, immP_1 src) %{
4415     MacroAssembler _masm(&cbuf);
4416     Register dst_reg = as_Register($dst$$reg);
4417     __ mov(dst_reg, (u_int64_t)1);
4418   %}
4419 
4420   enc_class aarch64_enc_mov_poll_page(iRegP dst, immPollPage src) %{
4421     MacroAssembler _masm(&cbuf);
4422     address page = (address)$src$$constant;
4423     Register dst_reg = as_Register($dst$$reg);
4424     unsigned long off;
4425     __ adrp(dst_reg, Address(page, relocInfo::poll_type), off);
4426     assert(off == 0, "assumed offset == 0");
4427   %}
4428 
4429   enc_class aarch64_enc_mov_byte_map_base(iRegP dst, immByteMapBase src) %{
4430     MacroAssembler _masm(&cbuf);
4431     address page = (address)$src$$constant;
4432     Register dst_reg = as_Register($dst$$reg);
4433     unsigned long off;
4434     __ adrp(dst_reg, ExternalAddress(page), off);
4435     assert(off == 0, "assumed offset == 0");
4436   %}
4437 
4438   enc_class aarch64_enc_mov_n(iRegN dst, immN src) %{
4439     MacroAssembler _masm(&cbuf);
4440     Register dst_reg = as_Register($dst$$reg);
4441     address con = (address)$src$$constant;
4442     if (con == NULL) {
4443       ShouldNotReachHere();
4444     } else {
4445       relocInfo::relocType rtype = $src->constant_reloc();
4446       assert(rtype == relocInfo::oop_type, "unexpected reloc type");
4447       __ set_narrow_oop(dst_reg, (jobject)con);
4448     }
4449   %}
4450 
4451   enc_class aarch64_enc_mov_n0(iRegN dst, immN0 src) %{
4452     MacroAssembler _masm(&cbuf);
4453     Register dst_reg = as_Register($dst$$reg);
4454     __ mov(dst_reg, zr);




4381   %}
4382 
4383   enc_class aarch64_enc_mov_p(iRegP dst, immP src) %{
4384     MacroAssembler _masm(&cbuf);
4385     Register dst_reg = as_Register($dst$$reg);
4386     address con = (address)$src$$constant;
4387     if (con == NULL || con == (address)1) {
4388       ShouldNotReachHere();
4389     } else {
4390       relocInfo::relocType rtype = $src->constant_reloc();
4391       if (rtype == relocInfo::oop_type) {
4392         __ movoop(dst_reg, (jobject)con, /*immediate*/true);
4393       } else if (rtype == relocInfo::metadata_type) {
4394         __ mov_metadata(dst_reg, (Metadata*)con);
4395       } else {
4396         assert(rtype == relocInfo::none, "unexpected reloc type");
4397         if (con < (address)(uintptr_t)os::vm_page_size()) {
4398           __ mov(dst_reg, con);
4399         } else {
4400           unsigned long offset;
4401           __ far_adrp(dst_reg, con, offset);
4402           __ add(dst_reg, dst_reg, offset);
4403         }
4404       }
4405     }
4406   %}
4407 
4408   enc_class aarch64_enc_mov_p0(iRegP dst, immP0 src) %{
4409     MacroAssembler _masm(&cbuf);
4410     Register dst_reg = as_Register($dst$$reg);
4411     __ mov(dst_reg, zr);
4412   %}
4413 
4414   enc_class aarch64_enc_mov_p1(iRegP dst, immP_1 src) %{
4415     MacroAssembler _masm(&cbuf);
4416     Register dst_reg = as_Register($dst$$reg);
4417     __ mov(dst_reg, (u_int64_t)1);
4418   %}
4419 
4420   enc_class aarch64_enc_mov_poll_page(iRegP dst, immPollPage src) %{
4421     MacroAssembler _masm(&cbuf);
4422     address page = (address)$src$$constant;
4423     Register dst_reg = as_Register($dst$$reg);
4424     unsigned long off;
4425     __ far_adrp(dst_reg, Address(page, relocInfo::poll_type), off);
4426     assert(off == 0, "assumed offset == 0");
4427   %}
4428 
4429   enc_class aarch64_enc_mov_byte_map_base(iRegP dst, immByteMapBase src) %{
4430     MacroAssembler _masm(&cbuf);
4431     address page = (address)$src$$constant;
4432     Register dst_reg = as_Register($dst$$reg);
4433     unsigned long off;
4434     __ far_adrp(dst_reg, ExternalAddress(page), off);
4435     assert(off == 0, "assumed offset == 0");
4436   %}
4437 
4438   enc_class aarch64_enc_mov_n(iRegN dst, immN src) %{
4439     MacroAssembler _masm(&cbuf);
4440     Register dst_reg = as_Register($dst$$reg);
4441     address con = (address)$src$$constant;
4442     if (con == NULL) {
4443       ShouldNotReachHere();
4444     } else {
4445       relocInfo::relocType rtype = $src->constant_reloc();
4446       assert(rtype == relocInfo::oop_type, "unexpected reloc type");
4447       __ set_narrow_oop(dst_reg, (jobject)con);
4448     }
4449   %}
4450 
4451   enc_class aarch64_enc_mov_n0(iRegN dst, immN0 src) %{
4452     MacroAssembler _masm(&cbuf);
4453     Register dst_reg = as_Register($dst$$reg);
4454     __ mov(dst_reg, zr);


< prev index next >