1 /* 2 * Copyright (c) 1997, 2018, 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, 164 "inconsistent tos_in information"); 165 assert(_desc->tos_out() == tos_out, "inconsistent tos_out information"); 166 } 167 168 169 //---------------------------------------------------------------------------------------------------- 170 // Implementation of TemplateTable: Initialization 171 172 bool TemplateTable::_is_initialized = false; 173 Template TemplateTable::_template_table [Bytecodes::number_of_codes]; 174 Template TemplateTable::_template_table_wide[Bytecodes::number_of_codes]; 175 176 Template* TemplateTable::_desc; 177 InterpreterMacroAssembler* TemplateTable::_masm; 178 BarrierSet* TemplateTable::_bs; 179 180 181 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(), char filler) { 182 assert(filler == ' ', "just checkin'"); 183 def(code, flags, in, out, (Template::generator)gen, 0); 184 } 185 186 187 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg), int arg) { 188 // should factor out these constants 189 const int ubcp = 1 << Template::uses_bcp_bit; 190 const int disp = 1 << Template::does_dispatch_bit; 191 const int clvm = 1 << Template::calls_vm_bit; 192 const int iswd = 1 << Template::wide_bit; 193 // determine which table to use 194 bool is_wide = (flags & iswd) != 0; 195 // make sure that wide instructions have a vtos entry point 196 // (since they are executed extremely rarely, it doesn't pay out to have an 197 // extra set of 5 dispatch tables for the wide instructions - for simplicity 198 // they all go with one table) 199 assert(in == vtos || !is_wide, "wide instructions have vtos entry point only"); 200 Template* t = is_wide ? template_for_wide(code) : template_for(code); 201 // setup entry 202 t->initialize(flags, in, out, gen, arg); 203 assert(t->bytecode() == code, "just checkin'"); 204 } 205 206 207 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op) { 208 def(code, flags, in, out, (Template::generator)gen, (int)op); 209 } 210 211 212 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg ), bool arg) { 213 def(code, flags, in, out, (Template::generator)gen, (int)arg); 214 } 215 216 217 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos) { 218 def(code, flags, in, out, (Template::generator)gen, (int)tos); 219 } 220 221 222 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc) { 223 def(code, flags, in, out, (Template::generator)gen, (int)cc); 224 } 225 226 #if defined(TEMPLATE_TABLE_BUG) 227 // 228 // It appears that gcc (version 2.91) generates bad code for the template 229 // table init if this macro is not defined. My symptom was an assertion 230 // assert(Universe::heap()->is_in(obj), "sanity check") in handles.cpp line 24. 231 // when called from interpreterRuntime.resolve_invoke(). 232 // 233 #define iload TemplateTable::iload 234 #define lload TemplateTable::lload 235 #define fload TemplateTable::fload 236 #define dload TemplateTable::dload 237 #define aload TemplateTable::aload 238 #define istore TemplateTable::istore 239 #define lstore TemplateTable::lstore 240 #define fstore TemplateTable::fstore 241 #define dstore TemplateTable::dstore 242 #define astore TemplateTable::astore 243 #endif // TEMPLATE_TABLE_BUG 244 245 void TemplateTable::initialize() { 246 if (_is_initialized) return; 247 248 // Initialize table 249 TraceTime timer("TemplateTable initialization", TRACETIME_LOG(Info, startuptime)); 250 251 _bs = BarrierSet::barrier_set(); 252 253 // For better readability 254 const char _ = ' '; 255 const int ____ = 0; 256 const int ubcp = 1 << Template::uses_bcp_bit; 257 const int disp = 1 << Template::does_dispatch_bit; 258 const int clvm = 1 << Template::calls_vm_bit; 259 const int iswd = 1 << Template::wide_bit; 260 261 // Special flags modifications for the Valhalla L-world 262 const int lwrl = ValueTypesBufferMaxMemory > 0 ? clvm : ____ ; 263 264 // interpr. templates 265 // Java spec bytecodes ubcp|disp|clvm|iswd in out generator argument 266 def(Bytecodes::_nop , ____|____|____|____, vtos, vtos, nop , _ ); 267 def(Bytecodes::_aconst_null , ____|____|____|____, vtos, atos, aconst_null , _ ); 268 def(Bytecodes::_iconst_m1 , ____|____|____|____, vtos, itos, iconst , -1 ); 269 def(Bytecodes::_iconst_0 , ____|____|____|____, vtos, itos, iconst , 0 ); 270 def(Bytecodes::_iconst_1 , ____|____|____|____, vtos, itos, iconst , 1 ); 271 def(Bytecodes::_iconst_2 , ____|____|____|____, vtos, itos, iconst , 2 ); 272 def(Bytecodes::_iconst_3 , ____|____|____|____, vtos, itos, iconst , 3 ); 273 def(Bytecodes::_iconst_4 , ____|____|____|____, vtos, itos, iconst , 4 ); 274 def(Bytecodes::_iconst_5 , ____|____|____|____, vtos, itos, iconst , 5 ); 275 def(Bytecodes::_lconst_0 , ____|____|____|____, vtos, ltos, lconst , 0 ); 276 def(Bytecodes::_lconst_1 , ____|____|____|____, vtos, ltos, lconst , 1 ); 277 def(Bytecodes::_fconst_0 , ____|____|____|____, vtos, ftos, fconst , 0 ); 278 def(Bytecodes::_fconst_1 , ____|____|____|____, vtos, ftos, fconst , 1 ); 279 def(Bytecodes::_fconst_2 , ____|____|____|____, vtos, ftos, fconst , 2 ); 280 def(Bytecodes::_dconst_0 , ____|____|____|____, vtos, dtos, dconst , 0 ); 281 def(Bytecodes::_dconst_1 , ____|____|____|____, vtos, dtos, dconst , 1 ); 282 def(Bytecodes::_bipush , ubcp|____|____|____, vtos, itos, bipush , _ ); 283 def(Bytecodes::_sipush , ubcp|____|____|____, vtos, itos, sipush , _ ); 284 def(Bytecodes::_ldc , ubcp|____|clvm|____, vtos, vtos, ldc , false ); 285 def(Bytecodes::_ldc_w , ubcp|____|clvm|____, vtos, vtos, ldc , true ); 286 def(Bytecodes::_ldc2_w , ubcp|____|clvm|____, vtos, vtos, ldc2_w , _ ); 287 def(Bytecodes::_iload , ubcp|____|clvm|____, vtos, itos, iload , _ ); 288 def(Bytecodes::_lload , ubcp|____|____|____, vtos, ltos, lload , _ ); 289 def(Bytecodes::_fload , ubcp|____|____|____, vtos, ftos, fload , _ ); 290 def(Bytecodes::_dload , ubcp|____|____|____, vtos, dtos, dload , _ ); 291 def(Bytecodes::_aload , ubcp|____|clvm|____, vtos, atos, aload , _ ); 292 def(Bytecodes::_iload_0 , ____|____|____|____, vtos, itos, iload , 0 ); 293 def(Bytecodes::_iload_1 , ____|____|____|____, vtos, itos, iload , 1 ); 294 def(Bytecodes::_iload_2 , ____|____|____|____, vtos, itos, iload , 2 ); 295 def(Bytecodes::_iload_3 , ____|____|____|____, vtos, itos, iload , 3 ); 296 def(Bytecodes::_lload_0 , ____|____|____|____, vtos, ltos, lload , 0 ); 297 def(Bytecodes::_lload_1 , ____|____|____|____, vtos, ltos, lload , 1 ); 298 def(Bytecodes::_lload_2 , ____|____|____|____, vtos, ltos, lload , 2 ); 299 def(Bytecodes::_lload_3 , ____|____|____|____, vtos, ltos, lload , 3 ); 300 def(Bytecodes::_fload_0 , ____|____|____|____, vtos, ftos, fload , 0 ); 301 def(Bytecodes::_fload_1 , ____|____|____|____, vtos, ftos, fload , 1 ); 302 def(Bytecodes::_fload_2 , ____|____|____|____, vtos, ftos, fload , 2 ); 303 def(Bytecodes::_fload_3 , ____|____|____|____, vtos, ftos, fload , 3 ); 304 def(Bytecodes::_dload_0 , ____|____|____|____, vtos, dtos, dload , 0 ); 305 def(Bytecodes::_dload_1 , ____|____|____|____, vtos, dtos, dload , 1 ); 306 def(Bytecodes::_dload_2 , ____|____|____|____, vtos, dtos, dload , 2 ); 307 def(Bytecodes::_dload_3 , ____|____|____|____, vtos, dtos, dload , 3 ); 308 def(Bytecodes::_aload_0 , ubcp|____|clvm|____, vtos, atos, aload_0 , _ ); 309 def(Bytecodes::_aload_1 , ____|____|____|____, vtos, atos, aload , 1 ); 310 def(Bytecodes::_aload_2 , ____|____|____|____, vtos, atos, aload , 2 ); 311 def(Bytecodes::_aload_3 , ____|____|____|____, vtos, atos, aload , 3 ); 312 def(Bytecodes::_iaload , ____|____|____|____, itos, itos, iaload , _ ); 313 def(Bytecodes::_laload , ____|____|____|____, itos, ltos, laload , _ ); 314 def(Bytecodes::_faload , ____|____|____|____, itos, ftos, faload , _ ); 315 def(Bytecodes::_daload , ____|____|____|____, itos, dtos, daload , _ ); 316 def(Bytecodes::_aaload , ____|____|clvm|____, itos, atos, aaload , _ ); 317 def(Bytecodes::_baload , ____|____|____|____, itos, itos, baload , _ ); 318 def(Bytecodes::_caload , ____|____|____|____, itos, itos, caload , _ ); 319 def(Bytecodes::_saload , ____|____|____|____, itos, itos, saload , _ ); 320 def(Bytecodes::_istore , ubcp|____|clvm|____, itos, vtos, istore , _ ); 321 def(Bytecodes::_lstore , ubcp|____|____|____, ltos, vtos, lstore , _ ); 322 def(Bytecodes::_fstore , ubcp|____|____|____, ftos, vtos, fstore , _ ); 323 def(Bytecodes::_dstore , ubcp|____|____|____, dtos, vtos, dstore , _ ); 324 def(Bytecodes::_astore , ubcp|____|clvm|____, vtos, vtos, astore , _ ); 325 def(Bytecodes::_istore_0 , ____|____|____|____, itos, vtos, istore , 0 ); 326 def(Bytecodes::_istore_1 , ____|____|____|____, itos, vtos, istore , 1 ); 327 def(Bytecodes::_istore_2 , ____|____|____|____, itos, vtos, istore , 2 ); 328 def(Bytecodes::_istore_3 , ____|____|____|____, itos, vtos, istore , 3 ); 329 def(Bytecodes::_lstore_0 , ____|____|____|____, ltos, vtos, lstore , 0 ); 330 def(Bytecodes::_lstore_1 , ____|____|____|____, ltos, vtos, lstore , 1 ); 331 def(Bytecodes::_lstore_2 , ____|____|____|____, ltos, vtos, lstore , 2 ); 332 def(Bytecodes::_lstore_3 , ____|____|____|____, ltos, vtos, lstore , 3 ); 333 def(Bytecodes::_fstore_0 , ____|____|____|____, ftos, vtos, fstore , 0 ); 334 def(Bytecodes::_fstore_1 , ____|____|____|____, ftos, vtos, fstore , 1 ); 335 def(Bytecodes::_fstore_2 , ____|____|____|____, ftos, vtos, fstore , 2 ); 336 def(Bytecodes::_fstore_3 , ____|____|____|____, ftos, vtos, fstore , 3 ); 337 def(Bytecodes::_dstore_0 , ____|____|____|____, dtos, vtos, dstore , 0 ); 338 def(Bytecodes::_dstore_1 , ____|____|____|____, dtos, vtos, dstore , 1 ); 339 def(Bytecodes::_dstore_2 , ____|____|____|____, dtos, vtos, dstore , 2 ); 340 def(Bytecodes::_dstore_3 , ____|____|____|____, dtos, vtos, dstore , 3 ); 341 def(Bytecodes::_astore_0 , ____|____|____|____, vtos, vtos, astore , 0 ); 342 def(Bytecodes::_astore_1 , ____|____|____|____, vtos, vtos, astore , 1 ); 343 def(Bytecodes::_astore_2 , ____|____|____|____, vtos, vtos, astore , 2 ); 344 def(Bytecodes::_astore_3 , ____|____|____|____, vtos, vtos, astore , 3 ); 345 def(Bytecodes::_iastore , ____|____|____|____, itos, vtos, iastore , _ ); 346 def(Bytecodes::_lastore , ____|____|____|____, ltos, vtos, lastore , _ ); 347 def(Bytecodes::_fastore , ____|____|____|____, ftos, vtos, fastore , _ ); 348 def(Bytecodes::_dastore , ____|____|____|____, dtos, vtos, dastore , _ ); 349 def(Bytecodes::_aastore , ____|____|clvm|____, vtos, vtos, aastore , _ ); 350 def(Bytecodes::_bastore , ____|____|____|____, itos, vtos, bastore , _ ); 351 def(Bytecodes::_castore , ____|____|____|____, itos, vtos, castore , _ ); 352 def(Bytecodes::_sastore , ____|____|____|____, itos, vtos, sastore , _ ); 353 def(Bytecodes::_pop , ____|____|____|____, vtos, vtos, pop , _ ); 354 def(Bytecodes::_pop2 , ____|____|____|____, vtos, vtos, pop2 , _ ); 355 def(Bytecodes::_dup , ____|____|____|____, vtos, vtos, dup , _ ); 356 def(Bytecodes::_dup_x1 , ____|____|____|____, vtos, vtos, dup_x1 , _ ); 357 def(Bytecodes::_dup_x2 , ____|____|____|____, vtos, vtos, dup_x2 , _ ); 358 def(Bytecodes::_dup2 , ____|____|____|____, vtos, vtos, dup2 , _ ); 359 def(Bytecodes::_dup2_x1 , ____|____|____|____, vtos, vtos, dup2_x1 , _ ); 360 def(Bytecodes::_dup2_x2 , ____|____|____|____, vtos, vtos, dup2_x2 , _ ); 361 def(Bytecodes::_swap , ____|____|____|____, vtos, vtos, swap , _ ); 362 def(Bytecodes::_iadd , ____|____|____|____, itos, itos, iop2 , add ); 363 def(Bytecodes::_ladd , ____|____|____|____, ltos, ltos, lop2 , add ); 364 def(Bytecodes::_fadd , ____|____|____|____, ftos, ftos, fop2 , add ); 365 def(Bytecodes::_dadd , ____|____|____|____, dtos, dtos, dop2 , add ); 366 def(Bytecodes::_isub , ____|____|____|____, itos, itos, iop2 , sub ); 367 def(Bytecodes::_lsub , ____|____|____|____, ltos, ltos, lop2 , sub ); 368 def(Bytecodes::_fsub , ____|____|____|____, ftos, ftos, fop2 , sub ); 369 def(Bytecodes::_dsub , ____|____|____|____, dtos, dtos, dop2 , sub ); 370 def(Bytecodes::_imul , ____|____|____|____, itos, itos, iop2 , mul ); 371 def(Bytecodes::_lmul , ____|____|____|____, ltos, ltos, lmul , _ ); 372 def(Bytecodes::_fmul , ____|____|____|____, ftos, ftos, fop2 , mul ); 373 def(Bytecodes::_dmul , ____|____|____|____, dtos, dtos, dop2 , mul ); 374 def(Bytecodes::_idiv , ____|____|____|____, itos, itos, idiv , _ ); 375 def(Bytecodes::_ldiv , ____|____|____|____, ltos, ltos, ldiv , _ ); 376 def(Bytecodes::_fdiv , ____|____|____|____, ftos, ftos, fop2 , div ); 377 def(Bytecodes::_ddiv , ____|____|____|____, dtos, dtos, dop2 , div ); 378 def(Bytecodes::_irem , ____|____|____|____, itos, itos, irem , _ ); 379 def(Bytecodes::_lrem , ____|____|____|____, ltos, ltos, lrem , _ ); 380 def(Bytecodes::_frem , ____|____|____|____, ftos, ftos, fop2 , rem ); 381 def(Bytecodes::_drem , ____|____|____|____, dtos, dtos, dop2 , rem ); 382 def(Bytecodes::_ineg , ____|____|____|____, itos, itos, ineg , _ ); 383 def(Bytecodes::_lneg , ____|____|____|____, ltos, ltos, lneg , _ ); 384 def(Bytecodes::_fneg , ____|____|____|____, ftos, ftos, fneg , _ ); 385 def(Bytecodes::_dneg , ____|____|____|____, dtos, dtos, dneg , _ ); 386 def(Bytecodes::_ishl , ____|____|____|____, itos, itos, iop2 , shl ); 387 def(Bytecodes::_lshl , ____|____|____|____, itos, ltos, lshl , _ ); 388 def(Bytecodes::_ishr , ____|____|____|____, itos, itos, iop2 , shr ); 389 def(Bytecodes::_lshr , ____|____|____|____, itos, ltos, lshr , _ ); 390 def(Bytecodes::_iushr , ____|____|____|____, itos, itos, iop2 , ushr ); 391 def(Bytecodes::_lushr , ____|____|____|____, itos, ltos, lushr , _ ); 392 def(Bytecodes::_iand , ____|____|____|____, itos, itos, iop2 , _and ); 393 def(Bytecodes::_land , ____|____|____|____, ltos, ltos, lop2 , _and ); 394 def(Bytecodes::_ior , ____|____|____|____, itos, itos, iop2 , _or ); 395 def(Bytecodes::_lor , ____|____|____|____, ltos, ltos, lop2 , _or ); 396 def(Bytecodes::_ixor , ____|____|____|____, itos, itos, iop2 , _xor ); 397 def(Bytecodes::_lxor , ____|____|____|____, ltos, ltos, lop2 , _xor ); 398 def(Bytecodes::_iinc , ubcp|____|clvm|____, vtos, vtos, iinc , _ ); 399 def(Bytecodes::_i2l , ____|____|____|____, itos, ltos, convert , _ ); 400 def(Bytecodes::_i2f , ____|____|____|____, itos, ftos, convert , _ ); 401 def(Bytecodes::_i2d , ____|____|____|____, itos, dtos, convert , _ ); 402 def(Bytecodes::_l2i , ____|____|____|____, ltos, itos, convert , _ ); 403 def(Bytecodes::_l2f , ____|____|____|____, ltos, ftos, convert , _ ); 404 def(Bytecodes::_l2d , ____|____|____|____, ltos, dtos, convert , _ ); 405 def(Bytecodes::_f2i , ____|____|____|____, ftos, itos, convert , _ ); 406 def(Bytecodes::_f2l , ____|____|____|____, ftos, ltos, convert , _ ); 407 def(Bytecodes::_f2d , ____|____|____|____, ftos, dtos, convert , _ ); 408 def(Bytecodes::_d2i , ____|____|____|____, dtos, itos, convert , _ ); 409 def(Bytecodes::_d2l , ____|____|____|____, dtos, ltos, convert , _ ); 410 def(Bytecodes::_d2f , ____|____|____|____, dtos, ftos, convert , _ ); 411 def(Bytecodes::_i2b , ____|____|____|____, itos, itos, convert , _ ); 412 def(Bytecodes::_i2c , ____|____|____|____, itos, itos, convert , _ ); 413 def(Bytecodes::_i2s , ____|____|____|____, itos, itos, convert , _ ); 414 def(Bytecodes::_lcmp , ____|____|____|____, ltos, itos, lcmp , _ ); 415 def(Bytecodes::_fcmpl , ____|____|____|____, ftos, itos, float_cmp , -1 ); 416 def(Bytecodes::_fcmpg , ____|____|____|____, ftos, itos, float_cmp , 1 ); 417 def(Bytecodes::_dcmpl , ____|____|____|____, dtos, itos, double_cmp , -1 ); 418 def(Bytecodes::_dcmpg , ____|____|____|____, dtos, itos, double_cmp , 1 ); 419 def(Bytecodes::_ifeq , ubcp|____|clvm|____, itos, vtos, if_0cmp , equal ); 420 def(Bytecodes::_ifne , ubcp|____|clvm|____, itos, vtos, if_0cmp , not_equal ); 421 def(Bytecodes::_iflt , ubcp|____|clvm|____, itos, vtos, if_0cmp , less ); 422 def(Bytecodes::_ifge , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater_equal); 423 def(Bytecodes::_ifgt , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater ); 424 def(Bytecodes::_ifle , ubcp|____|clvm|____, itos, vtos, if_0cmp , less_equal ); 425 def(Bytecodes::_if_icmpeq , ubcp|____|clvm|____, itos, vtos, if_icmp , equal ); 426 def(Bytecodes::_if_icmpne , ubcp|____|clvm|____, itos, vtos, if_icmp , not_equal ); 427 def(Bytecodes::_if_icmplt , ubcp|____|clvm|____, itos, vtos, if_icmp , less ); 428 def(Bytecodes::_if_icmpge , ubcp|____|clvm|____, itos, vtos, if_icmp , greater_equal); 429 def(Bytecodes::_if_icmpgt , ubcp|____|clvm|____, itos, vtos, if_icmp , greater ); 430 def(Bytecodes::_if_icmple , ubcp|____|clvm|____, itos, vtos, if_icmp , less_equal ); 431 def(Bytecodes::_if_acmpeq , ubcp|____|clvm|____, atos, vtos, if_acmp , equal ); 432 def(Bytecodes::_if_acmpne , ubcp|____|clvm|____, atos, vtos, if_acmp , not_equal ); 433 def(Bytecodes::_goto , ubcp|disp|clvm|____, vtos, vtos, _goto , _ ); 434 def(Bytecodes::_jsr , ubcp|disp|____|____, vtos, vtos, jsr , _ ); // result is not an oop, so do not transition to atos 435 def(Bytecodes::_ret , ubcp|disp|____|____, vtos, vtos, ret , _ ); 436 def(Bytecodes::_tableswitch , ubcp|disp|____|____, itos, vtos, tableswitch , _ ); 437 def(Bytecodes::_lookupswitch , ubcp|disp|____|____, itos, itos, lookupswitch , _ ); 438 def(Bytecodes::_ireturn , ____|disp|clvm|____, itos, itos, _return , itos ); 439 def(Bytecodes::_lreturn , ____|disp|clvm|____, ltos, ltos, _return , ltos ); 440 def(Bytecodes::_freturn , ____|disp|clvm|____, ftos, ftos, _return , ftos ); 441 def(Bytecodes::_dreturn , ____|disp|clvm|____, dtos, dtos, _return , dtos ); 442 def(Bytecodes::_areturn , ____|disp|clvm|____, atos, atos, _return , atos ); 443 def(Bytecodes::_return , ____|disp|clvm|____, vtos, vtos, _return , vtos ); 444 def(Bytecodes::_getstatic , ubcp|____|clvm|____, vtos, vtos, getstatic , f1_byte ); 445 def(Bytecodes::_putstatic , ubcp|____|clvm|____, vtos, vtos, putstatic , f2_byte ); 446 def(Bytecodes::_getfield , ubcp|____|clvm|____, vtos, vtos, getfield , f1_byte ); 447 def(Bytecodes::_putfield , ubcp|____|clvm|____, vtos, vtos, putfield , f2_byte ); 448 def(Bytecodes::_invokevirtual , ubcp|disp|clvm|____, vtos, vtos, invokevirtual , f2_byte ); 449 def(Bytecodes::_invokespecial , ubcp|disp|clvm|____, vtos, vtos, invokespecial , f1_byte ); 450 def(Bytecodes::_invokestatic , ubcp|disp|clvm|____, vtos, vtos, invokestatic , f1_byte ); 451 def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invokeinterface , f1_byte ); 452 def(Bytecodes::_invokedynamic , ubcp|disp|clvm|____, vtos, vtos, invokedynamic , f1_byte ); 453 def(Bytecodes::_new , ubcp|____|clvm|____, vtos, atos, _new , _ ); 454 def(Bytecodes::_newarray , ubcp|____|clvm|____, itos, atos, newarray , _ ); 455 def(Bytecodes::_anewarray , ubcp|____|clvm|____, itos, atos, anewarray , _ ); 456 def(Bytecodes::_arraylength , ____|____|____|____, atos, itos, arraylength , _ ); 457 def(Bytecodes::_athrow , ____|disp|____|____, atos, vtos, athrow , _ ); 458 def(Bytecodes::_checkcast , ubcp|____|clvm|____, atos, atos, checkcast , _ ); 459 def(Bytecodes::_instanceof , ubcp|____|clvm|____, atos, itos, instanceof , _ ); 460 def(Bytecodes::_monitorenter , ____|disp|clvm|____, atos, vtos, monitorenter , _ ); 461 def(Bytecodes::_monitorexit , ____|____|clvm|____, atos, vtos, monitorexit , _ ); 462 def(Bytecodes::_wide , ubcp|disp|____|____, vtos, vtos, wide , _ ); 463 def(Bytecodes::_multianewarray , ubcp|____|clvm|____, vtos, atos, multianewarray , _ ); 464 def(Bytecodes::_ifnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , equal ); 465 def(Bytecodes::_ifnonnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , not_equal ); 466 def(Bytecodes::_goto_w , ubcp|____|clvm|____, vtos, vtos, goto_w , _ ); 467 def(Bytecodes::_jsr_w , ubcp|____|____|____, vtos, vtos, jsr_w , _ ); 468 def(Bytecodes::_breakpoint , ubcp|disp|clvm|____, vtos, vtos, _breakpoint , _ ); 469 def(Bytecodes::_defaultvalue , ubcp|____|clvm|____, vtos, atos, defaultvalue , _ ); 470 def(Bytecodes::_withfield , ubcp|____|clvm|____, vtos, atos, withfield , _ ); 471 472 // wide Java spec bytecodes 473 def(Bytecodes::_iload , ubcp|____|____|iswd, vtos, itos, wide_iload , _ ); 474 def(Bytecodes::_lload , ubcp|____|____|iswd, vtos, ltos, wide_lload , _ ); 475 def(Bytecodes::_fload , ubcp|____|____|iswd, vtos, ftos, wide_fload , _ ); 476 def(Bytecodes::_dload , ubcp|____|____|iswd, vtos, dtos, wide_dload , _ ); 477 def(Bytecodes::_aload , ubcp|____|____|iswd, vtos, atos, wide_aload , _ ); 478 def(Bytecodes::_istore , ubcp|____|____|iswd, vtos, vtos, wide_istore , _ ); 479 def(Bytecodes::_lstore , ubcp|____|____|iswd, vtos, vtos, wide_lstore , _ ); 480 def(Bytecodes::_fstore , ubcp|____|____|iswd, vtos, vtos, wide_fstore , _ ); 481 def(Bytecodes::_dstore , ubcp|____|____|iswd, vtos, vtos, wide_dstore , _ ); 482 def(Bytecodes::_astore , ubcp|____|____|iswd, vtos, vtos, wide_astore , _ ); 483 def(Bytecodes::_iinc , ubcp|____|____|iswd, vtos, vtos, wide_iinc , _ ); 484 def(Bytecodes::_ret , ubcp|disp|____|iswd, vtos, vtos, wide_ret , _ ); 485 def(Bytecodes::_breakpoint , ubcp|disp|clvm|____, vtos, vtos, _breakpoint , _ ); 486 487 // JVM bytecodes 488 def(Bytecodes::_fast_agetfield , ubcp|____|____|____, atos, atos, fast_accessfield , atos ); 489 def(Bytecodes::_fast_qgetfield , ubcp|____|clvm|____, atos, atos, fast_accessfield , atos ); 490 def(Bytecodes::_fast_bgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); 491 def(Bytecodes::_fast_cgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); 492 def(Bytecodes::_fast_dgetfield , ubcp|____|____|____, atos, dtos, fast_accessfield , dtos ); 493 def(Bytecodes::_fast_fgetfield , ubcp|____|____|____, atos, ftos, fast_accessfield , ftos ); 494 def(Bytecodes::_fast_igetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); 495 def(Bytecodes::_fast_lgetfield , ubcp|____|____|____, atos, ltos, fast_accessfield , ltos ); 496 def(Bytecodes::_fast_sgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); 497 498 def(Bytecodes::_fast_aputfield , ubcp|____|lwrl|____, atos, vtos, fast_storefield , atos ); 499 def(Bytecodes::_fast_qputfield , ubcp|____|clvm|____, atos, vtos, fast_storefield , atos ); 500 def(Bytecodes::_fast_bputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); 501 def(Bytecodes::_fast_zputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); 502 def(Bytecodes::_fast_cputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); 503 def(Bytecodes::_fast_dputfield , ubcp|____|____|____, dtos, vtos, fast_storefield , dtos ); 504 def(Bytecodes::_fast_fputfield , ubcp|____|____|____, ftos, vtos, fast_storefield , ftos ); 505 def(Bytecodes::_fast_iputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); 506 def(Bytecodes::_fast_lputfield , ubcp|____|____|____, ltos, vtos, fast_storefield , ltos ); 507 def(Bytecodes::_fast_sputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); 508 509 def(Bytecodes::_fast_aload_0 , ____|____|____|____, vtos, atos, aload , 0 ); 510 def(Bytecodes::_fast_iaccess_0 , ubcp|____|____|____, vtos, itos, fast_xaccess , itos ); 511 def(Bytecodes::_fast_aaccess_0 , ubcp|____|____|____, vtos, atos, fast_xaccess , atos ); 512 def(Bytecodes::_fast_faccess_0 , ubcp|____|____|____, vtos, ftos, fast_xaccess , ftos ); 513 514 def(Bytecodes::_fast_iload , ubcp|____|____|____, vtos, itos, fast_iload , _ ); 515 def(Bytecodes::_fast_iload2 , ubcp|____|____|____, vtos, itos, fast_iload2 , _ ); 516 def(Bytecodes::_fast_icaload , ubcp|____|____|____, vtos, itos, fast_icaload , _ ); 517 518 def(Bytecodes::_fast_invokevfinal , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal , f2_byte ); 519 520 def(Bytecodes::_fast_linearswitch , ubcp|disp|____|____, itos, vtos, fast_linearswitch , _ ); 521 def(Bytecodes::_fast_binaryswitch , ubcp|disp|____|____, itos, vtos, fast_binaryswitch , _ ); 522 523 def(Bytecodes::_fast_aldc , ubcp|____|clvm|____, vtos, atos, fast_aldc , false ); 524 def(Bytecodes::_fast_aldc_w , ubcp|____|clvm|____, vtos, atos, fast_aldc , true ); 525 526 def(Bytecodes::_return_register_finalizer , ____|disp|clvm|____, vtos, vtos, _return , vtos ); 527 528 def(Bytecodes::_invokehandle , ubcp|disp|clvm|____, vtos, vtos, invokehandle , f1_byte ); 529 530 def(Bytecodes::_nofast_getfield , ubcp|____|clvm|____, vtos, vtos, nofast_getfield , f1_byte ); 531 def(Bytecodes::_nofast_putfield , ubcp|____|clvm|____, vtos, vtos, nofast_putfield , f2_byte ); 532 533 def(Bytecodes::_nofast_aload_0 , ____|____|clvm|____, vtos, atos, nofast_aload_0 , _ ); 534 def(Bytecodes::_nofast_iload , ubcp|____|clvm|____, vtos, itos, nofast_iload , _ ); 535 536 537 def(Bytecodes::_shouldnotreachhere , ____|____|____|____, vtos, vtos, shouldnotreachhere , _ ); 538 // platform specific bytecodes 539 pd_initialize(); 540 541 _is_initialized = true; 542 } 543 544 #if defined(TEMPLATE_TABLE_BUG) 545 #undef iload 546 #undef lload 547 #undef fload 548 #undef dload 549 #undef aload 550 #undef istore 551 #undef lstore 552 #undef fstore 553 #undef dstore 554 #undef astore 555 #endif // TEMPLATE_TABLE_BUG 556 557 558 void templateTable_init() { 559 TemplateTable::initialize(); 560 } 561 562 563 void TemplateTable::unimplemented_bc() { 564 _masm->unimplemented( Bytecodes::name(_desc->bytecode())); 565 } 566 #endif /* !CC_INTERP */