< prev index next >

src/hotspot/cpu/aarch64/aarch64.ad

Print this page

        

*** 1751,1781 **** void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { Compile* C = ra_->C; MacroAssembler _masm(&cbuf); ! // n.b. frame size includes space for return pc and rfp ! const long framesize = C->frame_size_in_bytes(); ! assert(framesize%(2*wordSize) == 0, "must preserve 2*wordSize alignment"); ! ! // insert a nop at the start of the prolog so we can patch in a ! // branch if we need to invalidate the method later ! __ nop(); ! ! int bangsize = C->bang_size_in_bytes(); ! if (C->need_stack_bang(bangsize) && UseStackBanging) ! __ generate_stack_overflow_check(bangsize); ! ! __ build_frame(framesize); ! ! if (NotifySimulator) { ! __ notify(Assembler::method_entry); ! } ! ! if (VerifyStackAtCalls) { ! Unimplemented(); ! } C->set_frame_complete(cbuf.insts_size()); if (C->has_mach_constant_base_node()) { // NOTE: We set the table base offset here because users might be --- 1751,1762 ---- void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { Compile* C = ra_->C; MacroAssembler _masm(&cbuf); ! __ verified_entry(C, 0); ! __ bind(*_verified_entry); C->set_frame_complete(cbuf.insts_size()); if (C->has_mach_constant_base_node()) { // NOTE: We set the table base offset here because users might be
*** 2092,2103 **** uint BoxLockNode::size(PhaseRegAlloc *ra_) const { // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_). return 4; } ! //============================================================================= #ifndef PRODUCT void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const { st->print_cr("# MachUEPNode"); if (UseCompressedClassPointers) { --- 2073,2122 ---- uint BoxLockNode::size(PhaseRegAlloc *ra_) const { // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_). return 4; } ! ///============================================================================= ! #ifndef PRODUCT ! void MachVEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const ! { ! st->print_cr("# MachVEPNode"); ! if (!_verified) { ! st->print_cr("\t load_class"); ! } else { ! st->print_cr("\t unpack_value_arg"); ! } ! } ! #endif + void MachVEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const + { + MacroAssembler _masm(&cbuf); + + if (!_verified) { + Label skip; + __ cmp_klass(j_rarg0, rscratch2, rscratch1); + __ br(Assembler::EQ, skip); + __ far_jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub())); + __ bind(skip); + + } else { + // Unpack value type args passed as oop and then jump to + // the verified entry point (skipping the unverified entry). + __ unpack_value_args(ra_->C, _receiver_only); + __ b(*_verified_entry); + } + } + + + uint MachVEPNode::size(PhaseRegAlloc* ra_) const + { + return MachNode::size(ra_); // too many variables; just compute it the hard way + } + + + //============================================================================= #ifndef PRODUCT void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const { st->print_cr("# MachUEPNode"); if (UseCompressedClassPointers) {
*** 2115,2127 **** void MachUEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { // This is the unverified entry point. MacroAssembler _masm(&cbuf); __ cmp_klass(j_rarg0, rscratch2, rscratch1); ! Label skip; // TODO // can we avoid this skip and still use a reloc? __ br(Assembler::EQ, skip); __ far_jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub())); __ bind(skip); --- 2134,2148 ---- void MachUEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { // This is the unverified entry point. MacroAssembler _masm(&cbuf); + Label skip; + // UseCompressedClassPointers logic are inside cmp_klass __ cmp_klass(j_rarg0, rscratch2, rscratch1); ! // TODO // can we avoid this skip and still use a reloc? __ br(Assembler::EQ, skip); __ far_jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub())); __ bind(skip);
*** 2505,2515 **** static void getCallInfo(const TypeFunc *tf, int &gpcnt, int &fpcnt, int &rtype) { int gps = 0; int fps = 0; ! const TypeTuple *domain = tf->domain(); int max = domain->cnt(); for (int i = TypeFunc::Parms; i < max; i++) { const Type *t = domain->field_at(i); switch(t->basic_type()) { case T_FLOAT: --- 2526,2536 ---- static void getCallInfo(const TypeFunc *tf, int &gpcnt, int &fpcnt, int &rtype) { int gps = 0; int fps = 0; ! const TypeTuple *domain = tf->domain_cc(); int max = domain->cnt(); for (int i = TypeFunc::Parms; i < max; i++) { const Type *t = domain->field_at(i); switch(t->basic_type()) { case T_FLOAT:
*** 8180,8189 **** --- 8201,8225 ---- %} ins_pipe(ialu_reg); %} + instruct castN2X(iRegLNoSp dst, iRegN src) %{ + match(Set dst (CastP2X src)); + + ins_cost(INSN_COST); + format %{ "mov $dst, $src\t# ptr -> long" %} + + ins_encode %{ + if ($dst$$reg != $src$$reg) { + __ mov(as_Register($dst$$reg), as_Register($src$$reg)); + } + %} + + ins_pipe(ialu_reg); + %} + instruct castP2X(iRegLNoSp dst, iRegP src) %{ match(Set dst (CastP2X src)); ins_cost(INSN_COST); format %{ "mov $dst, $src\t# ptr -> long" %}
*** 8195,8204 **** --- 8231,8271 ---- %} ins_pipe(ialu_reg); %} + instruct castN2I(iRegINoSp dst, iRegN src) %{ + match(Set dst (CastN2I src)); + + ins_cost(INSN_COST); + format %{ "movw $dst, $src\t# compressed ptr -> int" %} + + ins_encode %{ + if ($dst$$reg != $src$$reg) { + __ movw(as_Register($dst$$reg), as_Register($src$$reg)); + } + %} + + ins_pipe(ialu_reg); + %} + + instruct castI2N(iRegNNoSp dst, iRegI src) %{ + match(Set dst (CastI2N src)); + + ins_cost(INSN_COST); + format %{ "movw $dst, $src\t# int -> compressed ptr" %} + + ins_encode %{ + if ($dst$$reg != $src$$reg) { + __ movw(as_Register($dst$$reg), as_Register($src$$reg)); + } + %} + + ins_pipe(ialu_reg); + %} + + // Convert oop into int for vectors alignment masking instruct convP2I(iRegINoSp dst, iRegP src) %{ match(Set dst (ConvL2I (CastP2X src))); ins_cost(INSN_COST);
*** 13684,13720 **** %} // ============================================================================ // clearing of an array ! instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr) %{ ! match(Set dummy (ClearArray cnt base)); effect(USE_KILL cnt, USE_KILL base); ins_cost(4 * INSN_COST); ! format %{ "ClearArray $cnt, $base" %} ! ! ins_encode %{ ! __ zero_words($base$$Register, $cnt$$Register); ! %} ! ! ins_pipe(pipe_class_memory); ! %} ! ! instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr) ! %{ ! predicate((u_int64_t)n->in(2)->get_long() ! < (u_int64_t)(BlockZeroingLowLimit >> LogBytesPerWord)); ! match(Set dummy (ClearArray cnt base)); ! effect(USE_KILL base); ! ! ins_cost(4 * INSN_COST); ! format %{ "ClearArray $cnt, $base" %} ins_encode %{ ! __ zero_words($base$$Register, (u_int64_t)$cnt$$constant); %} ins_pipe(pipe_class_memory); %} --- 13751,13770 ---- %} // ============================================================================ // clearing of an array ! instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, iRegL val, Universe dummy, rFlagsReg cr) %{ ! match(Set dummy (ClearArray (Binary cnt base) val)); effect(USE_KILL cnt, USE_KILL base); ins_cost(4 * INSN_COST); ! format %{ "ClearArray $cnt, $base, $val" %} ins_encode %{ ! __ fill_words($base$$Register, $cnt$$Register, $val$$Register); %} ins_pipe(pipe_class_memory); %}
< prev index next >