src/hotspot/share/interpreter/templateInterpreterGenerator.cpp
changeset 47916 bdbef8638948
parent 47216 71c04702a3d5
child 49480 d7df2dd501ce
equal deleted inserted replaced
47915:d4af6b80aec3 47916:bdbef8638948
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    82   }
    82   }
    83 #endif // !PRODUCT
    83 #endif // !PRODUCT
    84 
    84 
    85   { CodeletMark cm(_masm, "return entry points");
    85   { CodeletMark cm(_masm, "return entry points");
    86     const int index_size = sizeof(u2);
    86     const int index_size = sizeof(u2);
    87     for (int i = 0; i < Interpreter::number_of_return_entries; i++) {
    87     Interpreter::_return_entry[0] = EntryPoint();
       
    88     for (int i = 1; i < Interpreter::number_of_return_entries; i++) {
       
    89       address return_itos = generate_return_entry_for(itos, i, index_size);
    88       Interpreter::_return_entry[i] =
    90       Interpreter::_return_entry[i] =
    89         EntryPoint(
    91         EntryPoint(
    90                    generate_return_entry_for(itos, i, index_size),
    92                    return_itos,
    91                    generate_return_entry_for(itos, i, index_size),
    93                    return_itos,
    92                    generate_return_entry_for(itos, i, index_size),
    94                    return_itos,
    93                    generate_return_entry_for(itos, i, index_size),
    95                    return_itos,
    94                    generate_return_entry_for(atos, i, index_size),
    96                    generate_return_entry_for(atos, i, index_size),
    95                    generate_return_entry_for(itos, i, index_size),
    97                    return_itos,
    96                    generate_return_entry_for(ltos, i, index_size),
    98                    generate_return_entry_for(ltos, i, index_size),
    97                    generate_return_entry_for(ftos, i, index_size),
    99                    generate_return_entry_for(ftos, i, index_size),
    98                    generate_return_entry_for(dtos, i, index_size),
   100                    generate_return_entry_for(dtos, i, index_size),
    99                    generate_return_entry_for(vtos, i, index_size)
   101                    generate_return_entry_for(vtos, i, index_size)
   100                    );
   102                    );
   130                  generate_earlyret_entry_for(ltos),
   132                  generate_earlyret_entry_for(ltos),
   131                  generate_earlyret_entry_for(ftos),
   133                  generate_earlyret_entry_for(ftos),
   132                  generate_earlyret_entry_for(dtos),
   134                  generate_earlyret_entry_for(dtos),
   133                  generate_earlyret_entry_for(vtos)
   135                  generate_earlyret_entry_for(vtos)
   134                  );
   136                  );
   135   }
       
   136 
       
   137   { CodeletMark cm(_masm, "deoptimization entry points");
       
   138     for (int i = 0; i < Interpreter::number_of_deopt_entries; i++) {
       
   139       Interpreter::_deopt_entry[i] =
       
   140         EntryPoint(
       
   141                    generate_deopt_entry_for(itos, i),
       
   142                    generate_deopt_entry_for(itos, i),
       
   143                    generate_deopt_entry_for(itos, i),
       
   144                    generate_deopt_entry_for(itos, i),
       
   145                    generate_deopt_entry_for(atos, i),
       
   146                    generate_deopt_entry_for(itos, i),
       
   147                    generate_deopt_entry_for(ltos, i),
       
   148                    generate_deopt_entry_for(ftos, i),
       
   149                    generate_deopt_entry_for(dtos, i),
       
   150                    generate_deopt_entry_for(vtos, i)
       
   151                    );
       
   152     }
       
   153   }
   137   }
   154 
   138 
   155   { CodeletMark cm(_masm, "result handlers for native calls");
   139   { CodeletMark cm(_masm, "result handlers for native calls");
   156     // The various result converter stublets.
   140     // The various result converter stublets.
   157     int is_generated[Interpreter::number_of_result_handlers];
   141     int is_generated[Interpreter::number_of_result_handlers];
   248   set_entry_points_for_all_bytes();
   232   set_entry_points_for_all_bytes();
   249 
   233 
   250   // installation of code in other places in the runtime
   234   // installation of code in other places in the runtime
   251   // (ExcutableCodeManager calls not needed to copy the entries)
   235   // (ExcutableCodeManager calls not needed to copy the entries)
   252   set_safepoints_for_all_bytes();
   236   set_safepoints_for_all_bytes();
       
   237 
       
   238   { CodeletMark cm(_masm, "deoptimization entry points");
       
   239     Interpreter::_deopt_entry[0] = EntryPoint();
       
   240     Interpreter::_deopt_entry[0].set_entry(vtos, generate_deopt_entry_for(vtos, 0));
       
   241     for (int i = 1; i < Interpreter::number_of_deopt_entries; i++) {
       
   242       address deopt_itos = generate_deopt_entry_for(itos, i);
       
   243       Interpreter::_deopt_entry[i] =
       
   244         EntryPoint(
       
   245                    deopt_itos, /* btos */
       
   246                    deopt_itos, /* ztos */
       
   247                    deopt_itos, /* ctos */
       
   248                    deopt_itos, /* stos */
       
   249                    generate_deopt_entry_for(atos, i),
       
   250                    deopt_itos, /* itos */
       
   251                    generate_deopt_entry_for(ltos, i),
       
   252                    generate_deopt_entry_for(ftos, i),
       
   253                    generate_deopt_entry_for(dtos, i),
       
   254                    generate_deopt_entry_for(vtos, i)
       
   255                    );
       
   256     }
       
   257     address return_continuation = Interpreter::_normal_table.entry(Bytecodes::_return).entry(vtos);
       
   258     vmassert(return_continuation != NULL, "return entry not generated yet");
       
   259     Interpreter::_deopt_reexecute_return_entry = generate_deopt_entry_for(vtos, 0, return_continuation);
       
   260   }
       
   261 
   253 }
   262 }
   254 
   263 
   255 //------------------------------------------------------------------------------------------------------------------------
   264 //------------------------------------------------------------------------------------------------------------------------
   256 
   265 
   257 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) {
   266 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) {