src/cpu/x86/vm/templateInterpreter_x86_64.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 7088419 Sdiff src/cpu/x86/vm

src/cpu/x86/vm/templateInterpreter_x86_64.cpp

Print this page




 823 
 824     // _areturn
 825     __ pop(rdi);                // get return address
 826     __ mov(rsp, r13);           // set sp to sender sp
 827     __ jmp(rdi);
 828     __ ret(0);
 829 
 830     // generate a vanilla interpreter entry as the slow path
 831     __ bind(slow_path);
 832     (void) generate_normal_entry(false);
 833 
 834     return entry;
 835   }
 836 #endif // INCLUDE_ALL_GCS
 837 
 838   // If G1 is not enabled then attempt to go through the accessor entry point
 839   // Reference.get is an accessor
 840   return generate_accessor_entry();
 841 }
 842 















































































































 843 
 844 // Interpreter stub for calling a native method. (asm interpreter)
 845 // This sets up a somewhat different looking stack for calling the
 846 // native method than the typical interpreter frame setup.
 847 address InterpreterGenerator::generate_native_entry(bool synchronized) {
 848   // determine code generation flags
 849   bool inc_counter  = UseCompiler || CountCompiledCalls;
 850 
 851   // rbx: Method*
 852   // r13: sender sp
 853 
 854   address entry_point = __ pc();
 855 
 856   const Address constMethod       (rbx, Method::const_offset());
 857   const Address access_flags      (rbx, Method::access_flags_offset());
 858   const Address size_of_parameters(rcx, ConstMethod::
 859                                         size_of_parameters_offset());
 860 
 861 
 862   // get parameter size (always needed)


1493 //   ...
1494 // [ monitor entry      ]
1495 // [ expr. stack bottom ]
1496 // [ saved r13          ]
1497 // [ current r14        ]
1498 // [ Method*            ]
1499 // [ saved ebp          ] <--- rbp
1500 // [ return address     ]
1501 // [ local variable m   ]
1502 //   ...
1503 // [ local variable 1   ]
1504 // [ parameter n        ]
1505 //   ...
1506 // [ parameter 1        ] <--- r14
1507 
1508 address AbstractInterpreterGenerator::generate_method_entry(
1509                                         AbstractInterpreter::MethodKind kind) {
1510   // determine code generation flags
1511   bool synchronized = false;
1512   address entry_point = NULL;

1513 
1514   switch (kind) {
1515   case Interpreter::zerolocals             :                                                                             break;
1516   case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
1517   case Interpreter::native                 : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false); break;
1518   case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true);  break;
1519   case Interpreter::empty                  : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry();       break;
1520   case Interpreter::accessor               : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry();    break;
1521   case Interpreter::abstract               : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry();    break;
1522 
1523   case Interpreter::java_lang_math_sin     : // fall thru
1524   case Interpreter::java_lang_math_cos     : // fall thru
1525   case Interpreter::java_lang_math_tan     : // fall thru
1526   case Interpreter::java_lang_math_abs     : // fall thru
1527   case Interpreter::java_lang_math_log     : // fall thru
1528   case Interpreter::java_lang_math_log10   : // fall thru
1529   case Interpreter::java_lang_math_sqrt    : // fall thru
1530   case Interpreter::java_lang_math_pow     : // fall thru
1531   case Interpreter::java_lang_math_exp     : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind);    break;
1532   case Interpreter::java_lang_ref_reference_get
1533                                            : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;






1534   default:
1535     fatal(err_msg("unexpected method kind: %d", kind));
1536     break;
1537   }
1538 
1539   if (entry_point) {
1540     return entry_point;
1541   }
1542 
1543   return ((InterpreterGenerator*) this)->
1544                                 generate_normal_entry(synchronized);
1545 }
1546 
1547 // These should never be compiled since the interpreter will prefer
1548 // the compiled version to the intrinsic version.
1549 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1550   switch (method_kind(m)) {
1551     case Interpreter::java_lang_math_sin     : // fall thru
1552     case Interpreter::java_lang_math_cos     : // fall thru
1553     case Interpreter::java_lang_math_tan     : // fall thru
1554     case Interpreter::java_lang_math_abs     : // fall thru
1555     case Interpreter::java_lang_math_log     : // fall thru
1556     case Interpreter::java_lang_math_log10   : // fall thru
1557     case Interpreter::java_lang_math_sqrt    : // fall thru
1558     case Interpreter::java_lang_math_pow     : // fall thru
1559     case Interpreter::java_lang_math_exp     :
1560       return false;
1561     default:
1562       return true;
1563   }
1564 }




 823 
 824     // _areturn
 825     __ pop(rdi);                // get return address
 826     __ mov(rsp, r13);           // set sp to sender sp
 827     __ jmp(rdi);
 828     __ ret(0);
 829 
 830     // generate a vanilla interpreter entry as the slow path
 831     __ bind(slow_path);
 832     (void) generate_normal_entry(false);
 833 
 834     return entry;
 835   }
 836 #endif // INCLUDE_ALL_GCS
 837 
 838   // If G1 is not enabled then attempt to go through the accessor entry point
 839   // Reference.get is an accessor
 840   return generate_accessor_entry();
 841 }
 842 
 843 /**
 844  * Method entry for static native methods:
 845  *   int java.util.zip.CRC32.update(int crc, int b)
 846  */
 847 address InterpreterGenerator::generate_CRC32_update_entry() {
 848   if (UseCRC32Intrinsics) {
 849     address entry = __ pc();
 850 
 851     // rbx,: Method*
 852     // rsi: senderSP must preserved for slow path, set SP to it on fast path
 853     // rdx: scratch
 854     // rdi: scratch
 855 
 856     Label slow_path;
 857     // If we need a safepoint check, generate full interpreter entry.
 858     ExternalAddress state(SafepointSynchronize::address_of_state());
 859     __ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()),
 860              SafepointSynchronize::_not_synchronized);
 861     __ jcc(Assembler::notEqual, slow_path);
 862 
 863     // We don't generate local frame and don't align stack because
 864     // we call stub code and there is no safepoint on this path.
 865 
 866     // Load parameters
 867     const Register crc = rax;  // crc
 868     const Register val = rdx;  // source java byte value
 869     const Register tbl = rdi;  // scratch
 870 
 871     // Arguments are reversed on java expression stack
 872     __ movl(val, Address(rsp,   wordSize)); // byte value
 873     __ movl(crc, Address(rsp, 2*wordSize)); // Initial CRC
 874 
 875     __ lea(tbl, ExternalAddress(StubRoutines::crc_table_addr()));
 876     __ notl(crc); // ~crc
 877     __ update_byte_crc32(crc, val, tbl);
 878     __ notl(crc); // ~crc
 879     // result in rax
 880 
 881     // _areturn
 882     __ pop(rdi);                // get return address
 883     __ mov(rsp, rsi);           // set sp to sender sp
 884     __ jmp(rdi);
 885 
 886     // generate a vanilla native entry as the slow path
 887     __ bind(slow_path);
 888 
 889     (void) generate_native_entry(false);
 890 
 891     return entry;
 892   }
 893   return generate_native_entry(false);
 894 }
 895 
 896 /**
 897  * Method entry for static native methods:
 898  *   int java.util.zip.CRC32.updateBytes(int crc, byte[] b, int off, int len)
 899  *   int java.util.zip.CRC32.updateByteBuffer(int crc, long buf, int off, int len)
 900  */
 901 address InterpreterGenerator::generate_CRC32_updateBytes_entry(AbstractInterpreter::MethodKind kind) {
 902   if (UseCRC32Intrinsics) {
 903     address entry = __ pc();
 904 
 905     // rbx,: Method*
 906     // r13: senderSP must preserved for slow path, set SP to it on fast path
 907 
 908     Label slow_path;
 909     // If we need a safepoint check, generate full interpreter entry.
 910     ExternalAddress state(SafepointSynchronize::address_of_state());
 911     __ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()),
 912              SafepointSynchronize::_not_synchronized);
 913     __ jcc(Assembler::notEqual, slow_path);
 914 
 915     // We don't generate local frame and don't align stack because
 916     // we call stub code and there is no safepoint on this path.
 917 
 918     // Load parameters
 919     const Register crc = c_rarg0;  // crc
 920     const Register buf = c_rarg1;  // source java byte array address
 921     const Register len = c_rarg2;  // length
 922 
 923     // Arguments are reversed on java expression stack
 924     __ movl(len,   Address(rsp,   wordSize)); // Length
 925     // Calculate address of start element
 926     if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) {
 927       __ movptr(buf, Address(rsp, 3*wordSize)); // long buf
 928       __ addptr(buf, Address(rsp, 2*wordSize)); // + offset
 929       __ movl(crc,   Address(rsp, 5*wordSize)); // Initial CRC
 930     } else {
 931       __ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array
 932       __ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size
 933       __ addptr(buf, Address(rsp, 2*wordSize)); // + offset
 934       __ movl(crc,   Address(rsp, 4*wordSize)); // Initial CRC
 935     }
 936 
 937     __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, StubRoutines::updateBytesCRC32()), crc, buf, len);
 938     // result in rax
 939 
 940     // _areturn
 941     __ pop(rdi);                // get return address
 942     __ mov(rsp, r13);           // set sp to sender sp
 943     __ jmp(rdi);
 944 
 945     // generate a vanilla native entry as the slow path
 946     __ bind(slow_path);
 947 
 948     (void) generate_native_entry(false);
 949 
 950     return entry;
 951   }
 952   return generate_native_entry(false);
 953 }
 954 
 955 // Interpreter stub for calling a native method. (asm interpreter)
 956 // This sets up a somewhat different looking stack for calling the
 957 // native method than the typical interpreter frame setup.
 958 address InterpreterGenerator::generate_native_entry(bool synchronized) {
 959   // determine code generation flags
 960   bool inc_counter  = UseCompiler || CountCompiledCalls;
 961 
 962   // rbx: Method*
 963   // r13: sender sp
 964 
 965   address entry_point = __ pc();
 966 
 967   const Address constMethod       (rbx, Method::const_offset());
 968   const Address access_flags      (rbx, Method::access_flags_offset());
 969   const Address size_of_parameters(rcx, ConstMethod::
 970                                         size_of_parameters_offset());
 971 
 972 
 973   // get parameter size (always needed)


1604 //   ...
1605 // [ monitor entry      ]
1606 // [ expr. stack bottom ]
1607 // [ saved r13          ]
1608 // [ current r14        ]
1609 // [ Method*            ]
1610 // [ saved ebp          ] <--- rbp
1611 // [ return address     ]
1612 // [ local variable m   ]
1613 //   ...
1614 // [ local variable 1   ]
1615 // [ parameter n        ]
1616 //   ...
1617 // [ parameter 1        ] <--- r14
1618 
1619 address AbstractInterpreterGenerator::generate_method_entry(
1620                                         AbstractInterpreter::MethodKind kind) {
1621   // determine code generation flags
1622   bool synchronized = false;
1623   address entry_point = NULL;
1624   InterpreterGenerator* ig_this = (InterpreterGenerator*)this;
1625 
1626   switch (kind) {
1627   case Interpreter::zerolocals             :                                                      break;
1628   case Interpreter::zerolocals_synchronized: synchronized = true;                                 break;
1629   case Interpreter::native                 : entry_point = ig_this->generate_native_entry(false); break;
1630   case Interpreter::native_synchronized    : entry_point = ig_this->generate_native_entry(true);  break;
1631   case Interpreter::empty                  : entry_point = ig_this->generate_empty_entry();       break;
1632   case Interpreter::accessor               : entry_point = ig_this->generate_accessor_entry();    break;
1633   case Interpreter::abstract               : entry_point = ig_this->generate_abstract_entry();    break;
1634 
1635   case Interpreter::java_lang_math_sin     : // fall thru
1636   case Interpreter::java_lang_math_cos     : // fall thru
1637   case Interpreter::java_lang_math_tan     : // fall thru
1638   case Interpreter::java_lang_math_abs     : // fall thru
1639   case Interpreter::java_lang_math_log     : // fall thru
1640   case Interpreter::java_lang_math_log10   : // fall thru
1641   case Interpreter::java_lang_math_sqrt    : // fall thru
1642   case Interpreter::java_lang_math_pow     : // fall thru
1643   case Interpreter::java_lang_math_exp     : entry_point = ig_this->generate_math_entry(kind);      break;
1644   case Interpreter::java_lang_ref_reference_get
1645                                            : entry_point = ig_this->generate_Reference_get_entry(); break;
1646   case Interpreter::java_util_zip_CRC32_update
1647                                            : entry_point = ig_this->generate_CRC32_update_entry();  break;
1648   case Interpreter::java_util_zip_CRC32_updateBytes
1649                                            : // fall thru
1650   case Interpreter::java_util_zip_CRC32_updateByteBuffer
1651                                            : entry_point = ig_this->generate_CRC32_updateBytes_entry(kind); break;
1652   default:
1653     fatal(err_msg("unexpected method kind: %d", kind));
1654     break;
1655   }
1656 
1657   if (entry_point) {
1658     return entry_point;
1659   }
1660 
1661   return ig_this->generate_normal_entry(synchronized);

1662 }
1663 
1664 // These should never be compiled since the interpreter will prefer
1665 // the compiled version to the intrinsic version.
1666 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1667   switch (method_kind(m)) {
1668     case Interpreter::java_lang_math_sin     : // fall thru
1669     case Interpreter::java_lang_math_cos     : // fall thru
1670     case Interpreter::java_lang_math_tan     : // fall thru
1671     case Interpreter::java_lang_math_abs     : // fall thru
1672     case Interpreter::java_lang_math_log     : // fall thru
1673     case Interpreter::java_lang_math_log10   : // fall thru
1674     case Interpreter::java_lang_math_sqrt    : // fall thru
1675     case Interpreter::java_lang_math_pow     : // fall thru
1676     case Interpreter::java_lang_math_exp     :
1677       return false;
1678     default:
1679       return true;
1680   }
1681 }


src/cpu/x86/vm/templateInterpreter_x86_64.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File