4640 4641 Label miss; 4642 MacroAssembler _masm(&cbuf); 4643 __ check_klass_subtype_slow_path(sub_reg, super_reg, temp_reg, result_reg, 4644 NULL, &miss, 4645 /*set_cond_codes:*/ true); 4646 if ($primary) { 4647 __ mov(result_reg, zr); 4648 } 4649 __ bind(miss); 4650 %} 4651 4652 enc_class aarch64_enc_java_static_call(method meth) %{ 4653 MacroAssembler _masm(&cbuf); 4654 4655 address addr = (address)$meth$$method; 4656 address call; 4657 if (!_method) { 4658 // A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap. 4659 call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type), &cbuf); 4660 } else if (_optimized_virtual) { 4661 call = __ trampoline_call(Address(addr, relocInfo::opt_virtual_call_type), &cbuf); 4662 } else { 4663 call = __ trampoline_call(Address(addr, relocInfo::static_call_type), &cbuf); 4664 } 4665 if (call == NULL) { 4666 ciEnv::current()->record_failure("CodeCache is full"); 4667 return; 4668 } 4669 4670 if (_method) { 4671 // Emit stub for static call 4672 address stub = CompiledStaticCall::emit_to_interp_stub(cbuf); 4673 if (stub == NULL) { 4674 ciEnv::current()->record_failure("CodeCache is full"); 4675 return; 4676 } 4677 } 4678 %} 4679 4680 enc_class aarch64_enc_java_dynamic_call(method meth) %{ 4681 MacroAssembler _masm(&cbuf); 4682 address call = __ ic_call((address)$meth$$method); 4683 if (call == NULL) { 4684 ciEnv::current()->record_failure("CodeCache is full"); 4685 return; 4686 } 4687 %} 4688 4689 enc_class aarch64_enc_call_epilog() %{ 4690 MacroAssembler _masm(&cbuf); 4691 if (VerifyStackAtCalls) { 4692 // Check that stack depth is unchanged: find majik cookie on stack 4693 __ call_Unimplemented(); 4694 } 4695 %} 4696 4697 enc_class aarch64_enc_java_to_runtime(method meth) %{ 4698 MacroAssembler _masm(&cbuf); 4699 4700 // some calls to generated routines (arraycopy code) are scheduled 4701 // by C2 as runtime calls. if so we can call them using a br (they 4702 // will be in a reachable segment) otherwise we have to use a blrt | 4640 4641 Label miss; 4642 MacroAssembler _masm(&cbuf); 4643 __ check_klass_subtype_slow_path(sub_reg, super_reg, temp_reg, result_reg, 4644 NULL, &miss, 4645 /*set_cond_codes:*/ true); 4646 if ($primary) { 4647 __ mov(result_reg, zr); 4648 } 4649 __ bind(miss); 4650 %} 4651 4652 enc_class aarch64_enc_java_static_call(method meth) %{ 4653 MacroAssembler _masm(&cbuf); 4654 4655 address addr = (address)$meth$$method; 4656 address call; 4657 if (!_method) { 4658 // A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap. 4659 call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type), &cbuf); 4660 } else { 4661 int method_index = resolved_method_index(cbuf); 4662 RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index) 4663 : static_call_Relocation::spec(method_index); 4664 call = __ trampoline_call(Address(addr, rspec), &cbuf); 4665 4666 // Emit stub for static call 4667 address stub = CompiledStaticCall::emit_to_interp_stub(cbuf); 4668 if (stub == NULL) { 4669 ciEnv::current()->record_failure("CodeCache is full"); 4670 return; 4671 } 4672 } 4673 if (call == NULL) { 4674 ciEnv::current()->record_failure("CodeCache is full"); 4675 return; 4676 } 4677 %} 4678 4679 enc_class aarch64_enc_java_dynamic_call(method meth) %{ 4680 MacroAssembler _masm(&cbuf); 4681 int method_index = resolved_method_index(cbuf); 4682 address call = __ ic_call((address)$meth$$method, method_index); 4683 if (call == NULL) { 4684 ciEnv::current()->record_failure("CodeCache is full"); 4685 return; 4686 } 4687 %} 4688 4689 enc_class aarch64_enc_call_epilog() %{ 4690 MacroAssembler _masm(&cbuf); 4691 if (VerifyStackAtCalls) { 4692 // Check that stack depth is unchanged: find majik cookie on stack 4693 __ call_Unimplemented(); 4694 } 4695 %} 4696 4697 enc_class aarch64_enc_java_to_runtime(method meth) %{ 4698 MacroAssembler _masm(&cbuf); 4699 4700 // some calls to generated routines (arraycopy code) are scheduled 4701 // by C2 as runtime calls. if so we can call them using a br (they 4702 // will be in a reachable segment) otherwise we have to use a blrt |