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