src/cpu/x86/vm/templateInterpreter_x86_32.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_32.cpp

Print this page




 851                             true /* expand_call */);
 852 
 853     // _areturn
 854     __ pop(rsi);                // get sender sp
 855     __ pop(rdi);                // get return address
 856     __ mov(rsp, rsi);           // set sp to sender sp
 857     __ jmp(rdi);
 858 
 859     __ bind(slow_path);
 860     (void) generate_normal_entry(false);
 861 
 862     return entry;
 863   }
 864 #endif // INCLUDE_ALL_GCS
 865 
 866   // If G1 is not enabled then attempt to go through the accessor entry point
 867   // Reference.get is an accessor
 868   return generate_accessor_entry();
 869 }
 870 


















































































































 871 //
 872 // Interpreter stub for calling a native method. (asm interpreter)
 873 // This sets up a somewhat different looking stack for calling the native method
 874 // than the typical interpreter frame setup.
 875 //
 876 
 877 address InterpreterGenerator::generate_native_entry(bool synchronized) {
 878   // determine code generation flags
 879   bool inc_counter  = UseCompiler || CountCompiledCalls;
 880 
 881   // rbx,: Method*
 882   // rsi: sender sp
 883   // rsi: previous interpreter state (C++ interpreter) must preserve
 884   address entry_point = __ pc();
 885 
 886   const Address constMethod       (rbx, Method::const_offset());
 887   const Address access_flags      (rbx, Method::access_flags_offset());
 888   const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
 889 
 890   // get parameter size (always needed)


1484 // [ monitor entry      ] <--- rsp
1485 //   ...
1486 // [ monitor entry      ]
1487 // [ expr. stack bottom ]
1488 // [ saved rsi          ]
1489 // [ current rdi        ]
1490 // [ Method*            ]
1491 // [ saved rbp,          ] <--- rbp,
1492 // [ return address     ]
1493 // [ local variable m   ]
1494 //   ...
1495 // [ local variable 1   ]
1496 // [ parameter n        ]
1497 //   ...
1498 // [ parameter 1        ] <--- rdi
1499 
1500 address AbstractInterpreterGenerator::generate_method_entry(AbstractInterpreter::MethodKind kind) {
1501   // determine code generation flags
1502   bool synchronized = false;
1503   address entry_point = NULL;

1504 
1505   switch (kind) {
1506     case Interpreter::zerolocals             :                                                                             break;
1507     case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
1508     case Interpreter::native                 : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false);  break;
1509     case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true);   break;
1510     case Interpreter::empty                  : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry();        break;
1511     case Interpreter::accessor               : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry();     break;
1512     case Interpreter::abstract               : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry();     break;
1513 
1514     case Interpreter::java_lang_math_sin     : // fall thru
1515     case Interpreter::java_lang_math_cos     : // fall thru
1516     case Interpreter::java_lang_math_tan     : // fall thru
1517     case Interpreter::java_lang_math_abs     : // fall thru
1518     case Interpreter::java_lang_math_log     : // fall thru
1519     case Interpreter::java_lang_math_log10   : // fall thru
1520     case Interpreter::java_lang_math_sqrt    : // fall thru
1521     case Interpreter::java_lang_math_pow     : // fall thru
1522     case Interpreter::java_lang_math_exp     : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind);     break;
1523     case Interpreter::java_lang_ref_reference_get
1524                                              : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;






1525     default:
1526       fatal(err_msg("unexpected method kind: %d", kind));
1527       break;
1528   }
1529 
1530   if (entry_point) return entry_point;
1531 
1532   return ((InterpreterGenerator*)this)->generate_normal_entry(synchronized);
1533 
1534 }
1535 
1536 // These should never be compiled since the interpreter will prefer
1537 // the compiled version to the intrinsic version.
1538 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1539   switch (method_kind(m)) {
1540     case Interpreter::java_lang_math_sin     : // fall thru
1541     case Interpreter::java_lang_math_cos     : // fall thru
1542     case Interpreter::java_lang_math_tan     : // fall thru
1543     case Interpreter::java_lang_math_abs     : // fall thru
1544     case Interpreter::java_lang_math_log     : // fall thru
1545     case Interpreter::java_lang_math_log10   : // fall thru
1546     case Interpreter::java_lang_math_sqrt    : // fall thru
1547     case Interpreter::java_lang_math_pow     : // fall thru
1548     case Interpreter::java_lang_math_exp     :
1549       return false;
1550     default:
1551       return true;
1552   }




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


1598 // [ monitor entry      ] <--- rsp
1599 //   ...
1600 // [ monitor entry      ]
1601 // [ expr. stack bottom ]
1602 // [ saved rsi          ]
1603 // [ current rdi        ]
1604 // [ Method*            ]
1605 // [ saved rbp,          ] <--- rbp,
1606 // [ return address     ]
1607 // [ local variable m   ]
1608 //   ...
1609 // [ local variable 1   ]
1610 // [ parameter n        ]
1611 //   ...
1612 // [ parameter 1        ] <--- rdi
1613 
1614 address AbstractInterpreterGenerator::generate_method_entry(AbstractInterpreter::MethodKind kind) {
1615   // determine code generation flags
1616   bool synchronized = false;
1617   address entry_point = NULL;
1618   InterpreterGenerator* ig_this = (InterpreterGenerator*)this;
1619 
1620   switch (kind) {
1621     case Interpreter::zerolocals             :                                                       break;
1622     case Interpreter::zerolocals_synchronized: synchronized = true;                                  break;
1623     case Interpreter::native                 : entry_point = ig_this->generate_native_entry(false);  break;
1624     case Interpreter::native_synchronized    : entry_point = ig_this->generate_native_entry(true);   break;
1625     case Interpreter::empty                  : entry_point = ig_this->generate_empty_entry();        break;
1626     case Interpreter::accessor               : entry_point = ig_this->generate_accessor_entry();     break;
1627     case Interpreter::abstract               : entry_point = ig_this->generate_abstract_entry();     break;
1628 
1629     case Interpreter::java_lang_math_sin     : // fall thru
1630     case Interpreter::java_lang_math_cos     : // fall thru
1631     case Interpreter::java_lang_math_tan     : // fall thru
1632     case Interpreter::java_lang_math_abs     : // fall thru
1633     case Interpreter::java_lang_math_log     : // fall thru
1634     case Interpreter::java_lang_math_log10   : // fall thru
1635     case Interpreter::java_lang_math_sqrt    : // fall thru
1636     case Interpreter::java_lang_math_pow     : // fall thru
1637     case Interpreter::java_lang_math_exp     : entry_point = ig_this->generate_math_entry(kind);      break;
1638     case Interpreter::java_lang_ref_reference_get
1639                                              : entry_point = ig_this->generate_Reference_get_entry(); break;
1640     case Interpreter::java_util_zip_CRC32_update
1641                                              : entry_point = ig_this->generate_CRC32_update_entry();  break;
1642     case Interpreter::java_util_zip_CRC32_updateBytes
1643                                              : // fall thru
1644     case Interpreter::java_util_zip_CRC32_updateByteBuffer
1645                                              : entry_point = ig_this->generate_CRC32_updateBytes_entry(kind); break;
1646     default:
1647       fatal(err_msg("unexpected method kind: %d", kind));
1648       break;
1649   }
1650 
1651   if (entry_point) return entry_point;
1652 
1653   return ig_this->generate_normal_entry(synchronized);
1654 
1655 }
1656 
1657 // These should never be compiled since the interpreter will prefer
1658 // the compiled version to the intrinsic version.
1659 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1660   switch (method_kind(m)) {
1661     case Interpreter::java_lang_math_sin     : // fall thru
1662     case Interpreter::java_lang_math_cos     : // fall thru
1663     case Interpreter::java_lang_math_tan     : // fall thru
1664     case Interpreter::java_lang_math_abs     : // fall thru
1665     case Interpreter::java_lang_math_log     : // fall thru
1666     case Interpreter::java_lang_math_log10   : // fall thru
1667     case Interpreter::java_lang_math_sqrt    : // fall thru
1668     case Interpreter::java_lang_math_pow     : // fall thru
1669     case Interpreter::java_lang_math_exp     :
1670       return false;
1671     default:
1672       return true;
1673   }


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