src/share/vm/interpreter/templateTable.cpp

Wed, 28 May 2008 21:06:24 -0700

author
coleenp
date
Wed, 28 May 2008 21:06:24 -0700
changeset 602
feeb96a45707
parent 435
a61af66fc99e
child 777
37f87013dfd8
permissions
-rw-r--r--

6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
Summary: decouple set_klass() with zeroing the gap when compressed.
Reviewed-by: kvn, ysr, jrose

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

mercurial