< prev index next >

src/cpu/aarch64/vm/templateTable_aarch64.cpp

Print this page
rev 8428 : 8081289: aarch64: add support for RewriteFrequentPairs in interpreter
Summary: Add support for RewriteFrequentPairs
Reviewed-by: duke
Contributed-by: alexander.alexeev@caviumnetworks.com

*** 511,537 **** } void TemplateTable::iload_internal(RewriteControl rc) { transition(vtos, itos); if (RewriteFrequentPairs && rc == may_rewrite) { ! // TODO : check x86 code for what to do here ! __ call_Unimplemented(); ! } else { locals_index(r1); __ ldr(r0, iaddress(r1)); - } } void TemplateTable::fast_iload2() { ! __ call_Unimplemented(); } void TemplateTable::fast_iload() { ! __ call_Unimplemented(); } void TemplateTable::lload() { transition(vtos, ltos); --- 511,575 ---- } void TemplateTable::iload_internal(RewriteControl rc) { transition(vtos, itos); if (RewriteFrequentPairs && rc == may_rewrite) { ! Label rewrite, done; ! Register bc = r4; ! ! // get next bytecode ! __ load_unsigned_byte(r1, at_bcp(Bytecodes::length_for(Bytecodes::_iload))); ! ! // if _iload, wait to rewrite to iload2. We only want to rewrite the ! // last two iloads in a pair. Comparing against fast_iload means that ! // the next bytecode is neither an iload or a caload, and therefore ! // an iload pair. ! __ cmpw(r1, Bytecodes::_iload); ! __ br(Assembler::EQ, done); ! ! // if _fast_iload rewrite to _fast_iload2 ! __ cmpw(r1, Bytecodes::_fast_iload); ! __ movw(bc, Bytecodes::_fast_iload2); ! __ br(Assembler::EQ, rewrite); ! ! // if _caload rewrite to _fast_icaload ! __ cmpw(r1, Bytecodes::_caload); ! __ movw(bc, Bytecodes::_fast_icaload); ! __ br(Assembler::EQ, rewrite); ! ! // else rewrite to _fast_iload ! __ movw(bc, Bytecodes::_fast_iload); ! ! // rewrite ! // bc: new bytecode ! __ bind(rewrite); ! patch_bytecode(Bytecodes::_iload, bc, r1, false); ! __ bind(done); ! ! } ! ! // do iload, get the local value into tos locals_index(r1); __ ldr(r0, iaddress(r1)); } void TemplateTable::fast_iload2() { ! transition(vtos, itos); ! locals_index(r1); ! __ ldr(r0, iaddress(r1)); ! __ push(itos); ! locals_index(r1, 3); ! __ ldr(r0, iaddress(r1)); } void TemplateTable::fast_iload() { ! transition(vtos, itos); ! locals_index(r1); ! __ ldr(r0, iaddress(r1)); } void TemplateTable::lload() { transition(vtos, ltos);
*** 719,729 **** } // iload followed by caload frequent pair void TemplateTable::fast_icaload() { ! __ call_Unimplemented(); } void TemplateTable::saload() { transition(itos, itos); --- 757,778 ---- } // iload followed by caload frequent pair void TemplateTable::fast_icaload() { ! transition(vtos, itos); ! // load index out of locals ! locals_index(r2); ! __ ldr(r1, iaddress(r2)); ! ! __ pop_ptr(r0); ! ! // r0: array ! // r1: index ! index_check(r0, r1); // leaves index in r1, kills rscratch1 ! __ lea(r1, Address(r0, r1, Address::uxtw(1))); ! __ load_unsigned_short(r0, Address(r1, arrayOopDesc::base_offset_in_bytes(T_CHAR))); } void TemplateTable::saload() { transition(itos, itos);
*** 795,805 **** // aload_0, aload_1 // aload_0, iload_1 // These bytecodes with a small amount of code are most profitable // to rewrite if (RewriteFrequentPairs && rc == may_rewrite) { ! __ call_Unimplemented(); } else { aload(0); } } --- 844,894 ---- // aload_0, aload_1 // aload_0, iload_1 // These bytecodes with a small amount of code are most profitable // to rewrite if (RewriteFrequentPairs && rc == may_rewrite) { ! Label rewrite, done; ! const Register bc = r4; ! ! // get next bytecode ! __ load_unsigned_byte(r1, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0))); ! ! // do actual aload_0 ! aload(0); ! ! // if _getfield then wait with rewrite ! __ cmpw(r1, Bytecodes::Bytecodes::_getfield); ! __ br(Assembler::EQ, done); ! ! // if _igetfield then reqrite to _fast_iaccess_0 ! assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); ! __ cmpw(r1, Bytecodes::_fast_igetfield); ! __ movw(bc, Bytecodes::_fast_iaccess_0); ! __ br(Assembler::EQ, rewrite); ! ! // if _agetfield then reqrite to _fast_aaccess_0 ! assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); ! __ cmpw(r1, Bytecodes::_fast_agetfield); ! __ movw(bc, Bytecodes::_fast_aaccess_0); ! __ br(Assembler::EQ, rewrite); ! ! // if _fgetfield then reqrite to _fast_faccess_0 ! assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition"); ! __ cmpw(r1, Bytecodes::_fast_fgetfield); ! __ movw(bc, Bytecodes::_fast_faccess_0); ! __ br(Assembler::EQ, rewrite); ! ! // else rewrite to _fast_aload0 ! assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "fix bytecode definition"); ! __ movw(bc, Bytecodes::Bytecodes::_fast_aload_0); ! ! // rewrite ! // bc: new bytecode ! __ bind(rewrite); ! patch_bytecode(Bytecodes::_aload_0, bc, r1, false); ! ! __ bind(done); } else { aload(0); } }
< prev index next >