< prev index next >

src/hotspot/share/interpreter/templateInterpreterGenerator.cpp

Print this page




  61 
  62   { CodeletMark cm(_masm, "error exits");
  63     _unimplemented_bytecode    = generate_error_exit("unimplemented bytecode");
  64     _illegal_bytecode_sequence = generate_error_exit("illegal bytecode sequence - method not verified");
  65   }
  66 
  67 #ifndef PRODUCT
  68   if (TraceBytecodes) {
  69     CodeletMark cm(_masm, "bytecode tracing support");
  70     Interpreter::_trace_code =
  71       EntryPoint(
  72                  generate_trace_code(btos),
  73                  generate_trace_code(ztos),
  74                  generate_trace_code(ctos),
  75                  generate_trace_code(stos),
  76                  generate_trace_code(atos),
  77                  generate_trace_code(itos),
  78                  generate_trace_code(ltos),
  79                  generate_trace_code(ftos),
  80                  generate_trace_code(dtos),
  81                  generate_trace_code(qtos),
  82                  generate_trace_code(vtos)
  83                  );
  84   }
  85 #endif // !PRODUCT
  86 
  87   { CodeletMark cm(_masm, "return entry points");
  88     const int index_size = sizeof(u2);
  89     Interpreter::_return_entry[0] = EntryPoint();
  90     for (int i = 1; i < Interpreter::number_of_return_entries; i++) {
  91       address return_itos = generate_return_entry_for(itos, i, index_size);
  92       Interpreter::_return_entry[i] =
  93         EntryPoint(
  94                    return_itos,
  95                    return_itos,
  96                    return_itos,
  97                    return_itos,
  98                    generate_return_entry_for(atos, i, index_size),
  99                    return_itos,
 100                    generate_return_entry_for(ltos, i, index_size),
 101                    generate_return_entry_for(ftos, i, index_size),
 102                    generate_return_entry_for(dtos, i, index_size),
 103                    generate_return_entry_for(qtos, i, index_size),
 104                    generate_return_entry_for(vtos, i, index_size)
 105                    );
 106     }
 107   }
 108 
 109   { CodeletMark cm(_masm, "invoke return entry points");
 110     // These states are in order specified in TosState, except btos/ztos/ctos/stos are
 111     // really the same as itos since there is no top of stack optimization for these types
 112     const TosState states[] = {itos, itos, itos, itos, itos, ltos, ftos, dtos, atos, qtos, vtos, ilgl};
 113     const int invoke_length = Bytecodes::length_for(Bytecodes::_invokestatic);
 114     const int invokeinterface_length = Bytecodes::length_for(Bytecodes::_invokeinterface);
 115     const int invokedynamic_length = Bytecodes::length_for(Bytecodes::_invokedynamic);
 116 
 117     for (int i = 0; i < Interpreter::number_of_return_addrs; i++) {
 118       TosState state = states[i];
 119       assert(state != ilgl, "states array is wrong above");
 120       Interpreter::_invoke_return_entry[i] = generate_return_entry_for(state, invoke_length, sizeof(u2));
 121       Interpreter::_invokeinterface_return_entry[i] = generate_return_entry_for(state, invokeinterface_length, sizeof(u2));
 122       Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4));
 123     }
 124   }
 125 
 126   { CodeletMark cm(_masm, "earlyret entry points");
 127     Interpreter::_earlyret_entry =
 128       EntryPoint(
 129                  generate_earlyret_entry_for(btos),
 130                  generate_earlyret_entry_for(ztos),
 131                  generate_earlyret_entry_for(ctos),
 132                  generate_earlyret_entry_for(stos),
 133                  generate_earlyret_entry_for(atos),
 134                  generate_earlyret_entry_for(itos),
 135                  generate_earlyret_entry_for(ltos),
 136                  generate_earlyret_entry_for(ftos),
 137                  generate_earlyret_entry_for(dtos),
 138                  generate_earlyret_entry_for(qtos),
 139                  generate_earlyret_entry_for(vtos)
 140                  );
 141   }
 142 
 143   { CodeletMark cm(_masm, "result handlers for native calls");
 144     // The various result converter stublets.
 145     int is_generated[Interpreter::number_of_result_handlers];
 146     memset(is_generated, 0, sizeof(is_generated));
 147 
 148     for (int i = 0; i < Interpreter::number_of_result_handlers; i++) {
 149       BasicType type = types[i];
 150       if (!is_generated[Interpreter::BasicType_as_index(type)]++) {
 151         Interpreter::_native_abi_to_tosca[Interpreter::BasicType_as_index(type)] = generate_result_handler_for(type);
 152       }
 153     }
 154   }
 155 
 156 
 157   { CodeletMark cm(_masm, "safepoint entry points");
 158     Interpreter::_safept_entry =
 159       EntryPoint(
 160                  generate_safept_entry_for(btos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 161                  generate_safept_entry_for(ztos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 162                  generate_safept_entry_for(ctos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 163                  generate_safept_entry_for(stos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 164                  generate_safept_entry_for(atos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 165                  generate_safept_entry_for(itos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 166                  generate_safept_entry_for(ltos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 167                  generate_safept_entry_for(ftos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 168                  generate_safept_entry_for(dtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 169                  generate_safept_entry_for(qtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 170                  generate_safept_entry_for(vtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint))
 171                  );
 172   }
 173 
 174   { CodeletMark cm(_masm, "exception handling");
 175     // (Note: this is not safepoint safe because thread may return to compiled code)
 176     generate_throw_exception();
 177   }
 178 
 179   { CodeletMark cm(_masm, "throw exception entrypoints");
 180     Interpreter::_throw_ArrayIndexOutOfBoundsException_entry = generate_ArrayIndexOutOfBounds_handler("java/lang/ArrayIndexOutOfBoundsException");
 181     Interpreter::_throw_ArrayStoreException_entry            = generate_klass_exception_handler("java/lang/ArrayStoreException"                 );
 182     Interpreter::_throw_ArithmeticException_entry            = generate_exception_handler("java/lang/ArithmeticException"           , "/ by zero");
 183     Interpreter::_throw_ClassCastException_entry             = generate_ClassCastException_handler();
 184     Interpreter::_throw_NullPointerException_entry           = generate_exception_handler("java/lang/NullPointerException"          , NULL       );
 185     Interpreter::_throw_StackOverflowError_entry             = generate_StackOverflowError_handler();
 186   }
 187 
 188 
 189 


 239   // installation of code in other places in the runtime
 240   // (ExcutableCodeManager calls not needed to copy the entries)
 241   set_safepoints_for_all_bytes();
 242 
 243   { CodeletMark cm(_masm, "deoptimization entry points");
 244     Interpreter::_deopt_entry[0] = EntryPoint();
 245     Interpreter::_deopt_entry[0].set_entry(vtos, generate_deopt_entry_for(vtos, 0));
 246     for (int i = 1; i < Interpreter::number_of_deopt_entries; i++) {
 247       address deopt_itos = generate_deopt_entry_for(itos, i);
 248       Interpreter::_deopt_entry[i] =
 249         EntryPoint(
 250                    deopt_itos, /* btos */
 251                    deopt_itos, /* ztos */
 252                    deopt_itos, /* ctos */
 253                    deopt_itos, /* stos */
 254                    generate_deopt_entry_for(atos, i),
 255                    deopt_itos, /* itos */
 256                    generate_deopt_entry_for(ltos, i),
 257                    generate_deopt_entry_for(ftos, i),
 258                    generate_deopt_entry_for(dtos, i),
 259                    generate_deopt_entry_for(qtos, i),
 260                    generate_deopt_entry_for(vtos, i)
 261                    );
 262     }
 263     address return_continuation = Interpreter::_normal_table.entry(Bytecodes::_return).entry(vtos);
 264     vmassert(return_continuation != NULL, "return entry not generated yet");
 265     Interpreter::_deopt_reexecute_return_entry = generate_deopt_entry_for(vtos, 0, return_continuation);
 266   }
 267 
 268 }
 269 
 270 //------------------------------------------------------------------------------------------------------------------------
 271 
 272 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) {
 273   address entry = __ pc();
 274   __ stop(msg);
 275   return entry;
 276 }
 277 
 278 
 279 //------------------------------------------------------------------------------------------------------------------------


 283     Bytecodes::Code code = (Bytecodes::Code)i;
 284     if (Bytecodes::is_defined(code)) {
 285       set_entry_points(code);
 286     } else {
 287       set_unimplemented(i);
 288     }
 289   }
 290 }
 291 
 292 
 293 void TemplateInterpreterGenerator::set_safepoints_for_all_bytes() {
 294   for (int i = 0; i < DispatchTable::length; i++) {
 295     Bytecodes::Code code = (Bytecodes::Code)i;
 296     if (Bytecodes::is_defined(code)) Interpreter::_safept_table.set_entry(code, Interpreter::_safept_entry);
 297   }
 298 }
 299 
 300 
 301 void TemplateInterpreterGenerator::set_unimplemented(int i) {
 302   address e = _unimplemented_bytecode;
 303   EntryPoint entry(e, e, e, e, e, e, e, e, e, e, e);
 304   Interpreter::_normal_table.set_entry(i, entry);
 305   Interpreter::_wentry_point[i] = _unimplemented_bytecode;
 306 }
 307 
 308 
 309 void TemplateInterpreterGenerator::set_entry_points(Bytecodes::Code code) {
 310   CodeletMark cm(_masm, Bytecodes::name(code), code);
 311   // initialize entry points
 312   assert(_unimplemented_bytecode    != NULL, "should have been generated before");
 313   assert(_illegal_bytecode_sequence != NULL, "should have been generated before");
 314   address bep = _illegal_bytecode_sequence;
 315   address zep = _illegal_bytecode_sequence;
 316   address cep = _illegal_bytecode_sequence;
 317   address sep = _illegal_bytecode_sequence;
 318   address aep = _illegal_bytecode_sequence;
 319   address iep = _illegal_bytecode_sequence;
 320   address lep = _illegal_bytecode_sequence;
 321   address fep = _illegal_bytecode_sequence;
 322   address dep = _illegal_bytecode_sequence;
 323   address qep = _illegal_bytecode_sequence;
 324   address vep = _unimplemented_bytecode;
 325   address wep = _unimplemented_bytecode;
 326   // code for short & wide version of bytecode
 327   if (Bytecodes::is_defined(code)) {
 328     Template* t = TemplateTable::template_for(code);
 329     assert(t->is_valid(), "just checking");
 330     set_short_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, qep, vep);
 331   }
 332   if (Bytecodes::wide_is_defined(code)) {
 333     Template* t = TemplateTable::template_for_wide(code);
 334     assert(t->is_valid(), "just checking");
 335     set_wide_entry_point(t, wep);
 336   }
 337   // set entry points
 338   EntryPoint entry(bep, zep, cep, sep, aep, iep, lep, fep, dep, qep, vep);
 339   Interpreter::_normal_table.set_entry(code, entry);
 340   Interpreter::_wentry_point[code] = wep;
 341 }
 342 
 343 
 344 void TemplateInterpreterGenerator::set_wide_entry_point(Template* t, address& wep) {
 345   assert(t->is_valid(), "template must exist");
 346   assert(t->tos_in() == vtos, "only vtos tos_in supported for wide instructions");
 347   wep = __ pc(); generate_and_dispatch(t);
 348 }
 349 
 350 
 351 void TemplateInterpreterGenerator::set_short_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& qep, address& vep) {
 352   assert(t->is_valid(), "template must exist");
 353   switch (t->tos_in()) {
 354     case btos:
 355     case ztos:
 356     case ctos:
 357     case stos:
 358       ShouldNotReachHere();  // btos/ctos/stos should use itos.
 359       break;
 360     case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break;
 361     case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break;
 362     case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break;
 363     case ftos: vep = __ pc(); __ pop(ftos); fep = __ pc(); generate_and_dispatch(t); break;
 364     case dtos: vep = __ pc(); __ pop(dtos); dep = __ pc(); generate_and_dispatch(t); break;
 365     case qtos: vep = __ pc(); __ pop(qtos); qep = __ pc(); generate_and_dispatch(t); break;
 366     case vtos: set_vtos_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, qep, vep);     break;
 367     case ptos: vep = __ pc(); __ pop(ptos); aep = __ pc(); qep = __ pc(); generate_and_dispatch(t); break;
 368     default  : ShouldNotReachHere();                                                 break;
 369   }
 370 }
 371 
 372 
 373 //------------------------------------------------------------------------------------------------------------------------
 374 
 375 void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) {
 376   if (PrintBytecodeHistogram)                                    histogram_bytecode(t);
 377 #ifndef PRODUCT
 378   // debugging code
 379   if (CountBytecodes || TraceBytecodes || StopInterpreterAt > 0) count_bytecode();
 380   if (PrintBytecodePairHistogram)                                histogram_bytecode_pair(t);
 381   if (TraceBytecodes)                                            trace_bytecode(t);
 382   if (StopInterpreterAt > 0)                                     stop_interpreter_at();
 383   __ verify_FPU(1, t->tos_in());
 384 #endif // !PRODUCT
 385   int step = 0;
 386   if (!t->does_dispatch()) {
 387     step = t->is_wide() ? Bytecodes::wide_length_for(t->bytecode()) : Bytecodes::length_for(t->bytecode());




  61 
  62   { CodeletMark cm(_masm, "error exits");
  63     _unimplemented_bytecode    = generate_error_exit("unimplemented bytecode");
  64     _illegal_bytecode_sequence = generate_error_exit("illegal bytecode sequence - method not verified");
  65   }
  66 
  67 #ifndef PRODUCT
  68   if (TraceBytecodes) {
  69     CodeletMark cm(_masm, "bytecode tracing support");
  70     Interpreter::_trace_code =
  71       EntryPoint(
  72                  generate_trace_code(btos),
  73                  generate_trace_code(ztos),
  74                  generate_trace_code(ctos),
  75                  generate_trace_code(stos),
  76                  generate_trace_code(atos),
  77                  generate_trace_code(itos),
  78                  generate_trace_code(ltos),
  79                  generate_trace_code(ftos),
  80                  generate_trace_code(dtos),

  81                  generate_trace_code(vtos)
  82                  );
  83   }
  84 #endif // !PRODUCT
  85 
  86   { CodeletMark cm(_masm, "return entry points");
  87     const int index_size = sizeof(u2);
  88     Interpreter::_return_entry[0] = EntryPoint();
  89     for (int i = 1; i < Interpreter::number_of_return_entries; i++) {
  90       address return_itos = generate_return_entry_for(itos, i, index_size);
  91       Interpreter::_return_entry[i] =
  92         EntryPoint(
  93                    return_itos,
  94                    return_itos,
  95                    return_itos,
  96                    return_itos,
  97                    generate_return_entry_for(atos, i, index_size),
  98                    return_itos,
  99                    generate_return_entry_for(ltos, i, index_size),
 100                    generate_return_entry_for(ftos, i, index_size),
 101                    generate_return_entry_for(dtos, i, index_size),

 102                    generate_return_entry_for(vtos, i, index_size)
 103                    );
 104     }
 105   }
 106 
 107   { CodeletMark cm(_masm, "invoke return entry points");
 108     // These states are in order specified in TosState, except btos/ztos/ctos/stos are
 109     // really the same as itos since there is no top of stack optimization for these types
 110     const TosState states[] = {itos, itos, itos, itos, itos, ltos, ftos, dtos, atos, vtos, ilgl};
 111     const int invoke_length = Bytecodes::length_for(Bytecodes::_invokestatic);
 112     const int invokeinterface_length = Bytecodes::length_for(Bytecodes::_invokeinterface);
 113     const int invokedynamic_length = Bytecodes::length_for(Bytecodes::_invokedynamic);
 114 
 115     for (int i = 0; i < Interpreter::number_of_return_addrs; i++) {
 116       TosState state = states[i];
 117       assert(state != ilgl, "states array is wrong above");
 118       Interpreter::_invoke_return_entry[i] = generate_return_entry_for(state, invoke_length, sizeof(u2));
 119       Interpreter::_invokeinterface_return_entry[i] = generate_return_entry_for(state, invokeinterface_length, sizeof(u2));
 120       Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4));
 121     }
 122   }
 123 
 124   { CodeletMark cm(_masm, "earlyret entry points");
 125     Interpreter::_earlyret_entry =
 126       EntryPoint(
 127                  generate_earlyret_entry_for(btos),
 128                  generate_earlyret_entry_for(ztos),
 129                  generate_earlyret_entry_for(ctos),
 130                  generate_earlyret_entry_for(stos),
 131                  generate_earlyret_entry_for(atos),
 132                  generate_earlyret_entry_for(itos),
 133                  generate_earlyret_entry_for(ltos),
 134                  generate_earlyret_entry_for(ftos),
 135                  generate_earlyret_entry_for(dtos),

 136                  generate_earlyret_entry_for(vtos)
 137                  );
 138   }
 139 
 140   { CodeletMark cm(_masm, "result handlers for native calls");
 141     // The various result converter stublets.
 142     int is_generated[Interpreter::number_of_result_handlers];
 143     memset(is_generated, 0, sizeof(is_generated));
 144 
 145     for (int i = 0; i < Interpreter::number_of_result_handlers; i++) {
 146       BasicType type = types[i];
 147       if (!is_generated[Interpreter::BasicType_as_index(type)]++) {
 148         Interpreter::_native_abi_to_tosca[Interpreter::BasicType_as_index(type)] = generate_result_handler_for(type);
 149       }
 150     }
 151   }
 152 
 153 
 154   { CodeletMark cm(_masm, "safepoint entry points");
 155     Interpreter::_safept_entry =
 156       EntryPoint(
 157                  generate_safept_entry_for(btos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 158                  generate_safept_entry_for(ztos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 159                  generate_safept_entry_for(ctos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 160                  generate_safept_entry_for(stos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 161                  generate_safept_entry_for(atos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 162                  generate_safept_entry_for(itos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 163                  generate_safept_entry_for(ltos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 164                  generate_safept_entry_for(ftos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
 165                  generate_safept_entry_for(dtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),

 166                  generate_safept_entry_for(vtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint))
 167                  );
 168   }
 169 
 170   { CodeletMark cm(_masm, "exception handling");
 171     // (Note: this is not safepoint safe because thread may return to compiled code)
 172     generate_throw_exception();
 173   }
 174 
 175   { CodeletMark cm(_masm, "throw exception entrypoints");
 176     Interpreter::_throw_ArrayIndexOutOfBoundsException_entry = generate_ArrayIndexOutOfBounds_handler("java/lang/ArrayIndexOutOfBoundsException");
 177     Interpreter::_throw_ArrayStoreException_entry            = generate_klass_exception_handler("java/lang/ArrayStoreException"                 );
 178     Interpreter::_throw_ArithmeticException_entry            = generate_exception_handler("java/lang/ArithmeticException"           , "/ by zero");
 179     Interpreter::_throw_ClassCastException_entry             = generate_ClassCastException_handler();
 180     Interpreter::_throw_NullPointerException_entry           = generate_exception_handler("java/lang/NullPointerException"          , NULL       );
 181     Interpreter::_throw_StackOverflowError_entry             = generate_StackOverflowError_handler();
 182   }
 183 
 184 
 185 


 235   // installation of code in other places in the runtime
 236   // (ExcutableCodeManager calls not needed to copy the entries)
 237   set_safepoints_for_all_bytes();
 238 
 239   { CodeletMark cm(_masm, "deoptimization entry points");
 240     Interpreter::_deopt_entry[0] = EntryPoint();
 241     Interpreter::_deopt_entry[0].set_entry(vtos, generate_deopt_entry_for(vtos, 0));
 242     for (int i = 1; i < Interpreter::number_of_deopt_entries; i++) {
 243       address deopt_itos = generate_deopt_entry_for(itos, i);
 244       Interpreter::_deopt_entry[i] =
 245         EntryPoint(
 246                    deopt_itos, /* btos */
 247                    deopt_itos, /* ztos */
 248                    deopt_itos, /* ctos */
 249                    deopt_itos, /* stos */
 250                    generate_deopt_entry_for(atos, i),
 251                    deopt_itos, /* itos */
 252                    generate_deopt_entry_for(ltos, i),
 253                    generate_deopt_entry_for(ftos, i),
 254                    generate_deopt_entry_for(dtos, i),

 255                    generate_deopt_entry_for(vtos, i)
 256                    );
 257     }
 258     address return_continuation = Interpreter::_normal_table.entry(Bytecodes::_return).entry(vtos);
 259     vmassert(return_continuation != NULL, "return entry not generated yet");
 260     Interpreter::_deopt_reexecute_return_entry = generate_deopt_entry_for(vtos, 0, return_continuation);
 261   }
 262 
 263 }
 264 
 265 //------------------------------------------------------------------------------------------------------------------------
 266 
 267 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) {
 268   address entry = __ pc();
 269   __ stop(msg);
 270   return entry;
 271 }
 272 
 273 
 274 //------------------------------------------------------------------------------------------------------------------------


 278     Bytecodes::Code code = (Bytecodes::Code)i;
 279     if (Bytecodes::is_defined(code)) {
 280       set_entry_points(code);
 281     } else {
 282       set_unimplemented(i);
 283     }
 284   }
 285 }
 286 
 287 
 288 void TemplateInterpreterGenerator::set_safepoints_for_all_bytes() {
 289   for (int i = 0; i < DispatchTable::length; i++) {
 290     Bytecodes::Code code = (Bytecodes::Code)i;
 291     if (Bytecodes::is_defined(code)) Interpreter::_safept_table.set_entry(code, Interpreter::_safept_entry);
 292   }
 293 }
 294 
 295 
 296 void TemplateInterpreterGenerator::set_unimplemented(int i) {
 297   address e = _unimplemented_bytecode;
 298   EntryPoint entry(e, e, e, e, e, e, e, e, e, e);
 299   Interpreter::_normal_table.set_entry(i, entry);
 300   Interpreter::_wentry_point[i] = _unimplemented_bytecode;
 301 }
 302 
 303 
 304 void TemplateInterpreterGenerator::set_entry_points(Bytecodes::Code code) {
 305   CodeletMark cm(_masm, Bytecodes::name(code), code);
 306   // initialize entry points
 307   assert(_unimplemented_bytecode    != NULL, "should have been generated before");
 308   assert(_illegal_bytecode_sequence != NULL, "should have been generated before");
 309   address bep = _illegal_bytecode_sequence;
 310   address zep = _illegal_bytecode_sequence;
 311   address cep = _illegal_bytecode_sequence;
 312   address sep = _illegal_bytecode_sequence;
 313   address aep = _illegal_bytecode_sequence;
 314   address iep = _illegal_bytecode_sequence;
 315   address lep = _illegal_bytecode_sequence;
 316   address fep = _illegal_bytecode_sequence;
 317   address dep = _illegal_bytecode_sequence;

 318   address vep = _unimplemented_bytecode;
 319   address wep = _unimplemented_bytecode;
 320   // code for short & wide version of bytecode
 321   if (Bytecodes::is_defined(code)) {
 322     Template* t = TemplateTable::template_for(code);
 323     assert(t->is_valid(), "just checking");
 324     set_short_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep);
 325   }
 326   if (Bytecodes::wide_is_defined(code)) {
 327     Template* t = TemplateTable::template_for_wide(code);
 328     assert(t->is_valid(), "just checking");
 329     set_wide_entry_point(t, wep);
 330   }
 331   // set entry points
 332   EntryPoint entry(bep, zep, cep, sep, aep, iep, lep, fep, dep, vep);
 333   Interpreter::_normal_table.set_entry(code, entry);
 334   Interpreter::_wentry_point[code] = wep;
 335 }
 336 
 337 
 338 void TemplateInterpreterGenerator::set_wide_entry_point(Template* t, address& wep) {
 339   assert(t->is_valid(), "template must exist");
 340   assert(t->tos_in() == vtos, "only vtos tos_in supported for wide instructions");
 341   wep = __ pc(); generate_and_dispatch(t);
 342 }
 343 
 344 
 345 void TemplateInterpreterGenerator::set_short_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& vep) {
 346   assert(t->is_valid(), "template must exist");
 347   switch (t->tos_in()) {
 348     case btos:
 349     case ztos:
 350     case ctos:
 351     case stos:
 352       ShouldNotReachHere();  // btos/ctos/stos should use itos.
 353       break;
 354     case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break;
 355     case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break;
 356     case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break;
 357     case ftos: vep = __ pc(); __ pop(ftos); fep = __ pc(); generate_and_dispatch(t); break;
 358     case dtos: vep = __ pc(); __ pop(dtos); dep = __ pc(); generate_and_dispatch(t); break;
 359     case vtos: set_vtos_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep);     break;


 360     default  : ShouldNotReachHere();                                                 break;
 361   }
 362 }
 363 
 364 
 365 //------------------------------------------------------------------------------------------------------------------------
 366 
 367 void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) {
 368   if (PrintBytecodeHistogram)                                    histogram_bytecode(t);
 369 #ifndef PRODUCT
 370   // debugging code
 371   if (CountBytecodes || TraceBytecodes || StopInterpreterAt > 0) count_bytecode();
 372   if (PrintBytecodePairHistogram)                                histogram_bytecode_pair(t);
 373   if (TraceBytecodes)                                            trace_bytecode(t);
 374   if (StopInterpreterAt > 0)                                     stop_interpreter_at();
 375   __ verify_FPU(1, t->tos_in());
 376 #endif // !PRODUCT
 377   int step = 0;
 378   if (!t->does_dispatch()) {
 379     step = t->is_wide() ? Bytecodes::wide_length_for(t->bytecode()) : Bytecodes::length_for(t->bytecode());


< prev index next >