| 1 | /* |
| 2 | * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. |
| 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| 4 | * |
| 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 |
| 7 | * published by the Free Software Foundation. |
| 8 | * |
| 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 12 | * version 2 for more details (a copy is included in the LICENSE file that |
| 13 | * accompanied this code). |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License version |
| 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
| 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| 18 | * |
| 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| 20 | * or visit www.oracle.com if you need additional information or have any |
| 21 | * questions. |
| 22 | * |
| 23 | */ |
| 24 | |
| 25 | #include "precompiled.hpp" |
| 26 | #include "gc/shared/barrierSet.hpp" |
| 27 | #include "interpreter/interp_masm.hpp" |
| 28 | #include "interpreter/templateTable.hpp" |
| 29 | #include "runtime/timerTrace.hpp" |
| 30 | |
| 31 | #ifdef CC_INTERP |
| 32 | |
| 33 | void templateTable_init() { |
| 34 | } |
| 35 | |
| 36 | #else |
| 37 | |
| 38 | //---------------------------------------------------------------------------------------------------- |
| 39 | // Implementation of Template |
| 40 | |
| 41 | |
| 42 | void Template::initialize(int flags, TosState tos_in, TosState tos_out, generator gen, int arg) { |
| 43 | _flags = flags; |
| 44 | _tos_in = tos_in; |
| 45 | _tos_out = tos_out; |
| 46 | _gen = gen; |
| 47 | _arg = arg; |
| 48 | } |
| 49 | |
| 50 | |
| 51 | Bytecodes::Code Template::bytecode() const { |
| 52 | int i = this - TemplateTable::_template_table; |
| 53 | if (i < 0 || i >= Bytecodes::number_of_codes) i = this - TemplateTable::_template_table_wide; |
| 54 | return Bytecodes::cast(i); |
| 55 | } |
| 56 | |
| 57 | |
| 58 | void Template::generate(InterpreterMacroAssembler* masm) { |
| 59 | // parameter passing |
| 60 | TemplateTable::_desc = this; |
| 61 | TemplateTable::_masm = masm; |
| 62 | // code generation |
| 63 | _gen(_arg); |
| 64 | masm->flush(); |
| 65 | } |
| 66 | |
| 67 | |
| 68 | //---------------------------------------------------------------------------------------------------- |
| 69 | // Implementation of TemplateTable: Platform-independent helper routines |
| 70 | |
| 71 | void TemplateTable::call_VM(Register oop_result, address entry_point) { |
| 72 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 73 | _masm->call_VM(oop_result, entry_point); |
| 74 | } |
| 75 | |
| 76 | |
| 77 | void TemplateTable::call_VM(Register oop_result, address entry_point, Register arg_1) { |
| 78 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 79 | _masm->call_VM(oop_result, entry_point, arg_1); |
| 80 | } |
| 81 | |
| 82 | |
| 83 | void TemplateTable::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2) { |
| 84 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 85 | _masm->call_VM(oop_result, entry_point, arg_1, arg_2); |
| 86 | } |
| 87 | |
| 88 | |
| 89 | void TemplateTable::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3) { |
| 90 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 91 | _masm->call_VM(oop_result, entry_point, arg_1, arg_2, arg_3); |
| 92 | } |
| 93 | |
| 94 | |
| 95 | void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point) { |
| 96 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 97 | _masm->call_VM(oop_result, last_java_sp, entry_point); |
| 98 | } |
| 99 | |
| 100 | |
| 101 | void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1) { |
| 102 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 103 | _masm->call_VM(oop_result, last_java_sp, entry_point, arg_1); |
| 104 | } |
| 105 | |
| 106 | |
| 107 | void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2) { |
| 108 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 109 | _masm->call_VM(oop_result, last_java_sp, entry_point, arg_1, arg_2); |
| 110 | } |
| 111 | |
| 112 | |
| 113 | void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3) { |
| 114 | assert(_desc->calls_vm(), "inconsistent calls_vm information" ); |
| 115 | _masm->call_VM(oop_result, last_java_sp, entry_point, arg_1, arg_2, arg_3); |
| 116 | } |
| 117 | |
| 118 | |
| 119 | //---------------------------------------------------------------------------------------------------- |
| 120 | // Implementation of TemplateTable: Platform-independent bytecodes |
| 121 | |
| 122 | void TemplateTable::float_cmp(int unordered_result) { |
| 123 | transition(ftos, itos); |
| 124 | float_cmp(true, unordered_result); |
| 125 | } |
| 126 | |
| 127 | |
| 128 | void TemplateTable::double_cmp(int unordered_result) { |
| 129 | transition(dtos, itos); |
| 130 | float_cmp(false, unordered_result); |
| 131 | } |
| 132 | |
| 133 | |
| 134 | void TemplateTable::_goto() { |
| 135 | transition(vtos, vtos); |
| 136 | branch(false, false); |
| 137 | } |
| 138 | |
| 139 | |
| 140 | void TemplateTable::goto_w() { |
| 141 | transition(vtos, vtos); |
| 142 | branch(false, true); |
| 143 | } |
| 144 | |
| 145 | |
| 146 | void TemplateTable::jsr_w() { |
| 147 | transition(vtos, vtos); // result is not an oop, so do not transition to atos |
| 148 | branch(true, true); |
| 149 | } |
| 150 | |
| 151 | |
| 152 | void TemplateTable::jsr() { |
| 153 | transition(vtos, vtos); // result is not an oop, so do not transition to atos |
| 154 | branch(true, false); |
| 155 | } |
| 156 | |
| 157 | |
| 158 | |
| 159 | //---------------------------------------------------------------------------------------------------- |
| 160 | // Implementation of TemplateTable: Debugging |
| 161 | |
| 162 | void TemplateTable::transition(TosState tos_in, TosState tos_out) { |
| 163 | assert(_desc->tos_in() == tos_in , "inconsistent tos_in information" ); |
| 164 | assert(_desc->tos_out() == tos_out, "inconsistent tos_out information" ); |
| 165 | } |
| 166 | |
| 167 | |
| 168 | //---------------------------------------------------------------------------------------------------- |
| 169 | // Implementation of TemplateTable: Initialization |
| 170 | |
| 171 | bool TemplateTable::_is_initialized = false; |
| 172 | Template TemplateTable::_template_table [Bytecodes::number_of_codes]; |
| 173 | Template TemplateTable::_template_table_wide[Bytecodes::number_of_codes]; |
| 174 | |
| 175 | Template* TemplateTable::_desc; |
| 176 | InterpreterMacroAssembler* TemplateTable::_masm; |
| 177 | BarrierSet* TemplateTable::_bs; |
| 178 | |
| 179 | |
| 180 | void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(), char filler) { |
| 181 | assert(filler == ' ', "just checkin'" ); |
| 182 | def(code, flags, in, out, (Template::generator)gen, 0); |
| 183 | } |
| 184 | |
| 185 | |
| 186 | void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg), int arg) { |
| 187 | // should factor out these constants |
| 188 | const int ubcp = 1 << Template::uses_bcp_bit; |
| 189 | const int disp = 1 << Template::does_dispatch_bit; |
| 190 | const int clvm = 1 << Template::calls_vm_bit; |
| 191 | const int iswd = 1 << Template::wide_bit; |
| 192 | // determine which table to use |
| 193 | bool is_wide = (flags & iswd) != 0; |
| 194 | // make sure that wide instructions have a vtos entry point |
| 195 | // (since they are executed extremely rarely, it doesn't pay out to have an |
| 196 | // extra set of 5 dispatch tables for the wide instructions - for simplicity |
| 197 | // they all go with one table) |
| 198 | assert(in == vtos || !is_wide, "wide instructions have vtos entry point only" ); |
| 199 | Template* t = is_wide ? template_for_wide(code) : template_for(code); |
| 200 | // setup entry |
| 201 | t->initialize(flags, in, out, gen, arg); |
| 202 | assert(t->bytecode() == code, "just checkin'" ); |
| 203 | } |
| 204 | |
| 205 | |
| 206 | void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op) { |
| 207 | def(code, flags, in, out, (Template::generator)gen, (int)op); |
| 208 | } |
| 209 | |
| 210 | |
| 211 | void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg ), bool arg) { |
| 212 | def(code, flags, in, out, (Template::generator)gen, (int)arg); |
| 213 | } |
| 214 | |
| 215 | |
| 216 | void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos) { |
| 217 | def(code, flags, in, out, (Template::generator)gen, (int)tos); |
| 218 | } |
| 219 | |
| 220 | |
| 221 | void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc) { |
| 222 | def(code, flags, in, out, (Template::generator)gen, (int)cc); |
| 223 | } |
| 224 | |
| 225 | void TemplateTable::initialize() { |
| 226 | if (_is_initialized) return; |
| 227 | |
| 228 | // Initialize table |
| 229 | TraceTime timer("TemplateTable initialization" , TRACETIME_LOG(Info, startuptime)); |
| 230 | |
| 231 | _bs = BarrierSet::barrier_set(); |
| 232 | |
| 233 | // For better readability |
| 234 | const char _ = ' '; |
| 235 | const int ____ = 0; |
| 236 | const int ubcp = 1 << Template::uses_bcp_bit; |
| 237 | const int disp = 1 << Template::does_dispatch_bit; |
| 238 | const int clvm = 1 << Template::calls_vm_bit; |
| 239 | const int iswd = 1 << Template::wide_bit; |
| 240 | // interpr. templates |
| 241 | // Java spec bytecodes ubcp|disp|clvm|iswd in out generator argument |
| 242 | def(Bytecodes::_nop , ____|____|____|____, vtos, vtos, nop , _ ); |
| 243 | def(Bytecodes::_aconst_null , ____|____|____|____, vtos, atos, aconst_null , _ ); |
| 244 | def(Bytecodes::_iconst_m1 , ____|____|____|____, vtos, itos, iconst , -1 ); |
| 245 | def(Bytecodes::_iconst_0 , ____|____|____|____, vtos, itos, iconst , 0 ); |
| 246 | def(Bytecodes::_iconst_1 , ____|____|____|____, vtos, itos, iconst , 1 ); |
| 247 | def(Bytecodes::_iconst_2 , ____|____|____|____, vtos, itos, iconst , 2 ); |
| 248 | def(Bytecodes::_iconst_3 , ____|____|____|____, vtos, itos, iconst , 3 ); |
| 249 | def(Bytecodes::_iconst_4 , ____|____|____|____, vtos, itos, iconst , 4 ); |
| 250 | def(Bytecodes::_iconst_5 , ____|____|____|____, vtos, itos, iconst , 5 ); |
| 251 | def(Bytecodes::_lconst_0 , ____|____|____|____, vtos, ltos, lconst , 0 ); |
| 252 | def(Bytecodes::_lconst_1 , ____|____|____|____, vtos, ltos, lconst , 1 ); |
| 253 | def(Bytecodes::_fconst_0 , ____|____|____|____, vtos, ftos, fconst , 0 ); |
| 254 | def(Bytecodes::_fconst_1 , ____|____|____|____, vtos, ftos, fconst , 1 ); |
| 255 | def(Bytecodes::_fconst_2 , ____|____|____|____, vtos, ftos, fconst , 2 ); |
| 256 | def(Bytecodes::_dconst_0 , ____|____|____|____, vtos, dtos, dconst , 0 ); |
| 257 | def(Bytecodes::_dconst_1 , ____|____|____|____, vtos, dtos, dconst , 1 ); |
| 258 | def(Bytecodes::_bipush , ubcp|____|____|____, vtos, itos, bipush , _ ); |
| 259 | def(Bytecodes::_sipush , ubcp|____|____|____, vtos, itos, sipush , _ ); |
| 260 | def(Bytecodes::_ldc , ubcp|____|clvm|____, vtos, vtos, ldc , false ); |
| 261 | def(Bytecodes::_ldc_w , ubcp|____|clvm|____, vtos, vtos, ldc , true ); |
| 262 | def(Bytecodes::_ldc2_w , ubcp|____|clvm|____, vtos, vtos, ldc2_w , _ ); |
| 263 | def(Bytecodes::_iload , ubcp|____|clvm|____, vtos, itos, iload , _ ); |
| 264 | def(Bytecodes::_lload , ubcp|____|____|____, vtos, ltos, lload , _ ); |
| 265 | def(Bytecodes::_fload , ubcp|____|____|____, vtos, ftos, fload , _ ); |
| 266 | def(Bytecodes::_dload , ubcp|____|____|____, vtos, dtos, dload , _ ); |
| 267 | def(Bytecodes::_aload , ubcp|____|clvm|____, vtos, atos, aload , _ ); |
| 268 | def(Bytecodes::_iload_0 , ____|____|____|____, vtos, itos, iload , 0 ); |
| 269 | def(Bytecodes::_iload_1 , ____|____|____|____, vtos, itos, iload , 1 ); |
| 270 | def(Bytecodes::_iload_2 , ____|____|____|____, vtos, itos, iload , 2 ); |
| 271 | def(Bytecodes::_iload_3 , ____|____|____|____, vtos, itos, iload , 3 ); |
| 272 | def(Bytecodes::_lload_0 , ____|____|____|____, vtos, ltos, lload , 0 ); |
| 273 | def(Bytecodes::_lload_1 , ____|____|____|____, vtos, ltos, lload , 1 ); |
| 274 | def(Bytecodes::_lload_2 , ____|____|____|____, vtos, ltos, lload , 2 ); |
| 275 | def(Bytecodes::_lload_3 , ____|____|____|____, vtos, ltos, lload , 3 ); |
| 276 | def(Bytecodes::_fload_0 , ____|____|____|____, vtos, ftos, fload , 0 ); |
| 277 | def(Bytecodes::_fload_1 , ____|____|____|____, vtos, ftos, fload , 1 ); |
| 278 | def(Bytecodes::_fload_2 , ____|____|____|____, vtos, ftos, fload , 2 ); |
| 279 | def(Bytecodes::_fload_3 , ____|____|____|____, vtos, ftos, fload , 3 ); |
| 280 | def(Bytecodes::_dload_0 , ____|____|____|____, vtos, dtos, dload , 0 ); |
| 281 | def(Bytecodes::_dload_1 , ____|____|____|____, vtos, dtos, dload , 1 ); |
| 282 | def(Bytecodes::_dload_2 , ____|____|____|____, vtos, dtos, dload , 2 ); |
| 283 | def(Bytecodes::_dload_3 , ____|____|____|____, vtos, dtos, dload , 3 ); |
| 284 | def(Bytecodes::_aload_0 , ubcp|____|clvm|____, vtos, atos, aload_0 , _ ); |
| 285 | def(Bytecodes::_aload_1 , ____|____|____|____, vtos, atos, aload , 1 ); |
| 286 | def(Bytecodes::_aload_2 , ____|____|____|____, vtos, atos, aload , 2 ); |
| 287 | def(Bytecodes::_aload_3 , ____|____|____|____, vtos, atos, aload , 3 ); |
| 288 | def(Bytecodes::_iaload , ____|____|____|____, itos, itos, iaload , _ ); |
| 289 | def(Bytecodes::_laload , ____|____|____|____, itos, ltos, laload , _ ); |
| 290 | def(Bytecodes::_faload , ____|____|____|____, itos, ftos, faload , _ ); |
| 291 | def(Bytecodes::_daload , ____|____|____|____, itos, dtos, daload , _ ); |
| 292 | def(Bytecodes::_aaload , ____|____|____|____, itos, atos, aaload , _ ); |
| 293 | def(Bytecodes::_baload , ____|____|____|____, itos, itos, baload , _ ); |
| 294 | def(Bytecodes::_caload , ____|____|____|____, itos, itos, caload , _ ); |
| 295 | def(Bytecodes::_saload , ____|____|____|____, itos, itos, saload , _ ); |
| 296 | def(Bytecodes::_istore , ubcp|____|clvm|____, itos, vtos, istore , _ ); |
| 297 | def(Bytecodes::_lstore , ubcp|____|____|____, ltos, vtos, lstore , _ ); |
| 298 | def(Bytecodes::_fstore , ubcp|____|____|____, ftos, vtos, fstore , _ ); |
| 299 | def(Bytecodes::_dstore , ubcp|____|____|____, dtos, vtos, dstore , _ ); |
| 300 | def(Bytecodes::_astore , ubcp|____|clvm|____, vtos, vtos, astore , _ ); |
| 301 | def(Bytecodes::_istore_0 , ____|____|____|____, itos, vtos, istore , 0 ); |
| 302 | def(Bytecodes::_istore_1 , ____|____|____|____, itos, vtos, istore , 1 ); |
| 303 | def(Bytecodes::_istore_2 , ____|____|____|____, itos, vtos, istore , 2 ); |
| 304 | def(Bytecodes::_istore_3 , ____|____|____|____, itos, vtos, istore , 3 ); |
| 305 | def(Bytecodes::_lstore_0 , ____|____|____|____, ltos, vtos, lstore , 0 ); |
| 306 | def(Bytecodes::_lstore_1 , ____|____|____|____, ltos, vtos, lstore , 1 ); |
| 307 | def(Bytecodes::_lstore_2 , ____|____|____|____, ltos, vtos, lstore , 2 ); |
| 308 | def(Bytecodes::_lstore_3 , ____|____|____|____, ltos, vtos, lstore , 3 ); |
| 309 | def(Bytecodes::_fstore_0 , ____|____|____|____, ftos, vtos, fstore , 0 ); |
| 310 | def(Bytecodes::_fstore_1 , ____|____|____|____, ftos, vtos, fstore , 1 ); |
| 311 | def(Bytecodes::_fstore_2 , ____|____|____|____, ftos, vtos, fstore , 2 ); |
| 312 | def(Bytecodes::_fstore_3 , ____|____|____|____, ftos, vtos, fstore , 3 ); |
| 313 | def(Bytecodes::_dstore_0 , ____|____|____|____, dtos, vtos, dstore , 0 ); |
| 314 | def(Bytecodes::_dstore_1 , ____|____|____|____, dtos, vtos, dstore , 1 ); |
| 315 | def(Bytecodes::_dstore_2 , ____|____|____|____, dtos, vtos, dstore , 2 ); |
| 316 | def(Bytecodes::_dstore_3 , ____|____|____|____, dtos, vtos, dstore , 3 ); |
| 317 | def(Bytecodes::_astore_0 , ____|____|____|____, vtos, vtos, astore , 0 ); |
| 318 | def(Bytecodes::_astore_1 , ____|____|____|____, vtos, vtos, astore , 1 ); |
| 319 | def(Bytecodes::_astore_2 , ____|____|____|____, vtos, vtos, astore , 2 ); |
| 320 | def(Bytecodes::_astore_3 , ____|____|____|____, vtos, vtos, astore , 3 ); |
| 321 | def(Bytecodes::_iastore , ____|____|____|____, itos, vtos, iastore , _ ); |
| 322 | def(Bytecodes::_lastore , ____|____|____|____, ltos, vtos, lastore , _ ); |
| 323 | def(Bytecodes::_fastore , ____|____|____|____, ftos, vtos, fastore , _ ); |
| 324 | def(Bytecodes::_dastore , ____|____|____|____, dtos, vtos, dastore , _ ); |
| 325 | def(Bytecodes::_aastore , ____|____|clvm|____, vtos, vtos, aastore , _ ); |
| 326 | def(Bytecodes::_bastore , ____|____|____|____, itos, vtos, bastore , _ ); |
| 327 | def(Bytecodes::_castore , ____|____|____|____, itos, vtos, castore , _ ); |
| 328 | def(Bytecodes::_sastore , ____|____|____|____, itos, vtos, sastore , _ ); |
| 329 | def(Bytecodes::_pop , ____|____|____|____, vtos, vtos, pop , _ ); |
| 330 | def(Bytecodes::_pop2 , ____|____|____|____, vtos, vtos, pop2 , _ ); |
| 331 | def(Bytecodes::_dup , ____|____|____|____, vtos, vtos, dup , _ ); |
| 332 | def(Bytecodes::_dup_x1 , ____|____|____|____, vtos, vtos, dup_x1 , _ ); |
| 333 | def(Bytecodes::_dup_x2 , ____|____|____|____, vtos, vtos, dup_x2 , _ ); |
| 334 | def(Bytecodes::_dup2 , ____|____|____|____, vtos, vtos, dup2 , _ ); |
| 335 | def(Bytecodes::_dup2_x1 , ____|____|____|____, vtos, vtos, dup2_x1 , _ ); |
| 336 | def(Bytecodes::_dup2_x2 , ____|____|____|____, vtos, vtos, dup2_x2 , _ ); |
| 337 | def(Bytecodes::_swap , ____|____|____|____, vtos, vtos, swap , _ ); |
| 338 | def(Bytecodes::_iadd , ____|____|____|____, itos, itos, iop2 , add ); |
| 339 | def(Bytecodes::_ladd , ____|____|____|____, ltos, ltos, lop2 , add ); |
| 340 | def(Bytecodes::_fadd , ____|____|____|____, ftos, ftos, fop2 , add ); |
| 341 | def(Bytecodes::_dadd , ____|____|____|____, dtos, dtos, dop2 , add ); |
| 342 | def(Bytecodes::_isub , ____|____|____|____, itos, itos, iop2 , sub ); |
| 343 | def(Bytecodes::_lsub , ____|____|____|____, ltos, ltos, lop2 , sub ); |
| 344 | def(Bytecodes::_fsub , ____|____|____|____, ftos, ftos, fop2 , sub ); |
| 345 | def(Bytecodes::_dsub , ____|____|____|____, dtos, dtos, dop2 , sub ); |
| 346 | def(Bytecodes::_imul , ____|____|____|____, itos, itos, iop2 , mul ); |
| 347 | def(Bytecodes::_lmul , ____|____|____|____, ltos, ltos, lmul , _ ); |
| 348 | def(Bytecodes::_fmul , ____|____|____|____, ftos, ftos, fop2 , mul ); |
| 349 | def(Bytecodes::_dmul , ____|____|____|____, dtos, dtos, dop2 , mul ); |
| 350 | def(Bytecodes::_idiv , ____|____|____|____, itos, itos, idiv , _ ); |
| 351 | def(Bytecodes::_ldiv , ____|____|____|____, ltos, ltos, ldiv , _ ); |
| 352 | def(Bytecodes::_fdiv , ____|____|____|____, ftos, ftos, fop2 , div ); |
| 353 | def(Bytecodes::_ddiv , ____|____|____|____, dtos, dtos, dop2 , div ); |
| 354 | def(Bytecodes::_irem , ____|____|____|____, itos, itos, irem , _ ); |
| 355 | def(Bytecodes::_lrem , ____|____|____|____, ltos, ltos, lrem , _ ); |
| 356 | def(Bytecodes::_frem , ____|____|____|____, ftos, ftos, fop2 , rem ); |
| 357 | def(Bytecodes::_drem , ____|____|____|____, dtos, dtos, dop2 , rem ); |
| 358 | def(Bytecodes::_ineg , ____|____|____|____, itos, itos, ineg , _ ); |
| 359 | def(Bytecodes::_lneg , ____|____|____|____, ltos, ltos, lneg , _ ); |
| 360 | def(Bytecodes::_fneg , ____|____|____|____, ftos, ftos, fneg , _ ); |
| 361 | def(Bytecodes::_dneg , ____|____|____|____, dtos, dtos, dneg , _ ); |
| 362 | def(Bytecodes::_ishl , ____|____|____|____, itos, itos, iop2 , shl ); |
| 363 | def(Bytecodes::_lshl , ____|____|____|____, itos, ltos, lshl , _ ); |
| 364 | def(Bytecodes::_ishr , ____|____|____|____, itos, itos, iop2 , shr ); |
| 365 | def(Bytecodes::_lshr , ____|____|____|____, itos, ltos, lshr , _ ); |
| 366 | def(Bytecodes::_iushr , ____|____|____|____, itos, itos, iop2 , ushr ); |
| 367 | def(Bytecodes::_lushr , ____|____|____|____, itos, ltos, lushr , _ ); |
| 368 | def(Bytecodes::_iand , ____|____|____|____, itos, itos, iop2 , _and ); |
| 369 | def(Bytecodes::_land , ____|____|____|____, ltos, ltos, lop2 , _and ); |
| 370 | def(Bytecodes::_ior , ____|____|____|____, itos, itos, iop2 , _or ); |
| 371 | def(Bytecodes::_lor , ____|____|____|____, ltos, ltos, lop2 , _or ); |
| 372 | def(Bytecodes::_ixor , ____|____|____|____, itos, itos, iop2 , _xor ); |
| 373 | def(Bytecodes::_lxor , ____|____|____|____, ltos, ltos, lop2 , _xor ); |
| 374 | def(Bytecodes::_iinc , ubcp|____|clvm|____, vtos, vtos, iinc , _ ); |
| 375 | def(Bytecodes::_i2l , ____|____|____|____, itos, ltos, convert , _ ); |
| 376 | def(Bytecodes::_i2f , ____|____|____|____, itos, ftos, convert , _ ); |
| 377 | def(Bytecodes::_i2d , ____|____|____|____, itos, dtos, convert , _ ); |
| 378 | def(Bytecodes::_l2i , ____|____|____|____, ltos, itos, convert , _ ); |
| 379 | def(Bytecodes::_l2f , ____|____|____|____, ltos, ftos, convert , _ ); |
| 380 | def(Bytecodes::_l2d , ____|____|____|____, ltos, dtos, convert , _ ); |
| 381 | def(Bytecodes::_f2i , ____|____|____|____, ftos, itos, convert , _ ); |
| 382 | def(Bytecodes::_f2l , ____|____|____|____, ftos, ltos, convert , _ ); |
| 383 | def(Bytecodes::_f2d , ____|____|____|____, ftos, dtos, convert , _ ); |
| 384 | def(Bytecodes::_d2i , ____|____|____|____, dtos, itos, convert , _ ); |
| 385 | def(Bytecodes::_d2l , ____|____|____|____, dtos, ltos, convert , _ ); |
| 386 | def(Bytecodes::_d2f , ____|____|____|____, dtos, ftos, convert , _ ); |
| 387 | def(Bytecodes::_i2b , ____|____|____|____, itos, itos, convert , _ ); |
| 388 | def(Bytecodes::_i2c , ____|____|____|____, itos, itos, convert , _ ); |
| 389 | def(Bytecodes::_i2s , ____|____|____|____, itos, itos, convert , _ ); |
| 390 | def(Bytecodes::_lcmp , ____|____|____|____, ltos, itos, lcmp , _ ); |
| 391 | def(Bytecodes::_fcmpl , ____|____|____|____, ftos, itos, float_cmp , -1 ); |
| 392 | def(Bytecodes::_fcmpg , ____|____|____|____, ftos, itos, float_cmp , 1 ); |
| 393 | def(Bytecodes::_dcmpl , ____|____|____|____, dtos, itos, double_cmp , -1 ); |
| 394 | def(Bytecodes::_dcmpg , ____|____|____|____, dtos, itos, double_cmp , 1 ); |
| 395 | def(Bytecodes::_ifeq , ubcp|____|clvm|____, itos, vtos, if_0cmp , equal ); |
| 396 | def(Bytecodes::_ifne , ubcp|____|clvm|____, itos, vtos, if_0cmp , not_equal ); |
| 397 | def(Bytecodes::_iflt , ubcp|____|clvm|____, itos, vtos, if_0cmp , less ); |
| 398 | def(Bytecodes::_ifge , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater_equal); |
| 399 | def(Bytecodes::_ifgt , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater ); |
| 400 | def(Bytecodes::_ifle , ubcp|____|clvm|____, itos, vtos, if_0cmp , less_equal ); |
| 401 | def(Bytecodes::_if_icmpeq , ubcp|____|clvm|____, itos, vtos, if_icmp , equal ); |
| 402 | def(Bytecodes::_if_icmpne , ubcp|____|clvm|____, itos, vtos, if_icmp , not_equal ); |
| 403 | def(Bytecodes::_if_icmplt , ubcp|____|clvm|____, itos, vtos, if_icmp , less ); |
| 404 | def(Bytecodes::_if_icmpge , ubcp|____|clvm|____, itos, vtos, if_icmp , greater_equal); |
| 405 | def(Bytecodes::_if_icmpgt , ubcp|____|clvm|____, itos, vtos, if_icmp , greater ); |
| 406 | def(Bytecodes::_if_icmple , ubcp|____|clvm|____, itos, vtos, if_icmp , less_equal ); |
| 407 | def(Bytecodes::_if_acmpeq , ubcp|____|clvm|____, atos, vtos, if_acmp , equal ); |
| 408 | def(Bytecodes::_if_acmpne , ubcp|____|clvm|____, atos, vtos, if_acmp , not_equal ); |
| 409 | def(Bytecodes::_goto , ubcp|disp|clvm|____, vtos, vtos, _goto , _ ); |
| 410 | def(Bytecodes::_jsr , ubcp|disp|____|____, vtos, vtos, jsr , _ ); // result is not an oop, so do not transition to atos |
| 411 | def(Bytecodes::_ret , ubcp|disp|____|____, vtos, vtos, ret , _ ); |
| 412 | def(Bytecodes::_tableswitch , ubcp|disp|____|____, itos, vtos, tableswitch , _ ); |
| 413 | def(Bytecodes::_lookupswitch , ubcp|disp|____|____, itos, itos, lookupswitch , _ ); |
| 414 | def(Bytecodes::_ireturn , ____|disp|clvm|____, itos, itos, _return , itos ); |
| 415 | def(Bytecodes::_lreturn , ____|disp|clvm|____, ltos, ltos, _return , ltos ); |
| 416 | def(Bytecodes::_freturn , ____|disp|clvm|____, ftos, ftos, _return , ftos ); |
| 417 | def(Bytecodes::_dreturn , ____|disp|clvm|____, dtos, dtos, _return , dtos ); |
| 418 | def(Bytecodes::_areturn , ____|disp|clvm|____, atos, atos, _return , atos ); |
| 419 | def(Bytecodes::_return , ____|disp|clvm|____, vtos, vtos, _return , vtos ); |
| 420 | def(Bytecodes::_getstatic , ubcp|____|clvm|____, vtos, vtos, getstatic , f1_byte ); |
| 421 | def(Bytecodes::_putstatic , ubcp|____|clvm|____, vtos, vtos, putstatic , f2_byte ); |
| 422 | def(Bytecodes::_getfield , ubcp|____|clvm|____, vtos, vtos, getfield , f1_byte ); |
| 423 | def(Bytecodes::_putfield , ubcp|____|clvm|____, vtos, vtos, putfield , f2_byte ); |
| 424 | def(Bytecodes::_invokevirtual , ubcp|disp|clvm|____, vtos, vtos, invokevirtual , f2_byte ); |
| 425 | def(Bytecodes::_invokespecial , ubcp|disp|clvm|____, vtos, vtos, invokespecial , f1_byte ); |
| 426 | def(Bytecodes::_invokestatic , ubcp|disp|clvm|____, vtos, vtos, invokestatic , f1_byte ); |
| 427 | def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invokeinterface , f1_byte ); |
| 428 | def(Bytecodes::_invokedynamic , ubcp|disp|clvm|____, vtos, vtos, invokedynamic , f1_byte ); |
| 429 | def(Bytecodes::_new , ubcp|____|clvm|____, vtos, atos, _new , _ ); |
| 430 | def(Bytecodes::_newarray , ubcp|____|clvm|____, itos, atos, newarray , _ ); |
| 431 | def(Bytecodes::_anewarray , ubcp|____|clvm|____, itos, atos, anewarray , _ ); |
| 432 | def(Bytecodes::_arraylength , ____|____|____|____, atos, itos, arraylength , _ ); |
| 433 | def(Bytecodes::_athrow , ____|disp|____|____, atos, vtos, athrow , _ ); |
| 434 | def(Bytecodes::_checkcast , ubcp|____|clvm|____, atos, atos, checkcast , _ ); |
| 435 | def(Bytecodes::_instanceof , ubcp|____|clvm|____, atos, itos, instanceof , _ ); |
| 436 | def(Bytecodes::_monitorenter , ____|disp|clvm|____, atos, vtos, monitorenter , _ ); |
| 437 | def(Bytecodes::_monitorexit , ____|____|clvm|____, atos, vtos, monitorexit , _ ); |
| 438 | def(Bytecodes::_wide , ubcp|disp|____|____, vtos, vtos, wide , _ ); |
| 439 | def(Bytecodes::_multianewarray , ubcp|____|clvm|____, vtos, atos, multianewarray , _ ); |
| 440 | def(Bytecodes::_ifnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , equal ); |
| 441 | def(Bytecodes::_ifnonnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , not_equal ); |
| 442 | def(Bytecodes::_goto_w , ubcp|____|clvm|____, vtos, vtos, goto_w , _ ); |
| 443 | def(Bytecodes::_jsr_w , ubcp|____|____|____, vtos, vtos, jsr_w , _ ); |
| 444 | |
| 445 | // wide Java spec bytecodes |
| 446 | def(Bytecodes::_iload , ubcp|____|____|iswd, vtos, itos, wide_iload , _ ); |
| 447 | def(Bytecodes::_lload , ubcp|____|____|iswd, vtos, ltos, wide_lload , _ ); |
| 448 | def(Bytecodes::_fload , ubcp|____|____|iswd, vtos, ftos, wide_fload , _ ); |
| 449 | def(Bytecodes::_dload , ubcp|____|____|iswd, vtos, dtos, wide_dload , _ ); |
| 450 | def(Bytecodes::_aload , ubcp|____|____|iswd, vtos, atos, wide_aload , _ ); |
| 451 | def(Bytecodes::_istore , ubcp|____|____|iswd, vtos, vtos, wide_istore , _ ); |
| 452 | def(Bytecodes::_lstore , ubcp|____|____|iswd, vtos, vtos, wide_lstore , _ ); |
| 453 | def(Bytecodes::_fstore , ubcp|____|____|iswd, vtos, vtos, wide_fstore , _ ); |
| 454 | def(Bytecodes::_dstore , ubcp|____|____|iswd, vtos, vtos, wide_dstore , _ ); |
| 455 | def(Bytecodes::_astore , ubcp|____|____|iswd, vtos, vtos, wide_astore , _ ); |
| 456 | def(Bytecodes::_iinc , ubcp|____|____|iswd, vtos, vtos, wide_iinc , _ ); |
| 457 | def(Bytecodes::_ret , ubcp|disp|____|iswd, vtos, vtos, wide_ret , _ ); |
| 458 | def(Bytecodes::_breakpoint , ubcp|disp|clvm|____, vtos, vtos, _breakpoint , _ ); |
| 459 | |
| 460 | // JVM bytecodes |
| 461 | def(Bytecodes::_fast_agetfield , ubcp|____|____|____, atos, atos, fast_accessfield , atos ); |
| 462 | def(Bytecodes::_fast_bgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
| 463 | def(Bytecodes::_fast_cgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
| 464 | def(Bytecodes::_fast_dgetfield , ubcp|____|____|____, atos, dtos, fast_accessfield , dtos ); |
| 465 | def(Bytecodes::_fast_fgetfield , ubcp|____|____|____, atos, ftos, fast_accessfield , ftos ); |
| 466 | def(Bytecodes::_fast_igetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
| 467 | def(Bytecodes::_fast_lgetfield , ubcp|____|____|____, atos, ltos, fast_accessfield , ltos ); |
| 468 | def(Bytecodes::_fast_sgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
| 469 | |
| 470 | def(Bytecodes::_fast_aputfield , ubcp|____|____|____, atos, vtos, fast_storefield , atos ); |
| 471 | def(Bytecodes::_fast_bputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
| 472 | def(Bytecodes::_fast_zputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
| 473 | def(Bytecodes::_fast_cputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
| 474 | def(Bytecodes::_fast_dputfield , ubcp|____|____|____, dtos, vtos, fast_storefield , dtos ); |
| 475 | def(Bytecodes::_fast_fputfield , ubcp|____|____|____, ftos, vtos, fast_storefield , ftos ); |
| 476 | def(Bytecodes::_fast_iputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
| 477 | def(Bytecodes::_fast_lputfield , ubcp|____|____|____, ltos, vtos, fast_storefield , ltos ); |
| 478 | def(Bytecodes::_fast_sputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
| 479 | |
| 480 | def(Bytecodes::_fast_aload_0 , ____|____|____|____, vtos, atos, aload , 0 ); |
| 481 | def(Bytecodes::_fast_iaccess_0 , ubcp|____|____|____, vtos, itos, fast_xaccess , itos ); |
| 482 | def(Bytecodes::_fast_aaccess_0 , ubcp|____|____|____, vtos, atos, fast_xaccess , atos ); |
| 483 | def(Bytecodes::_fast_faccess_0 , ubcp|____|____|____, vtos, ftos, fast_xaccess , ftos ); |
| 484 | |
| 485 | def(Bytecodes::_fast_iload , ubcp|____|____|____, vtos, itos, fast_iload , _ ); |
| 486 | def(Bytecodes::_fast_iload2 , ubcp|____|____|____, vtos, itos, fast_iload2 , _ ); |
| 487 | def(Bytecodes::_fast_icaload , ubcp|____|____|____, vtos, itos, fast_icaload , _ ); |
| 488 | |
| 489 | def(Bytecodes::_fast_invokevfinal , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal , f2_byte ); |
| 490 | |
| 491 | def(Bytecodes::_fast_linearswitch , ubcp|disp|____|____, itos, vtos, fast_linearswitch , _ ); |
| 492 | def(Bytecodes::_fast_binaryswitch , ubcp|disp|____|____, itos, vtos, fast_binaryswitch , _ ); |
| 493 | |
| 494 | def(Bytecodes::_fast_aldc , ubcp|____|clvm|____, vtos, atos, fast_aldc , false ); |
| 495 | def(Bytecodes::_fast_aldc_w , ubcp|____|clvm|____, vtos, atos, fast_aldc , true ); |
| 496 | |
| 497 | def(Bytecodes::_return_register_finalizer , ____|disp|clvm|____, vtos, vtos, _return , vtos ); |
| 498 | |
| 499 | def(Bytecodes::_invokehandle , ubcp|disp|clvm|____, vtos, vtos, invokehandle , f1_byte ); |
| 500 | |
| 501 | def(Bytecodes::_nofast_getfield , ubcp|____|clvm|____, vtos, vtos, nofast_getfield , f1_byte ); |
| 502 | def(Bytecodes::_nofast_putfield , ubcp|____|clvm|____, vtos, vtos, nofast_putfield , f2_byte ); |
| 503 | |
| 504 | def(Bytecodes::_nofast_aload_0 , ____|____|clvm|____, vtos, atos, nofast_aload_0 , _ ); |
| 505 | def(Bytecodes::_nofast_iload , ubcp|____|clvm|____, vtos, itos, nofast_iload , _ ); |
| 506 | |
| 507 | def(Bytecodes::_shouldnotreachhere , ____|____|____|____, vtos, vtos, shouldnotreachhere , _ ); |
| 508 | // platform specific bytecodes |
| 509 | pd_initialize(); |
| 510 | |
| 511 | _is_initialized = true; |
| 512 | } |
| 513 | |
| 514 | void templateTable_init() { |
| 515 | TemplateTable::initialize(); |
| 516 | } |
| 517 | |
| 518 | |
| 519 | void TemplateTable::unimplemented_bc() { |
| 520 | _masm->unimplemented( Bytecodes::name(_desc->bytecode())); |
| 521 | } |
| 522 | #endif /* !CC_INTERP */ |
| 523 | |