1 /*
   2  * Copyright (c) 1997, 2014, 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 "interpreter/interpreter.hpp"
  27 #include "interpreter/interpreterRuntime.hpp"
  28 #include "interpreter/interp_masm.hpp"
  29 #include "interpreter/templateTable.hpp"
  30 #include "memory/universe.inline.hpp"
  31 #include "oops/methodData.hpp"
  32 #include "oops/objArrayKlass.hpp"
  33 #include "oops/oop.inline.hpp"
  34 #include "prims/methodHandles.hpp"
  35 #include "runtime/sharedRuntime.hpp"
  36 #include "runtime/stubRoutines.hpp"
  37 #include "runtime/synchronizer.hpp"
  38 #include "utilities/macros.hpp"
  39 
  40 #ifndef CC_INTERP
  41 #define __ _masm->
  42 
  43 // Misc helpers
  44 
  45 // Do an oop store like *(base + index + offset) = val
  46 // index can be noreg,
  47 static void do_oop_store(InterpreterMacroAssembler* _masm,
  48                          Register base,
  49                          Register index,
  50                          int offset,
  51                          Register val,
  52                          Register tmp,
  53                          BarrierSet::Name barrier,
  54                          bool precise) {
  55   assert(tmp != val && tmp != base && tmp != index, "register collision");
  56   assert(index == noreg || offset == 0, "only one offset");
  57   switch (barrier) {
  58 #if INCLUDE_ALL_GCS
  59     case BarrierSet::G1SATBCT:
  60     case BarrierSet::G1SATBCTLogging:
  61       {
  62         // Load and record the previous value.
  63         __ g1_write_barrier_pre(base, index, offset,
  64                                 noreg /* pre_val */,
  65                                 tmp, true /*preserve_o_regs*/);
  66 
  67         // G1 barrier needs uncompressed oop for region cross check.
  68         Register new_val = val;
  69         if (UseCompressedOops && val != G0) {
  70           new_val = tmp;
  71           __ mov(val, new_val);
  72         }
  73 
  74         if (index == noreg ) {
  75           assert(Assembler::is_simm13(offset), "fix this code");
  76           __ store_heap_oop(val, base, offset);
  77         } else {
  78           __ store_heap_oop(val, base, index);
  79         }
  80 
  81         // No need for post barrier if storing NULL
  82         if (val != G0) {
  83           if (precise) {
  84             if (index == noreg) {
  85               __ add(base, offset, base);
  86             } else {
  87               __ add(base, index, base);
  88             }
  89           }
  90           __ g1_write_barrier_post(base, new_val, tmp);
  91         }
  92       }
  93       break;
  94 #endif // INCLUDE_ALL_GCS
  95     case BarrierSet::CardTableModRef:
  96     case BarrierSet::CardTableExtension:
  97       {
  98         if (index == noreg ) {
  99           assert(Assembler::is_simm13(offset), "fix this code");
 100           __ store_heap_oop(val, base, offset);
 101         } else {
 102           __ store_heap_oop(val, base, index);
 103         }
 104         // No need for post barrier if storing NULL
 105         if (val != G0) {
 106           if (precise) {
 107             if (index == noreg) {
 108               __ add(base, offset, base);
 109             } else {
 110               __ add(base, index, base);
 111             }
 112           }
 113           __ card_write_barrier_post(base, val, tmp);
 114         }
 115       }
 116       break;
 117     case BarrierSet::ModRef:
 118       ShouldNotReachHere();
 119       break;
 120     default      :
 121       ShouldNotReachHere();
 122 
 123   }
 124 }
 125 
 126 
 127 //----------------------------------------------------------------------------------------------------
 128 // Platform-dependent initialization
 129 
 130 void TemplateTable::pd_initialize() {
 131   // (none)
 132 }
 133 
 134 
 135 //----------------------------------------------------------------------------------------------------
 136 // Condition conversion
 137 Assembler::Condition ccNot(TemplateTable::Condition cc) {
 138   switch (cc) {
 139     case TemplateTable::equal        : return Assembler::notEqual;
 140     case TemplateTable::not_equal    : return Assembler::equal;
 141     case TemplateTable::less         : return Assembler::greaterEqual;
 142     case TemplateTable::less_equal   : return Assembler::greater;
 143     case TemplateTable::greater      : return Assembler::lessEqual;
 144     case TemplateTable::greater_equal: return Assembler::less;
 145   }
 146   ShouldNotReachHere();
 147   return Assembler::zero;
 148 }
 149 
 150 //----------------------------------------------------------------------------------------------------
 151 // Miscelaneous helper routines
 152 
 153 
 154 Address TemplateTable::at_bcp(int offset) {
 155   assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
 156   return Address(Lbcp, offset);
 157 }
 158 
 159 
 160 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
 161                                    Register temp_reg, bool load_bc_into_bc_reg/*=true*/,
 162                                    int byte_no) {
 163   // With sharing on, may need to test Method* flag.
 164   if (!RewriteBytecodes)  return;
 165   Label L_patch_done;
 166 
 167   switch (bc) {
 168   case Bytecodes::_fast_aputfield:
 169   case Bytecodes::_fast_bputfield:
 170   case Bytecodes::_fast_cputfield:
 171   case Bytecodes::_fast_dputfield:
 172   case Bytecodes::_fast_fputfield:
 173   case Bytecodes::_fast_iputfield:
 174   case Bytecodes::_fast_lputfield:
 175   case Bytecodes::_fast_sputfield:
 176     {
 177       // We skip bytecode quickening for putfield instructions when
 178       // the put_code written to the constant pool cache is zero.
 179       // This is required so that every execution of this instruction
 180       // calls out to InterpreterRuntime::resolve_get_put to do
 181       // additional, required work.
 182       assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
 183       assert(load_bc_into_bc_reg, "we use bc_reg as temp");
 184       __ get_cache_and_index_and_bytecode_at_bcp(bc_reg, temp_reg, temp_reg, byte_no, 1);
 185       __ set(bc, bc_reg);
 186       __ cmp_and_br_short(temp_reg, 0, Assembler::equal, Assembler::pn, L_patch_done);  // don't patch
 187     }
 188     break;
 189   default:
 190     assert(byte_no == -1, "sanity");
 191     if (load_bc_into_bc_reg) {
 192       __ set(bc, bc_reg);
 193     }
 194   }
 195 
 196   if (JvmtiExport::can_post_breakpoint()) {
 197     Label L_fast_patch;
 198     __ ldub(at_bcp(0), temp_reg);
 199     __ cmp_and_br_short(temp_reg, Bytecodes::_breakpoint, Assembler::notEqual, Assembler::pt, L_fast_patch);
 200     // perform the quickening, slowly, in the bowels of the breakpoint table
 201     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), Lmethod, Lbcp, bc_reg);
 202     __ ba_short(L_patch_done);
 203     __ bind(L_fast_patch);
 204   }
 205 
 206 #ifdef ASSERT
 207   Bytecodes::Code orig_bytecode =  Bytecodes::java_code(bc);
 208   Label L_okay;
 209   __ ldub(at_bcp(0), temp_reg);
 210   __ cmp(temp_reg, orig_bytecode);
 211   __ br(Assembler::equal, false, Assembler::pt, L_okay);
 212   __ delayed()->cmp(temp_reg, bc_reg);
 213   __ br(Assembler::equal, false, Assembler::pt, L_okay);
 214   __ delayed()->nop();
 215   __ stop("patching the wrong bytecode");
 216   __ bind(L_okay);
 217 #endif
 218 
 219   // patch bytecode
 220   __ stb(bc_reg, at_bcp(0));
 221   __ bind(L_patch_done);
 222 }
 223 
 224 //----------------------------------------------------------------------------------------------------
 225 // Individual instructions
 226 
 227 void TemplateTable::nop() {
 228   transition(vtos, vtos);
 229   // nothing to do
 230 }
 231 
 232 void TemplateTable::shouldnotreachhere() {
 233   transition(vtos, vtos);
 234   __ stop("shouldnotreachhere bytecode");
 235 }
 236 
 237 void TemplateTable::aconst_null() {
 238   transition(vtos, atos);
 239   __ clr(Otos_i);
 240 }
 241 
 242 
 243 void TemplateTable::iconst(int value) {
 244   transition(vtos, itos);
 245   __ set(value, Otos_i);
 246 }
 247 
 248 
 249 void TemplateTable::lconst(int value) {
 250   transition(vtos, ltos);
 251   assert(value >= 0, "check this code");
 252 #ifdef _LP64
 253   __ set(value, Otos_l);
 254 #else
 255   __ set(value, Otos_l2);
 256   __ clr( Otos_l1);
 257 #endif
 258 }
 259 
 260 
 261 void TemplateTable::fconst(int value) {
 262   transition(vtos, ftos);
 263   static float zero = 0.0, one = 1.0, two = 2.0;
 264   float* p;
 265   switch( value ) {
 266    default: ShouldNotReachHere();
 267    case 0:  p = &zero;  break;
 268    case 1:  p = &one;   break;
 269    case 2:  p = &two;   break;
 270   }
 271   AddressLiteral a(p);
 272   __ sethi(a, G3_scratch);
 273   __ ldf(FloatRegisterImpl::S, G3_scratch, a.low10(), Ftos_f);
 274 }
 275 
 276 
 277 void TemplateTable::dconst(int value) {
 278   transition(vtos, dtos);
 279   static double zero = 0.0, one = 1.0;
 280   double* p;
 281   switch( value ) {
 282    default: ShouldNotReachHere();
 283    case 0:  p = &zero;  break;
 284    case 1:  p = &one;   break;
 285   }
 286   AddressLiteral a(p);
 287   __ sethi(a, G3_scratch);
 288   __ ldf(FloatRegisterImpl::D, G3_scratch, a.low10(), Ftos_d);
 289 }
 290 
 291 
 292 // %%%%% Should factore most snippet templates across platforms
 293 
 294 void TemplateTable::bipush() {
 295   transition(vtos, itos);
 296   __ ldsb( at_bcp(1), Otos_i );
 297 }
 298 
 299 void TemplateTable::sipush() {
 300   transition(vtos, itos);
 301   __ get_2_byte_integer_at_bcp(1, G3_scratch, Otos_i, InterpreterMacroAssembler::Signed);
 302 }
 303 
 304 void TemplateTable::ldc(bool wide) {
 305   transition(vtos, vtos);
 306   Label call_ldc, notInt, isString, notString, notClass, exit;
 307 
 308   if (wide) {
 309     __ get_2_byte_integer_at_bcp(1, G3_scratch, O1, InterpreterMacroAssembler::Unsigned);
 310   } else {
 311     __ ldub(Lbcp, 1, O1);
 312   }
 313   __ get_cpool_and_tags(O0, O2);
 314 
 315   const int base_offset = ConstantPool::header_size() * wordSize;
 316   const int tags_offset = Array<u1>::base_offset_in_bytes();
 317 
 318   // get type from tags
 319   __ add(O2, tags_offset, O2);
 320   __ ldub(O2, O1, O2);
 321 
 322   // unresolved class? If so, must resolve
 323   __ cmp_and_brx_short(O2, JVM_CONSTANT_UnresolvedClass, Assembler::equal, Assembler::pt, call_ldc);
 324 
 325   // unresolved class in error state
 326   __ cmp_and_brx_short(O2, JVM_CONSTANT_UnresolvedClassInError, Assembler::equal, Assembler::pn, call_ldc);
 327 
 328   __ cmp(O2, JVM_CONSTANT_Class);      // need to call vm to get java mirror of the class
 329   __ brx(Assembler::notEqual, true, Assembler::pt, notClass);
 330   __ delayed()->add(O0, base_offset, O0);
 331 
 332   __ bind(call_ldc);
 333   __ set(wide, O1);
 334   call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), O1);
 335   __ push(atos);
 336   __ ba_short(exit);
 337 
 338   __ bind(notClass);
 339  // __ add(O0, base_offset, O0);
 340   __ sll(O1, LogBytesPerWord, O1);
 341   __ cmp(O2, JVM_CONSTANT_Integer);
 342   __ brx(Assembler::notEqual, true, Assembler::pt, notInt);
 343   __ delayed()->cmp(O2, JVM_CONSTANT_String);
 344   __ ld(O0, O1, Otos_i);
 345   __ push(itos);
 346   __ ba_short(exit);
 347 
 348   __ bind(notInt);
 349  // __ cmp(O2, JVM_CONSTANT_String);
 350   __ brx(Assembler::notEqual, true, Assembler::pt, notString);
 351   __ delayed()->ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
 352   __ bind(isString);
 353   __ stop("string should be rewritten to fast_aldc");
 354   __ ba_short(exit);
 355 
 356   __ bind(notString);
 357  // __ ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
 358   __ push(ftos);
 359 
 360   __ bind(exit);
 361 }
 362 
 363 // Fast path for caching oop constants.
 364 // %%% We should use this to handle Class and String constants also.
 365 // %%% It will simplify the ldc/primitive path considerably.
 366 void TemplateTable::fast_aldc(bool wide) {
 367   transition(vtos, atos);
 368 
 369   int index_size = wide ? sizeof(u2) : sizeof(u1);
 370   Label resolved;
 371 
 372   // We are resolved if the resolved reference cache entry contains a
 373   // non-null object (CallSite, etc.)
 374   assert_different_registers(Otos_i, G3_scratch);
 375   __ get_cache_index_at_bcp(Otos_i, G3_scratch, 1, index_size);  // load index => G3_scratch
 376   __ load_resolved_reference_at_index(Otos_i, G3_scratch);
 377   __ tst(Otos_i);
 378   __ br(Assembler::notEqual, false, Assembler::pt, resolved);
 379   __ delayed()->set((int)bytecode(), O1);
 380 
 381   address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);
 382 
 383   // first time invocation - must resolve first
 384   __ call_VM(Otos_i, entry, O1);
 385   __ bind(resolved);
 386   __ verify_oop(Otos_i);
 387 }
 388 
 389 void TemplateTable::ldc2_w() {
 390   transition(vtos, vtos);
 391   Label Long, exit;
 392 
 393   __ get_2_byte_integer_at_bcp(1, G3_scratch, O1, InterpreterMacroAssembler::Unsigned);
 394   __ get_cpool_and_tags(O0, O2);
 395 
 396   const int base_offset = ConstantPool::header_size() * wordSize;
 397   const int tags_offset = Array<u1>::base_offset_in_bytes();
 398   // get type from tags
 399   __ add(O2, tags_offset, O2);
 400   __ ldub(O2, O1, O2);
 401 
 402   __ sll(O1, LogBytesPerWord, O1);
 403   __ add(O0, O1, G3_scratch);
 404 
 405   __ cmp_and_brx_short(O2, JVM_CONSTANT_Double, Assembler::notEqual, Assembler::pt, Long);
 406   // A double can be placed at word-aligned locations in the constant pool.
 407   // Check out Conversions.java for an example.
 408   // Also ConstantPool::header_size() is 20, which makes it very difficult
 409   // to double-align double on the constant pool.  SG, 11/7/97
 410 #ifdef _LP64
 411   __ ldf(FloatRegisterImpl::D, G3_scratch, base_offset, Ftos_d);
 412 #else
 413   FloatRegister f = Ftos_d;
 414   __ ldf(FloatRegisterImpl::S, G3_scratch, base_offset, f);
 415   __ ldf(FloatRegisterImpl::S, G3_scratch, base_offset + sizeof(jdouble)/2,
 416          f->successor());
 417 #endif
 418   __ push(dtos);
 419   __ ba_short(exit);
 420 
 421   __ bind(Long);
 422 #ifdef _LP64
 423   __ ldx(G3_scratch, base_offset, Otos_l);
 424 #else
 425   __ ld(G3_scratch, base_offset, Otos_l);
 426   __ ld(G3_scratch, base_offset + sizeof(jlong)/2, Otos_l->successor());
 427 #endif
 428   __ push(ltos);
 429 
 430   __ bind(exit);
 431 }
 432 
 433 void TemplateTable::locals_index(Register reg, int offset) {
 434   __ ldub( at_bcp(offset), reg );
 435 }
 436 
 437 void TemplateTable::locals_index_wide(Register reg) {
 438   // offset is 2, not 1, because Lbcp points to wide prefix code
 439   __ get_2_byte_integer_at_bcp(2, G4_scratch, reg, InterpreterMacroAssembler::Unsigned);
 440 }
 441 
 442 void TemplateTable::iload() {
 443   iload_internal();
 444 }
 445 
 446 void TemplateTable::nofast_iload() {
 447   iload_internal(may_not_rewrite);
 448 }
 449 
 450 void TemplateTable::iload_internal(RewriteControl rc) {
 451   transition(vtos, itos);
 452   // Rewrite iload,iload  pair into fast_iload2
 453   //         iload,caload pair into fast_icaload
 454   if (RewriteFrequentPairs && rc == may_rewrite) {
 455     Label rewrite, done;
 456 
 457     // get next byte
 458     __ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_iload)), G3_scratch);
 459 
 460     // if _iload, wait to rewrite to iload2.  We only want to rewrite the
 461     // last two iloads in a pair.  Comparing against fast_iload means that
 462     // the next bytecode is neither an iload or a caload, and therefore
 463     // an iload pair.
 464     __ cmp_and_br_short(G3_scratch, (int)Bytecodes::_iload, Assembler::equal, Assembler::pn, done);
 465 
 466     __ cmp(G3_scratch, (int)Bytecodes::_fast_iload);
 467     __ br(Assembler::equal, false, Assembler::pn, rewrite);
 468     __ delayed()->set(Bytecodes::_fast_iload2, G4_scratch);
 469 
 470     __ cmp(G3_scratch, (int)Bytecodes::_caload);
 471     __ br(Assembler::equal, false, Assembler::pn, rewrite);
 472     __ delayed()->set(Bytecodes::_fast_icaload, G4_scratch);
 473 
 474     __ set(Bytecodes::_fast_iload, G4_scratch);  // don't check again
 475     // rewrite
 476     // G4_scratch: fast bytecode
 477     __ bind(rewrite);
 478     patch_bytecode(Bytecodes::_iload, G4_scratch, G3_scratch, false);
 479     __ bind(done);
 480   }
 481 
 482   // Get the local value into tos
 483   locals_index(G3_scratch);
 484   __ access_local_int( G3_scratch, Otos_i );
 485 }
 486 
 487 void TemplateTable::fast_iload2() {
 488   transition(vtos, itos);
 489   locals_index(G3_scratch);
 490   __ access_local_int( G3_scratch, Otos_i );
 491   __ push_i();
 492   locals_index(G3_scratch, 3);  // get next bytecode's local index.
 493   __ access_local_int( G3_scratch, Otos_i );
 494 }
 495 
 496 void TemplateTable::fast_iload() {
 497   transition(vtos, itos);
 498   locals_index(G3_scratch);
 499   __ access_local_int( G3_scratch, Otos_i );
 500 }
 501 
 502 void TemplateTable::lload() {
 503   transition(vtos, ltos);
 504   locals_index(G3_scratch);
 505   __ access_local_long( G3_scratch, Otos_l );
 506 }
 507 
 508 
 509 void TemplateTable::fload() {
 510   transition(vtos, ftos);
 511   locals_index(G3_scratch);
 512   __ access_local_float( G3_scratch, Ftos_f );
 513 }
 514 
 515 
 516 void TemplateTable::dload() {
 517   transition(vtos, dtos);
 518   locals_index(G3_scratch);
 519   __ access_local_double( G3_scratch, Ftos_d );
 520 }
 521 
 522 
 523 void TemplateTable::aload() {
 524   transition(vtos, atos);
 525   locals_index(G3_scratch);
 526   __ access_local_ptr( G3_scratch, Otos_i);
 527 }
 528 
 529 
 530 void TemplateTable::wide_iload() {
 531   transition(vtos, itos);
 532   locals_index_wide(G3_scratch);
 533   __ access_local_int( G3_scratch, Otos_i );
 534 }
 535 
 536 
 537 void TemplateTable::wide_lload() {
 538   transition(vtos, ltos);
 539   locals_index_wide(G3_scratch);
 540   __ access_local_long( G3_scratch, Otos_l );
 541 }
 542 
 543 
 544 void TemplateTable::wide_fload() {
 545   transition(vtos, ftos);
 546   locals_index_wide(G3_scratch);
 547   __ access_local_float( G3_scratch, Ftos_f );
 548 }
 549 
 550 
 551 void TemplateTable::wide_dload() {
 552   transition(vtos, dtos);
 553   locals_index_wide(G3_scratch);
 554   __ access_local_double( G3_scratch, Ftos_d );
 555 }
 556 
 557 
 558 void TemplateTable::wide_aload() {
 559   transition(vtos, atos);
 560   locals_index_wide(G3_scratch);
 561   __ access_local_ptr( G3_scratch, Otos_i );
 562   __ verify_oop(Otos_i);
 563 }
 564 
 565 
 566 void TemplateTable::iaload() {
 567   transition(itos, itos);
 568   // Otos_i: index
 569   // tos: array
 570   __ index_check(O2, Otos_i, LogBytesPerInt, G3_scratch, O3);
 571   __ ld(O3, arrayOopDesc::base_offset_in_bytes(T_INT), Otos_i);
 572 }
 573 
 574 
 575 void TemplateTable::laload() {
 576   transition(itos, ltos);
 577   // Otos_i: index
 578   // O2: array
 579   __ index_check(O2, Otos_i, LogBytesPerLong, G3_scratch, O3);
 580   __ ld_long(O3, arrayOopDesc::base_offset_in_bytes(T_LONG), Otos_l);
 581 }
 582 
 583 
 584 void TemplateTable::faload() {
 585   transition(itos, ftos);
 586   // Otos_i: index
 587   // O2: array
 588   __ index_check(O2, Otos_i, LogBytesPerInt, G3_scratch, O3);
 589   __ ldf(FloatRegisterImpl::S, O3, arrayOopDesc::base_offset_in_bytes(T_FLOAT), Ftos_f);
 590 }
 591 
 592 
 593 void TemplateTable::daload() {
 594   transition(itos, dtos);
 595   // Otos_i: index
 596   // O2: array
 597   __ index_check(O2, Otos_i, LogBytesPerLong, G3_scratch, O3);
 598   __ ldf(FloatRegisterImpl::D, O3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE), Ftos_d);
 599 }
 600 
 601 
 602 void TemplateTable::aaload() {
 603   transition(itos, atos);
 604   // Otos_i: index
 605   // tos: array
 606   __ index_check(O2, Otos_i, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O3);
 607   __ load_heap_oop(O3, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i);
 608   __ verify_oop(Otos_i);
 609 }
 610 
 611 
 612 void TemplateTable::baload() {
 613   transition(itos, itos);
 614   // Otos_i: index
 615   // tos: array
 616   __ index_check(O2, Otos_i, 0, G3_scratch, O3);
 617   __ ldsb(O3, arrayOopDesc::base_offset_in_bytes(T_BYTE), Otos_i);
 618 }
 619 
 620 
 621 void TemplateTable::caload() {
 622   transition(itos, itos);
 623   // Otos_i: index
 624   // tos: array
 625   __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
 626   __ lduh(O3, arrayOopDesc::base_offset_in_bytes(T_CHAR), Otos_i);
 627 }
 628 
 629 void TemplateTable::fast_icaload() {
 630   transition(vtos, itos);
 631   // Otos_i: index
 632   // tos: array
 633   locals_index(G3_scratch);
 634   __ access_local_int( G3_scratch, Otos_i );
 635   __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
 636   __ lduh(O3, arrayOopDesc::base_offset_in_bytes(T_CHAR), Otos_i);
 637 }
 638 
 639 
 640 void TemplateTable::saload() {
 641   transition(itos, itos);
 642   // Otos_i: index
 643   // tos: array
 644   __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
 645   __ ldsh(O3, arrayOopDesc::base_offset_in_bytes(T_SHORT), Otos_i);
 646 }
 647 
 648 
 649 void TemplateTable::iload(int n) {
 650   transition(vtos, itos);
 651   __ ld( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
 652 }
 653 
 654 
 655 void TemplateTable::lload(int n) {
 656   transition(vtos, ltos);
 657   assert(n+1 < Argument::n_register_parameters, "would need more code");
 658   __ load_unaligned_long(Llocals, Interpreter::local_offset_in_bytes(n+1), Otos_l);
 659 }
 660 
 661 
 662 void TemplateTable::fload(int n) {
 663   transition(vtos, ftos);
 664   assert(n < Argument::n_register_parameters, "would need more code");
 665   __ ldf( FloatRegisterImpl::S, Llocals, Interpreter::local_offset_in_bytes(n),     Ftos_f );
 666 }
 667 
 668 
 669 void TemplateTable::dload(int n) {
 670   transition(vtos, dtos);
 671   FloatRegister dst = Ftos_d;
 672   __ load_unaligned_double(Llocals, Interpreter::local_offset_in_bytes(n+1), dst);
 673 }
 674 
 675 
 676 void TemplateTable::aload(int n) {
 677   transition(vtos, atos);
 678   __ ld_ptr( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
 679 }
 680 
 681 void TemplateTable::aload_0() {
 682   aload_0_internal();
 683 }
 684 
 685 void TemplateTable::nofast_aload_0() {
 686   aload_0_internal(may_not_rewrite);
 687 }
 688 
 689 void TemplateTable::aload_0_internal(RewriteControl rc) {
 690   transition(vtos, atos);
 691 
 692   // According to bytecode histograms, the pairs:
 693   //
 694   // _aload_0, _fast_igetfield (itos)
 695   // _aload_0, _fast_agetfield (atos)
 696   // _aload_0, _fast_fgetfield (ftos)
 697   //
 698   // occur frequently. If RewriteFrequentPairs is set, the (slow) _aload_0
 699   // bytecode checks the next bytecode and then rewrites the current
 700   // bytecode into a pair bytecode; otherwise it rewrites the current
 701   // bytecode into _fast_aload_0 that doesn't do the pair check anymore.
 702   //
 703   if (RewriteFrequentPairs && rc == may_rewrite) {
 704     Label rewrite, done;
 705 
 706     // get next byte
 707     __ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)), G3_scratch);
 708 
 709     // do actual aload_0
 710     aload(0);
 711 
 712     // if _getfield then wait with rewrite
 713     __ cmp_and_br_short(G3_scratch, (int)Bytecodes::_getfield, Assembler::equal, Assembler::pn, done);
 714 
 715     // if _igetfield then rewrite to _fast_iaccess_0
 716     assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
 717     __ cmp(G3_scratch, (int)Bytecodes::_fast_igetfield);
 718     __ br(Assembler::equal, false, Assembler::pn, rewrite);
 719     __ delayed()->set(Bytecodes::_fast_iaccess_0, G4_scratch);
 720 
 721     // if _agetfield then rewrite to _fast_aaccess_0
 722     assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
 723     __ cmp(G3_scratch, (int)Bytecodes::_fast_agetfield);
 724     __ br(Assembler::equal, false, Assembler::pn, rewrite);
 725     __ delayed()->set(Bytecodes::_fast_aaccess_0, G4_scratch);
 726 
 727     // if _fgetfield then rewrite to _fast_faccess_0
 728     assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
 729     __ cmp(G3_scratch, (int)Bytecodes::_fast_fgetfield);
 730     __ br(Assembler::equal, false, Assembler::pn, rewrite);
 731     __ delayed()->set(Bytecodes::_fast_faccess_0, G4_scratch);
 732 
 733     // else rewrite to _fast_aload0
 734     assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
 735     __ set(Bytecodes::_fast_aload_0, G4_scratch);
 736 
 737     // rewrite
 738     // G4_scratch: fast bytecode
 739     __ bind(rewrite);
 740     patch_bytecode(Bytecodes::_aload_0, G4_scratch, G3_scratch, false);
 741     __ bind(done);
 742   } else {
 743     aload(0);
 744   }
 745 }
 746 
 747 void TemplateTable::istore() {
 748   transition(itos, vtos);
 749   locals_index(G3_scratch);
 750   __ store_local_int( G3_scratch, Otos_i );
 751 }
 752 
 753 
 754 void TemplateTable::lstore() {
 755   transition(ltos, vtos);
 756   locals_index(G3_scratch);
 757   __ store_local_long( G3_scratch, Otos_l );
 758 }
 759 
 760 
 761 void TemplateTable::fstore() {
 762   transition(ftos, vtos);
 763   locals_index(G3_scratch);
 764   __ store_local_float( G3_scratch, Ftos_f );
 765 }
 766 
 767 
 768 void TemplateTable::dstore() {
 769   transition(dtos, vtos);
 770   locals_index(G3_scratch);
 771   __ store_local_double( G3_scratch, Ftos_d );
 772 }
 773 
 774 
 775 void TemplateTable::astore() {
 776   transition(vtos, vtos);
 777   __ load_ptr(0, Otos_i);
 778   __ inc(Lesp, Interpreter::stackElementSize);
 779   __ verify_oop_or_return_address(Otos_i, G3_scratch);
 780   locals_index(G3_scratch);
 781   __ store_local_ptr(G3_scratch, Otos_i);
 782 }
 783 
 784 
 785 void TemplateTable::wide_istore() {
 786   transition(vtos, vtos);
 787   __ pop_i();
 788   locals_index_wide(G3_scratch);
 789   __ store_local_int( G3_scratch, Otos_i );
 790 }
 791 
 792 
 793 void TemplateTable::wide_lstore() {
 794   transition(vtos, vtos);
 795   __ pop_l();
 796   locals_index_wide(G3_scratch);
 797   __ store_local_long( G3_scratch, Otos_l );
 798 }
 799 
 800 
 801 void TemplateTable::wide_fstore() {
 802   transition(vtos, vtos);
 803   __ pop_f();
 804   locals_index_wide(G3_scratch);
 805   __ store_local_float( G3_scratch, Ftos_f );
 806 }
 807 
 808 
 809 void TemplateTable::wide_dstore() {
 810   transition(vtos, vtos);
 811   __ pop_d();
 812   locals_index_wide(G3_scratch);
 813   __ store_local_double( G3_scratch, Ftos_d );
 814 }
 815 
 816 
 817 void TemplateTable::wide_astore() {
 818   transition(vtos, vtos);
 819   __ load_ptr(0, Otos_i);
 820   __ inc(Lesp, Interpreter::stackElementSize);
 821   __ verify_oop_or_return_address(Otos_i, G3_scratch);
 822   locals_index_wide(G3_scratch);
 823   __ store_local_ptr(G3_scratch, Otos_i);
 824 }
 825 
 826 
 827 void TemplateTable::iastore() {
 828   transition(itos, vtos);
 829   __ pop_i(O2); // index
 830   // Otos_i: val
 831   // O3: array
 832   __ index_check(O3, O2, LogBytesPerInt, G3_scratch, O2);
 833   __ st(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_INT));
 834 }
 835 
 836 
 837 void TemplateTable::lastore() {
 838   transition(ltos, vtos);
 839   __ pop_i(O2); // index
 840   // Otos_l: val
 841   // O3: array
 842   __ index_check(O3, O2, LogBytesPerLong, G3_scratch, O2);
 843   __ st_long(Otos_l, O2, arrayOopDesc::base_offset_in_bytes(T_LONG));
 844 }
 845 
 846 
 847 void TemplateTable::fastore() {
 848   transition(ftos, vtos);
 849   __ pop_i(O2); // index
 850   // Ftos_f: val
 851   // O3: array
 852   __ index_check(O3, O2, LogBytesPerInt, G3_scratch, O2);
 853   __ stf(FloatRegisterImpl::S, Ftos_f, O2, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
 854 }
 855 
 856 
 857 void TemplateTable::dastore() {
 858   transition(dtos, vtos);
 859   __ pop_i(O2); // index
 860   // Fos_d: val
 861   // O3: array
 862   __ index_check(O3, O2, LogBytesPerLong, G3_scratch, O2);
 863   __ stf(FloatRegisterImpl::D, Ftos_d, O2, arrayOopDesc::base_offset_in_bytes(T_DOUBLE));
 864 }
 865 
 866 
 867 void TemplateTable::aastore() {
 868   Label store_ok, is_null, done;
 869   transition(vtos, vtos);
 870   __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(0), Otos_i);
 871   __ ld(Lesp, Interpreter::expr_offset_in_bytes(1), O2);         // get index
 872   __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(2), O3);     // get array
 873   // Otos_i: val
 874   // O2: index
 875   // O3: array
 876   __ verify_oop(Otos_i);
 877   __ index_check_without_pop(O3, O2, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O1);
 878 
 879   // do array store check - check for NULL value first
 880   __ br_null_short( Otos_i, Assembler::pn, is_null );
 881 
 882   __ load_klass(O3, O4); // get array klass
 883   __ load_klass(Otos_i, O5); // get value klass
 884 
 885   // do fast instanceof cache test
 886 
 887   __ ld_ptr(O4,     in_bytes(ObjArrayKlass::element_klass_offset()),  O4);
 888 
 889   assert(Otos_i == O0, "just checking");
 890 
 891   // Otos_i:    value
 892   // O1:        addr - offset
 893   // O2:        index
 894   // O3:        array
 895   // O4:        array element klass
 896   // O5:        value klass
 897 
 898   // Address element(O1, 0, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
 899 
 900   // Generate a fast subtype check.  Branch to store_ok if no
 901   // failure.  Throw if failure.
 902   __ gen_subtype_check( O5, O4, G3_scratch, G4_scratch, G1_scratch, store_ok );
 903 
 904   // Not a subtype; so must throw exception
 905   __ throw_if_not_x( Assembler::never, Interpreter::_throw_ArrayStoreException_entry, G3_scratch );
 906 
 907   // Store is OK.
 908   __ bind(store_ok);
 909   do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, _bs->kind(), true);
 910 
 911   __ ba(done);
 912   __ delayed()->inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
 913 
 914   __ bind(is_null);
 915   do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, _bs->kind(), true);
 916 
 917   __ profile_null_seen(G3_scratch);
 918   __ inc(Lesp, 3* Interpreter::stackElementSize);     // adj sp (pops array, index and value)
 919   __ bind(done);
 920 }
 921 
 922 
 923 void TemplateTable::bastore() {
 924   transition(itos, vtos);
 925   __ pop_i(O2); // index
 926   // Otos_i: val
 927   // O3: array
 928   __ index_check(O3, O2, 0, G3_scratch, O2);
 929   __ stb(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_BYTE));
 930 }
 931 
 932 
 933 void TemplateTable::castore() {
 934   transition(itos, vtos);
 935   __ pop_i(O2); // index
 936   // Otos_i: val
 937   // O3: array
 938   __ index_check(O3, O2, LogBytesPerShort, G3_scratch, O2);
 939   __ sth(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_CHAR));
 940 }
 941 
 942 
 943 void TemplateTable::sastore() {
 944   // %%%%% Factor across platform
 945   castore();
 946 }
 947 
 948 
 949 void TemplateTable::istore(int n) {
 950   transition(itos, vtos);
 951   __ st(Otos_i, Llocals, Interpreter::local_offset_in_bytes(n));
 952 }
 953 
 954 
 955 void TemplateTable::lstore(int n) {
 956   transition(ltos, vtos);
 957   assert(n+1 < Argument::n_register_parameters, "only handle register cases");
 958   __ store_unaligned_long(Otos_l, Llocals, Interpreter::local_offset_in_bytes(n+1));
 959 
 960 }
 961 
 962 
 963 void TemplateTable::fstore(int n) {
 964   transition(ftos, vtos);
 965   assert(n < Argument::n_register_parameters, "only handle register cases");
 966   __ stf(FloatRegisterImpl::S, Ftos_f, Llocals, Interpreter::local_offset_in_bytes(n));
 967 }
 968 
 969 
 970 void TemplateTable::dstore(int n) {
 971   transition(dtos, vtos);
 972   FloatRegister src = Ftos_d;
 973   __ store_unaligned_double(src, Llocals, Interpreter::local_offset_in_bytes(n+1));
 974 }
 975 
 976 
 977 void TemplateTable::astore(int n) {
 978   transition(vtos, vtos);
 979   __ load_ptr(0, Otos_i);
 980   __ inc(Lesp, Interpreter::stackElementSize);
 981   __ verify_oop_or_return_address(Otos_i, G3_scratch);
 982   __ store_local_ptr(n, Otos_i);
 983 }
 984 
 985 
 986 void TemplateTable::pop() {
 987   transition(vtos, vtos);
 988   __ inc(Lesp, Interpreter::stackElementSize);
 989 }
 990 
 991 
 992 void TemplateTable::pop2() {
 993   transition(vtos, vtos);
 994   __ inc(Lesp, 2 * Interpreter::stackElementSize);
 995 }
 996 
 997 
 998 void TemplateTable::dup() {
 999   transition(vtos, vtos);
1000   // stack: ..., a
1001   // load a and tag
1002   __ load_ptr(0, Otos_i);
1003   __ push_ptr(Otos_i);
1004   // stack: ..., a, a
1005 }
1006 
1007 
1008 void TemplateTable::dup_x1() {
1009   transition(vtos, vtos);
1010   // stack: ..., a, b
1011   __ load_ptr( 1, G3_scratch);  // get a
1012   __ load_ptr( 0, Otos_l1);     // get b
1013   __ store_ptr(1, Otos_l1);     // put b
1014   __ store_ptr(0, G3_scratch);  // put a - like swap
1015   __ push_ptr(Otos_l1);         // push b
1016   // stack: ..., b, a, b
1017 }
1018 
1019 
1020 void TemplateTable::dup_x2() {
1021   transition(vtos, vtos);
1022   // stack: ..., a, b, c
1023   // get c and push on stack, reuse registers
1024   __ load_ptr( 0, G3_scratch);  // get c
1025   __ push_ptr(G3_scratch);      // push c with tag
1026   // stack: ..., a, b, c, c  (c in reg)  (Lesp - 4)
1027   // (stack offsets n+1 now)
1028   __ load_ptr( 3, Otos_l1);     // get a
1029   __ store_ptr(3, G3_scratch);  // put c at 3
1030   // stack: ..., c, b, c, c  (a in reg)
1031   __ load_ptr( 2, G3_scratch);  // get b
1032   __ store_ptr(2, Otos_l1);     // put a at 2
1033   // stack: ..., c, a, c, c  (b in reg)
1034   __ store_ptr(1, G3_scratch);  // put b at 1
1035   // stack: ..., c, a, b, c
1036 }
1037 
1038 
1039 void TemplateTable::dup2() {
1040   transition(vtos, vtos);
1041   __ load_ptr(1, G3_scratch);  // get a
1042   __ load_ptr(0, Otos_l1);     // get b
1043   __ push_ptr(G3_scratch);     // push a
1044   __ push_ptr(Otos_l1);        // push b
1045   // stack: ..., a, b, a, b
1046 }
1047 
1048 
1049 void TemplateTable::dup2_x1() {
1050   transition(vtos, vtos);
1051   // stack: ..., a, b, c
1052   __ load_ptr( 1, Lscratch);    // get b
1053   __ load_ptr( 2, Otos_l1);     // get a
1054   __ store_ptr(2, Lscratch);    // put b at a
1055   // stack: ..., b, b, c
1056   __ load_ptr( 0, G3_scratch);  // get c
1057   __ store_ptr(1, G3_scratch);  // put c at b
1058   // stack: ..., b, c, c
1059   __ store_ptr(0, Otos_l1);     // put a at c
1060   // stack: ..., b, c, a
1061   __ push_ptr(Lscratch);        // push b
1062   __ push_ptr(G3_scratch);      // push c
1063   // stack: ..., b, c, a, b, c
1064 }
1065 
1066 
1067 // The spec says that these types can be a mixture of category 1 (1 word)
1068 // types and/or category 2 types (long and doubles)
1069 void TemplateTable::dup2_x2() {
1070   transition(vtos, vtos);
1071   // stack: ..., a, b, c, d
1072   __ load_ptr( 1, Lscratch);    // get c
1073   __ load_ptr( 3, Otos_l1);     // get a
1074   __ store_ptr(3, Lscratch);    // put c at 3
1075   __ store_ptr(1, Otos_l1);     // put a at 1
1076   // stack: ..., c, b, a, d
1077   __ load_ptr( 2, G3_scratch);  // get b
1078   __ load_ptr( 0, Otos_l1);     // get d
1079   __ store_ptr(0, G3_scratch);  // put b at 0
1080   __ store_ptr(2, Otos_l1);     // put d at 2
1081   // stack: ..., c, d, a, b
1082   __ push_ptr(Lscratch);        // push c
1083   __ push_ptr(Otos_l1);         // push d
1084   // stack: ..., c, d, a, b, c, d
1085 }
1086 
1087 
1088 void TemplateTable::swap() {
1089   transition(vtos, vtos);
1090   // stack: ..., a, b
1091   __ load_ptr( 1, G3_scratch);  // get a
1092   __ load_ptr( 0, Otos_l1);     // get b
1093   __ store_ptr(0, G3_scratch);  // put b
1094   __ store_ptr(1, Otos_l1);     // put a
1095   // stack: ..., b, a
1096 }
1097 
1098 
1099 void TemplateTable::iop2(Operation op) {
1100   transition(itos, itos);
1101   __ pop_i(O1);
1102   switch (op) {
1103    case  add:  __  add(O1, Otos_i, Otos_i);  break;
1104    case  sub:  __  sub(O1, Otos_i, Otos_i);  break;
1105      // %%%%% Mul may not exist: better to call .mul?
1106    case  mul:  __ smul(O1, Otos_i, Otos_i);  break;
1107    case _and:  __ and3(O1, Otos_i, Otos_i);  break;
1108    case  _or:  __  or3(O1, Otos_i, Otos_i);  break;
1109    case _xor:  __ xor3(O1, Otos_i, Otos_i);  break;
1110    case  shl:  __  sll(O1, Otos_i, Otos_i);  break;
1111    case  shr:  __  sra(O1, Otos_i, Otos_i);  break;
1112    case ushr:  __  srl(O1, Otos_i, Otos_i);  break;
1113    default: ShouldNotReachHere();
1114   }
1115 }
1116 
1117 
1118 void TemplateTable::lop2(Operation op) {
1119   transition(ltos, ltos);
1120   __ pop_l(O2);
1121   switch (op) {
1122 #ifdef _LP64
1123    case  add:  __  add(O2, Otos_l, Otos_l);  break;
1124    case  sub:  __  sub(O2, Otos_l, Otos_l);  break;
1125    case _and:  __ and3(O2, Otos_l, Otos_l);  break;
1126    case  _or:  __  or3(O2, Otos_l, Otos_l);  break;
1127    case _xor:  __ xor3(O2, Otos_l, Otos_l);  break;
1128 #else
1129    case  add:  __ addcc(O3, Otos_l2, Otos_l2);  __ addc(O2, Otos_l1, Otos_l1);  break;
1130    case  sub:  __ subcc(O3, Otos_l2, Otos_l2);  __ subc(O2, Otos_l1, Otos_l1);  break;
1131    case _and:  __  and3(O3, Otos_l2, Otos_l2);  __ and3(O2, Otos_l1, Otos_l1);  break;
1132    case  _or:  __   or3(O3, Otos_l2, Otos_l2);  __  or3(O2, Otos_l1, Otos_l1);  break;
1133    case _xor:  __  xor3(O3, Otos_l2, Otos_l2);  __ xor3(O2, Otos_l1, Otos_l1);  break;
1134 #endif
1135    default: ShouldNotReachHere();
1136   }
1137 }
1138 
1139 
1140 void TemplateTable::idiv() {
1141   // %%%%% Later: ForSPARC/V7 call .sdiv library routine,
1142   // %%%%% Use ldsw...sdivx on pure V9 ABI. 64 bit safe.
1143 
1144   transition(itos, itos);
1145   __ pop_i(O1); // get 1st op
1146 
1147   // Y contains upper 32 bits of result, set it to 0 or all ones
1148   __ wry(G0);
1149   __ mov(~0, G3_scratch);
1150 
1151   __ tst(O1);
1152      Label neg;
1153   __ br(Assembler::negative, true, Assembler::pn, neg);
1154   __ delayed()->wry(G3_scratch);
1155   __ bind(neg);
1156 
1157      Label ok;
1158   __ tst(Otos_i);
1159   __ throw_if_not_icc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch );
1160 
1161   const int min_int = 0x80000000;
1162   Label regular;
1163   __ cmp(Otos_i, -1);
1164   __ br(Assembler::notEqual, false, Assembler::pt, regular);
1165 #ifdef _LP64
1166   // Don't put set in delay slot
1167   // Set will turn into multiple instructions in 64 bit mode
1168   __ delayed()->nop();
1169   __ set(min_int, G4_scratch);
1170 #else
1171   __ delayed()->set(min_int, G4_scratch);
1172 #endif
1173   Label done;
1174   __ cmp(O1, G4_scratch);
1175   __ br(Assembler::equal, true, Assembler::pt, done);
1176   __ delayed()->mov(O1, Otos_i);   // (mov only executed if branch taken)
1177 
1178   __ bind(regular);
1179   __ sdiv(O1, Otos_i, Otos_i); // note: irem uses O1 after this instruction!
1180   __ bind(done);
1181 }
1182 
1183 
1184 void TemplateTable::irem() {
1185   transition(itos, itos);
1186   __ mov(Otos_i, O2); // save divisor
1187   idiv();                               // %%%% Hack: exploits fact that idiv leaves dividend in O1
1188   __ smul(Otos_i, O2, Otos_i);
1189   __ sub(O1, Otos_i, Otos_i);
1190 }
1191 
1192 
1193 void TemplateTable::lmul() {
1194   transition(ltos, ltos);
1195   __ pop_l(O2);
1196 #ifdef _LP64
1197   __ mulx(Otos_l, O2, Otos_l);
1198 #else
1199   __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lmul));
1200 #endif
1201 
1202 }
1203 
1204 
1205 void TemplateTable::ldiv() {
1206   transition(ltos, ltos);
1207 
1208   // check for zero
1209   __ pop_l(O2);
1210 #ifdef _LP64
1211   __ tst(Otos_l);
1212   __ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
1213   __ sdivx(O2, Otos_l, Otos_l);
1214 #else
1215   __ orcc(Otos_l1, Otos_l2, G0);
1216   __ throw_if_not_icc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
1217   __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::ldiv));
1218 #endif
1219 }
1220 
1221 
1222 void TemplateTable::lrem() {
1223   transition(ltos, ltos);
1224 
1225   // check for zero
1226   __ pop_l(O2);
1227 #ifdef _LP64
1228   __ tst(Otos_l);
1229   __ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
1230   __ sdivx(O2, Otos_l, Otos_l2);
1231   __ mulx (Otos_l2, Otos_l, Otos_l2);
1232   __ sub  (O2, Otos_l2, Otos_l);
1233 #else
1234   __ orcc(Otos_l1, Otos_l2, G0);
1235   __ throw_if_not_icc(Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
1236   __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lrem));
1237 #endif
1238 }
1239 
1240 
1241 void TemplateTable::lshl() {
1242   transition(itos, ltos); // %%%% could optimize, fill delay slot or opt for ultra
1243 
1244   __ pop_l(O2);                          // shift value in O2, O3
1245 #ifdef _LP64
1246   __ sllx(O2, Otos_i, Otos_l);
1247 #else
1248   __ lshl(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
1249 #endif
1250 }
1251 
1252 
1253 void TemplateTable::lshr() {
1254   transition(itos, ltos); // %%%% see lshl comment
1255 
1256   __ pop_l(O2);                          // shift value in O2, O3
1257 #ifdef _LP64
1258   __ srax(O2, Otos_i, Otos_l);
1259 #else
1260   __ lshr(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
1261 #endif
1262 }
1263 
1264 
1265 
1266 void TemplateTable::lushr() {
1267   transition(itos, ltos); // %%%% see lshl comment
1268 
1269   __ pop_l(O2);                          // shift value in O2, O3
1270 #ifdef _LP64
1271   __ srlx(O2, Otos_i, Otos_l);
1272 #else
1273   __ lushr(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
1274 #endif
1275 }
1276 
1277 
1278 void TemplateTable::fop2(Operation op) {
1279   transition(ftos, ftos);
1280   switch (op) {
1281    case  add:  __  pop_f(F4); __ fadd(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
1282    case  sub:  __  pop_f(F4); __ fsub(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
1283    case  mul:  __  pop_f(F4); __ fmul(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
1284    case  div:  __  pop_f(F4); __ fdiv(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
1285    case  rem:
1286      assert(Ftos_f == F0, "just checking");
1287 #ifdef _LP64
1288      // LP64 calling conventions use F1, F3 for passing 2 floats
1289      __ pop_f(F1);
1290      __ fmov(FloatRegisterImpl::S, Ftos_f, F3);
1291 #else
1292      __ pop_i(O0);
1293      __ stf(FloatRegisterImpl::S, Ftos_f, __ d_tmp);
1294      __ ld( __ d_tmp, O1 );
1295 #endif
1296      __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::frem));
1297      assert( Ftos_f == F0, "fix this code" );
1298      break;
1299 
1300    default: ShouldNotReachHere();
1301   }
1302 }
1303 
1304 
1305 void TemplateTable::dop2(Operation op) {
1306   transition(dtos, dtos);
1307   switch (op) {
1308    case  add:  __  pop_d(F4); __ fadd(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
1309    case  sub:  __  pop_d(F4); __ fsub(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
1310    case  mul:  __  pop_d(F4); __ fmul(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
1311    case  div:  __  pop_d(F4); __ fdiv(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
1312    case  rem:
1313 #ifdef _LP64
1314      // Pass arguments in D0, D2
1315      __ fmov(FloatRegisterImpl::D, Ftos_f, F2 );
1316      __ pop_d( F0 );
1317 #else
1318      // Pass arguments in O0O1, O2O3
1319      __ stf(FloatRegisterImpl::D, Ftos_f, __ d_tmp);
1320      __ ldd( __ d_tmp, O2 );
1321      __ pop_d(Ftos_f);
1322      __ stf(FloatRegisterImpl::D, Ftos_f, __ d_tmp);
1323      __ ldd( __ d_tmp, O0 );
1324 #endif
1325      __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::drem));
1326      assert( Ftos_d == F0, "fix this code" );
1327      break;
1328 
1329    default: ShouldNotReachHere();
1330   }
1331 }
1332 
1333 
1334 void TemplateTable::ineg() {
1335   transition(itos, itos);
1336   __ neg(Otos_i);
1337 }
1338 
1339 
1340 void TemplateTable::lneg() {
1341   transition(ltos, ltos);
1342 #ifdef _LP64
1343   __ sub(G0, Otos_l, Otos_l);
1344 #else
1345   __ lneg(Otos_l1, Otos_l2);
1346 #endif
1347 }
1348 
1349 
1350 void TemplateTable::fneg() {
1351   transition(ftos, ftos);
1352   __ fneg(FloatRegisterImpl::S, Ftos_f, Ftos_f);
1353 }
1354 
1355 
1356 void TemplateTable::dneg() {
1357   transition(dtos, dtos);
1358   __ fneg(FloatRegisterImpl::D, Ftos_f, Ftos_f);
1359 }
1360 
1361 
1362 void TemplateTable::iinc() {
1363   transition(vtos, vtos);
1364   locals_index(G3_scratch);
1365   __ ldsb(Lbcp, 2, O2);  // load constant
1366   __ access_local_int(G3_scratch, Otos_i);
1367   __ add(Otos_i, O2, Otos_i);
1368   __ st(Otos_i, G3_scratch, 0);    // access_local_int puts E.A. in G3_scratch
1369 }
1370 
1371 
1372 void TemplateTable::wide_iinc() {
1373   transition(vtos, vtos);
1374   locals_index_wide(G3_scratch);
1375   __ get_2_byte_integer_at_bcp( 4,  O2, O3, InterpreterMacroAssembler::Signed);
1376   __ access_local_int(G3_scratch, Otos_i);
1377   __ add(Otos_i, O3, Otos_i);
1378   __ st(Otos_i, G3_scratch, 0);    // access_local_int puts E.A. in G3_scratch
1379 }
1380 
1381 
1382 void TemplateTable::convert() {
1383 // %%%%% Factor this first part accross platforms
1384   #ifdef ASSERT
1385     TosState tos_in  = ilgl;
1386     TosState tos_out = ilgl;
1387     switch (bytecode()) {
1388       case Bytecodes::_i2l: // fall through
1389       case Bytecodes::_i2f: // fall through
1390       case Bytecodes::_i2d: // fall through
1391       case Bytecodes::_i2b: // fall through
1392       case Bytecodes::_i2c: // fall through
1393       case Bytecodes::_i2s: tos_in = itos; break;
1394       case Bytecodes::_l2i: // fall through
1395       case Bytecodes::_l2f: // fall through
1396       case Bytecodes::_l2d: tos_in = ltos; break;
1397       case Bytecodes::_f2i: // fall through
1398       case Bytecodes::_f2l: // fall through
1399       case Bytecodes::_f2d: tos_in = ftos; break;
1400       case Bytecodes::_d2i: // fall through
1401       case Bytecodes::_d2l: // fall through
1402       case Bytecodes::_d2f: tos_in = dtos; break;
1403       default             : ShouldNotReachHere();
1404     }
1405     switch (bytecode()) {
1406       case Bytecodes::_l2i: // fall through
1407       case Bytecodes::_f2i: // fall through
1408       case Bytecodes::_d2i: // fall through
1409       case Bytecodes::_i2b: // fall through
1410       case Bytecodes::_i2c: // fall through
1411       case Bytecodes::_i2s: tos_out = itos; break;
1412       case Bytecodes::_i2l: // fall through
1413       case Bytecodes::_f2l: // fall through
1414       case Bytecodes::_d2l: tos_out = ltos; break;
1415       case Bytecodes::_i2f: // fall through
1416       case Bytecodes::_l2f: // fall through
1417       case Bytecodes::_d2f: tos_out = ftos; break;
1418       case Bytecodes::_i2d: // fall through
1419       case Bytecodes::_l2d: // fall through
1420       case Bytecodes::_f2d: tos_out = dtos; break;
1421       default             : ShouldNotReachHere();
1422     }
1423     transition(tos_in, tos_out);
1424   #endif
1425 
1426 
1427   // Conversion
1428   Label done;
1429   switch (bytecode()) {
1430    case Bytecodes::_i2l:
1431 #ifdef _LP64
1432     // Sign extend the 32 bits
1433     __ sra ( Otos_i, 0, Otos_l );
1434 #else
1435     __ addcc(Otos_i, 0, Otos_l2);
1436     __ br(Assembler::greaterEqual, true, Assembler::pt, done);
1437     __ delayed()->clr(Otos_l1);
1438     __ set(~0, Otos_l1);
1439 #endif
1440     break;
1441 
1442    case Bytecodes::_i2f:
1443     __ st(Otos_i, __ d_tmp );
1444     __ ldf(FloatRegisterImpl::S,  __ d_tmp, F0);
1445     __ fitof(FloatRegisterImpl::S, F0, Ftos_f);
1446     break;
1447 
1448    case Bytecodes::_i2d:
1449     __ st(Otos_i, __ d_tmp);
1450     __ ldf(FloatRegisterImpl::S,  __ d_tmp, F0);
1451     __ fitof(FloatRegisterImpl::D, F0, Ftos_f);
1452     break;
1453 
1454    case Bytecodes::_i2b:
1455     __ sll(Otos_i, 24, Otos_i);
1456     __ sra(Otos_i, 24, Otos_i);
1457     break;
1458 
1459    case Bytecodes::_i2c:
1460     __ sll(Otos_i, 16, Otos_i);
1461     __ srl(Otos_i, 16, Otos_i);
1462     break;
1463 
1464    case Bytecodes::_i2s:
1465     __ sll(Otos_i, 16, Otos_i);
1466     __ sra(Otos_i, 16, Otos_i);
1467     break;
1468 
1469    case Bytecodes::_l2i:
1470 #ifndef _LP64
1471     __ mov(Otos_l2, Otos_i);
1472 #else
1473     // Sign-extend into the high 32 bits
1474     __ sra(Otos_l, 0, Otos_i);
1475 #endif
1476     break;
1477 
1478    case Bytecodes::_l2f:
1479    case Bytecodes::_l2d:
1480     __ st_long(Otos_l, __ d_tmp);
1481     __ ldf(FloatRegisterImpl::D, __ d_tmp, Ftos_d);
1482 
1483     if (bytecode() == Bytecodes::_l2f) {
1484       __ fxtof(FloatRegisterImpl::S, Ftos_d, Ftos_f);
1485     } else {
1486       __ fxtof(FloatRegisterImpl::D, Ftos_d, Ftos_d);
1487     }
1488     break;
1489 
1490   case Bytecodes::_f2i:  {
1491       Label isNaN;
1492       // result must be 0 if value is NaN; test by comparing value to itself
1493       __ fcmp(FloatRegisterImpl::S, Assembler::fcc0, Ftos_f, Ftos_f);
1494       __ fb(Assembler::f_unordered, true, Assembler::pn, isNaN);
1495       __ delayed()->clr(Otos_i);                                     // NaN
1496       __ ftoi(FloatRegisterImpl::S, Ftos_f, F30);
1497       __ stf(FloatRegisterImpl::S, F30, __ d_tmp);
1498       __ ld(__ d_tmp, Otos_i);
1499       __ bind(isNaN);
1500     }
1501     break;
1502 
1503    case Bytecodes::_f2l:
1504     // must uncache tos
1505     __ push_f();
1506 #ifdef _LP64
1507     __ pop_f(F1);
1508 #else
1509     __ pop_i(O0);
1510 #endif
1511     __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::f2l));
1512     break;
1513 
1514    case Bytecodes::_f2d:
1515     __ ftof( FloatRegisterImpl::S, FloatRegisterImpl::D, Ftos_f, Ftos_f);
1516     break;
1517 
1518    case Bytecodes::_d2i:
1519    case Bytecodes::_d2l:
1520     // must uncache tos
1521     __ push_d();
1522 #ifdef _LP64
1523     // LP64 calling conventions pass first double arg in D0
1524     __ pop_d( Ftos_d );
1525 #else
1526     __ pop_i( O0 );
1527     __ pop_i( O1 );
1528 #endif
1529     __ call_VM_leaf(Lscratch,
1530         bytecode() == Bytecodes::_d2i
1531           ? CAST_FROM_FN_PTR(address, SharedRuntime::d2i)
1532           : CAST_FROM_FN_PTR(address, SharedRuntime::d2l));
1533     break;
1534 
1535     case Bytecodes::_d2f:
1536       __ ftof( FloatRegisterImpl::D, FloatRegisterImpl::S, Ftos_d, Ftos_f);
1537     break;
1538 
1539     default: ShouldNotReachHere();
1540   }
1541   __ bind(done);
1542 }
1543 
1544 
1545 void TemplateTable::lcmp() {
1546   transition(ltos, itos);
1547 
1548 #ifdef _LP64
1549   __ pop_l(O1); // pop off value 1, value 2 is in O0
1550   __ lcmp( O1, Otos_l, Otos_i );
1551 #else
1552   __ pop_l(O2); // cmp O2,3 to O0,1
1553   __ lcmp( O2, O3, Otos_l1, Otos_l2, Otos_i );
1554 #endif
1555 }
1556 
1557 
1558 void TemplateTable::float_cmp(bool is_float, int unordered_result) {
1559 
1560   if (is_float) __ pop_f(F2);
1561   else          __ pop_d(F2);
1562 
1563   assert(Ftos_f == F0  &&  Ftos_d == F0,  "alias checking:");
1564 
1565   __ float_cmp( is_float, unordered_result, F2, F0, Otos_i );
1566 }
1567 
1568 void TemplateTable::branch(bool is_jsr, bool is_wide) {
1569   // Note: on SPARC, we use InterpreterMacroAssembler::if_cmp also.
1570   __ verify_thread();
1571 
1572   const Register O2_bumped_count = O2;
1573   __ profile_taken_branch(G3_scratch, O2_bumped_count);
1574 
1575   // get (wide) offset to O1_disp
1576   const Register O1_disp = O1;
1577   if (is_wide)  __ get_4_byte_integer_at_bcp( 1,  G4_scratch, O1_disp,                                    InterpreterMacroAssembler::set_CC);
1578   else          __ get_2_byte_integer_at_bcp( 1,  G4_scratch, O1_disp, InterpreterMacroAssembler::Signed, InterpreterMacroAssembler::set_CC);
1579 
1580   // Handle all the JSR stuff here, then exit.
1581   // It's much shorter and cleaner than intermingling with the
1582   // non-JSR normal-branch stuff occurring below.
1583   if( is_jsr ) {
1584     // compute return address as bci in Otos_i
1585     __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch);
1586     __ sub(Lbcp, G3_scratch, G3_scratch);
1587     __ sub(G3_scratch, in_bytes(ConstMethod::codes_offset()) - (is_wide ? 5 : 3), Otos_i);
1588 
1589     // Bump Lbcp to target of JSR
1590     __ add(Lbcp, O1_disp, Lbcp);
1591     // Push returnAddress for "ret" on stack
1592     __ push_ptr(Otos_i);
1593     // And away we go!
1594     __ dispatch_next(vtos);
1595     return;
1596   }
1597 
1598   // Normal (non-jsr) branch handling
1599 
1600   // Save the current Lbcp
1601   const Register l_cur_bcp = Lscratch;
1602   __ mov( Lbcp, l_cur_bcp );
1603 
1604   bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter;
1605   if ( increment_invocation_counter_for_backward_branches ) {
1606     Label Lforward;
1607     // check branch direction
1608     __ br( Assembler::positive, false,  Assembler::pn, Lforward );
1609     // Bump bytecode pointer by displacement (take the branch)
1610     __ delayed()->add( O1_disp, Lbcp, Lbcp );     // add to bc addr
1611 
1612     const Register G3_method_counters = G3_scratch;
1613     __ get_method_counters(Lmethod, G3_method_counters, Lforward);
1614 
1615     if (TieredCompilation) {
1616       Label Lno_mdo, Loverflow;
1617       int increment = InvocationCounter::count_increment;
1618       if (ProfileInterpreter) {
1619         // If no method data exists, go to profile_continue.
1620         __ ld_ptr(Lmethod, Method::method_data_offset(), G4_scratch);
1621         __ br_null_short(G4_scratch, Assembler::pn, Lno_mdo);
1622 
1623         // Increment backedge counter in the MDO
1624         Address mdo_backedge_counter(G4_scratch, in_bytes(MethodData::backedge_counter_offset()) +
1625                                                  in_bytes(InvocationCounter::counter_offset()));
1626         Address mask(G4_scratch, in_bytes(MethodData::backedge_mask_offset()));
1627         __ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, O0,
1628                                    Assembler::notZero, &Lforward);
1629         __ ba_short(Loverflow);
1630       }
1631 
1632       // If there's no MDO, increment counter in MethodCounters*
1633       __ bind(Lno_mdo);
1634       Address backedge_counter(G3_method_counters,
1635               in_bytes(MethodCounters::backedge_counter_offset()) +
1636               in_bytes(InvocationCounter::counter_offset()));
1637       Address mask(G3_method_counters, in_bytes(MethodCounters::backedge_mask_offset()));
1638       __ increment_mask_and_jump(backedge_counter, increment, mask, G4_scratch, O0,
1639                                  Assembler::notZero, &Lforward);
1640       __ bind(Loverflow);
1641 
1642       // notify point for loop, pass branch bytecode
1643       __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), l_cur_bcp);
1644 
1645       // Was an OSR adapter generated?
1646       // O0 = osr nmethod
1647       __ br_null_short(O0, Assembler::pn, Lforward);
1648 
1649       // Has the nmethod been invalidated already?
1650       __ ldub(O0, nmethod::state_offset(), O2);
1651       __ cmp_and_br_short(O2, nmethod::in_use, Assembler::notEqual, Assembler::pn, Lforward);
1652 
1653       // migrate the interpreter frame off of the stack
1654 
1655       __ mov(G2_thread, L7);
1656       // save nmethod
1657       __ mov(O0, L6);
1658       __ set_last_Java_frame(SP, noreg);
1659       __ call_VM_leaf(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin), L7);
1660       __ reset_last_Java_frame();
1661       __ mov(L7, G2_thread);
1662 
1663       // move OSR nmethod to I1
1664       __ mov(L6, I1);
1665 
1666       // OSR buffer to I0
1667       __ mov(O0, I0);
1668 
1669       // remove the interpreter frame
1670       __ restore(I5_savedSP, 0, SP);
1671 
1672       // Jump to the osr code.
1673       __ ld_ptr(O1, nmethod::osr_entry_point_offset(), O2);
1674       __ jmp(O2, G0);
1675       __ delayed()->nop();
1676 
1677     } else { // not TieredCompilation
1678       // Update Backedge branch separately from invocations
1679       const Register G4_invoke_ctr = G4;
1680       __ increment_backedge_counter(G3_method_counters, G4_invoke_ctr, G1_scratch);
1681       if (ProfileInterpreter) {
1682         __ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_method_counters, G1_scratch, Lforward);
1683         if (UseOnStackReplacement) {
1684 
1685           __ test_backedge_count_for_osr(O2_bumped_count, G3_method_counters, l_cur_bcp, G1_scratch);
1686         }
1687       } else {
1688         if (UseOnStackReplacement) {
1689           __ test_backedge_count_for_osr(G4_invoke_ctr, G3_method_counters, l_cur_bcp, G1_scratch);
1690         }
1691       }
1692     }
1693 
1694     __ bind(Lforward);
1695   } else
1696     // Bump bytecode pointer by displacement (take the branch)
1697     __ add( O1_disp, Lbcp, Lbcp );// add to bc addr
1698 
1699   // continue with bytecode @ target
1700   // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above,
1701   // %%%%% and changing dispatch_next to dispatch_only
1702   __ dispatch_next(vtos);
1703 }
1704 
1705 
1706 // Note Condition in argument is TemplateTable::Condition
1707 // arg scope is within class scope
1708 
1709 void TemplateTable::if_0cmp(Condition cc) {
1710   // no pointers, integer only!
1711   transition(itos, vtos);
1712   // assume branch is more often taken than not (loops use backward branches)
1713   __ cmp( Otos_i, 0);
1714   __ if_cmp(ccNot(cc), false);
1715 }
1716 
1717 
1718 void TemplateTable::if_icmp(Condition cc) {
1719   transition(itos, vtos);
1720   __ pop_i(O1);
1721   __ cmp(O1, Otos_i);
1722   __ if_cmp(ccNot(cc), false);
1723 }
1724 
1725 
1726 void TemplateTable::if_nullcmp(Condition cc) {
1727   transition(atos, vtos);
1728   __ tst(Otos_i);
1729   __ if_cmp(ccNot(cc), true);
1730 }
1731 
1732 
1733 void TemplateTable::if_acmp(Condition cc) {
1734   transition(atos, vtos);
1735   __ pop_ptr(O1);
1736   __ verify_oop(O1);
1737   __ verify_oop(Otos_i);
1738   __ cmp(O1, Otos_i);
1739   __ if_cmp(ccNot(cc), true);
1740 }
1741 
1742 
1743 
1744 void TemplateTable::ret() {
1745   transition(vtos, vtos);
1746   locals_index(G3_scratch);
1747   __ access_local_returnAddress(G3_scratch, Otos_i);
1748   // Otos_i contains the bci, compute the bcp from that
1749 
1750 #ifdef _LP64
1751 #ifdef ASSERT
1752   // jsr result was labeled as an 'itos' not an 'atos' because we cannot GC
1753   // the result.  The return address (really a BCI) was stored with an
1754   // 'astore' because JVM specs claim it's a pointer-sized thing.  Hence in
1755   // the 64-bit build the 32-bit BCI is actually in the low bits of a 64-bit
1756   // loaded value.
1757   { Label zzz ;
1758      __ set (65536, G3_scratch) ;
1759      __ cmp (Otos_i, G3_scratch) ;
1760      __ bp( Assembler::lessEqualUnsigned, false, Assembler::xcc, Assembler::pn, zzz);
1761      __ delayed()->nop();
1762      __ stop("BCI is in the wrong register half?");
1763      __ bind (zzz) ;
1764   }
1765 #endif
1766 #endif
1767 
1768   __ profile_ret(vtos, Otos_i, G4_scratch);
1769 
1770   __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch);
1771   __ add(G3_scratch, Otos_i, G3_scratch);
1772   __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp);
1773   __ dispatch_next(vtos);
1774 }
1775 
1776 
1777 void TemplateTable::wide_ret() {
1778   transition(vtos, vtos);
1779   locals_index_wide(G3_scratch);
1780   __ access_local_returnAddress(G3_scratch, Otos_i);
1781   // Otos_i contains the bci, compute the bcp from that
1782 
1783   __ profile_ret(vtos, Otos_i, G4_scratch);
1784 
1785   __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch);
1786   __ add(G3_scratch, Otos_i, G3_scratch);
1787   __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp);
1788   __ dispatch_next(vtos);
1789 }
1790 
1791 
1792 void TemplateTable::tableswitch() {
1793   transition(itos, vtos);
1794   Label default_case, continue_execution;
1795 
1796   // align bcp
1797   __ add(Lbcp, BytesPerInt, O1);
1798   __ and3(O1, -BytesPerInt, O1);
1799   // load lo, hi
1800   __ ld(O1, 1 * BytesPerInt, O2);       // Low Byte
1801   __ ld(O1, 2 * BytesPerInt, O3);       // High Byte
1802 #ifdef _LP64
1803   // Sign extend the 32 bits
1804   __ sra ( Otos_i, 0, Otos_i );
1805 #endif /* _LP64 */
1806 
1807   // check against lo & hi
1808   __ cmp( Otos_i, O2);
1809   __ br( Assembler::less, false, Assembler::pn, default_case);
1810   __ delayed()->cmp( Otos_i, O3 );
1811   __ br( Assembler::greater, false, Assembler::pn, default_case);
1812   // lookup dispatch offset
1813   __ delayed()->sub(Otos_i, O2, O2);
1814   __ profile_switch_case(O2, O3, G3_scratch, G4_scratch);
1815   __ sll(O2, LogBytesPerInt, O2);
1816   __ add(O2, 3 * BytesPerInt, O2);
1817   __ ba(continue_execution);
1818   __ delayed()->ld(O1, O2, O2);
1819   // handle default
1820   __ bind(default_case);
1821   __ profile_switch_default(O3);
1822   __ ld(O1, 0, O2); // get default offset
1823   // continue execution
1824   __ bind(continue_execution);
1825   __ add(Lbcp, O2, Lbcp);
1826   __ dispatch_next(vtos);
1827 }
1828 
1829 
1830 void TemplateTable::lookupswitch() {
1831   transition(itos, itos);
1832   __ stop("lookupswitch bytecode should have been rewritten");
1833 }
1834 
1835 void TemplateTable::fast_linearswitch() {
1836   transition(itos, vtos);
1837     Label loop_entry, loop, found, continue_execution;
1838   // align bcp
1839   __ add(Lbcp, BytesPerInt, O1);
1840   __ and3(O1, -BytesPerInt, O1);
1841  // set counter
1842   __ ld(O1, BytesPerInt, O2);
1843   __ sll(O2, LogBytesPerInt + 1, O2); // in word-pairs
1844   __ add(O1, 2 * BytesPerInt, O3); // set first pair addr
1845   __ ba(loop_entry);
1846   __ delayed()->add(O3, O2, O2); // counter now points past last pair
1847 
1848   // table search
1849   __ bind(loop);
1850   __ cmp(O4, Otos_i);
1851   __ br(Assembler::equal, true, Assembler::pn, found);
1852   __ delayed()->ld(O3, BytesPerInt, O4); // offset -> O4
1853   __ inc(O3, 2 * BytesPerInt);
1854 
1855   __ bind(loop_entry);
1856   __ cmp(O2, O3);
1857   __ brx(Assembler::greaterUnsigned, true, Assembler::pt, loop);
1858   __ delayed()->ld(O3, 0, O4);
1859 
1860   // default case
1861   __ ld(O1, 0, O4); // get default offset
1862   if (ProfileInterpreter) {
1863     __ profile_switch_default(O3);
1864     __ ba_short(continue_execution);
1865   }
1866 
1867   // entry found -> get offset
1868   __ bind(found);
1869   if (ProfileInterpreter) {
1870     __ sub(O3, O1, O3);
1871     __ sub(O3, 2*BytesPerInt, O3);
1872     __ srl(O3, LogBytesPerInt + 1, O3); // in word-pairs
1873     __ profile_switch_case(O3, O1, O2, G3_scratch);
1874 
1875     __ bind(continue_execution);
1876   }
1877   __ add(Lbcp, O4, Lbcp);
1878   __ dispatch_next(vtos);
1879 }
1880 
1881 
1882 void TemplateTable::fast_binaryswitch() {
1883   transition(itos, vtos);
1884   // Implementation using the following core algorithm: (copied from Intel)
1885   //
1886   // int binary_search(int key, LookupswitchPair* array, int n) {
1887   //   // Binary search according to "Methodik des Programmierens" by
1888   //   // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
1889   //   int i = 0;
1890   //   int j = n;
1891   //   while (i+1 < j) {
1892   //     // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
1893   //     // with      Q: for all i: 0 <= i < n: key < a[i]
1894   //     // where a stands for the array and assuming that the (inexisting)
1895   //     // element a[n] is infinitely big.
1896   //     int h = (i + j) >> 1;
1897   //     // i < h < j
1898   //     if (key < array[h].fast_match()) {
1899   //       j = h;
1900   //     } else {
1901   //       i = h;
1902   //     }
1903   //   }
1904   //   // R: a[i] <= key < a[i+1] or Q
1905   //   // (i.e., if key is within array, i is the correct index)
1906   //   return i;
1907   // }
1908 
1909   // register allocation
1910   assert(Otos_i == O0, "alias checking");
1911   const Register Rkey     = Otos_i;                    // already set (tosca)
1912   const Register Rarray   = O1;
1913   const Register Ri       = O2;
1914   const Register Rj       = O3;
1915   const Register Rh       = O4;
1916   const Register Rscratch = O5;
1917 
1918   const int log_entry_size = 3;
1919   const int entry_size = 1 << log_entry_size;
1920 
1921   Label found;
1922   // Find Array start
1923   __ add(Lbcp, 3 * BytesPerInt, Rarray);
1924   __ and3(Rarray, -BytesPerInt, Rarray);
1925   // initialize i & j (in delay slot)
1926   __ clr( Ri );
1927 
1928   // and start
1929   Label entry;
1930   __ ba(entry);
1931   __ delayed()->ld( Rarray, -BytesPerInt, Rj);
1932   // (Rj is already in the native byte-ordering.)
1933 
1934   // binary search loop
1935   { Label loop;
1936     __ bind( loop );
1937     // int h = (i + j) >> 1;
1938     __ sra( Rh, 1, Rh );
1939     // if (key < array[h].fast_match()) {
1940     //   j = h;
1941     // } else {
1942     //   i = h;
1943     // }
1944     __ sll( Rh, log_entry_size, Rscratch );
1945     __ ld( Rarray, Rscratch, Rscratch );
1946     // (Rscratch is already in the native byte-ordering.)
1947     __ cmp( Rkey, Rscratch );
1948     __ movcc( Assembler::less,         false, Assembler::icc, Rh, Rj );  // j = h if (key <  array[h].fast_match())
1949     __ movcc( Assembler::greaterEqual, false, Assembler::icc, Rh, Ri );  // i = h if (key >= array[h].fast_match())
1950 
1951     // while (i+1 < j)
1952     __ bind( entry );
1953     __ add( Ri, 1, Rscratch );
1954     __ cmp(Rscratch, Rj);
1955     __ br( Assembler::less, true, Assembler::pt, loop );
1956     __ delayed()->add( Ri, Rj, Rh ); // start h = i + j  >> 1;
1957   }
1958 
1959   // end of binary search, result index is i (must check again!)
1960   Label default_case;
1961   Label continue_execution;
1962   if (ProfileInterpreter) {
1963     __ mov( Ri, Rh );              // Save index in i for profiling
1964   }
1965   __ sll( Ri, log_entry_size, Ri );
1966   __ ld( Rarray, Ri, Rscratch );
1967   // (Rscratch is already in the native byte-ordering.)
1968   __ cmp( Rkey, Rscratch );
1969   __ br( Assembler::notEqual, true, Assembler::pn, default_case );
1970   __ delayed()->ld( Rarray, -2 * BytesPerInt, Rj ); // load default offset -> j
1971 
1972   // entry found -> j = offset
1973   __ inc( Ri, BytesPerInt );
1974   __ profile_switch_case(Rh, Rj, Rscratch, Rkey);
1975   __ ld( Rarray, Ri, Rj );
1976   // (Rj is already in the native byte-ordering.)
1977 
1978   if (ProfileInterpreter) {
1979     __ ba_short(continue_execution);
1980   }
1981 
1982   __ bind(default_case); // fall through (if not profiling)
1983   __ profile_switch_default(Ri);
1984 
1985   __ bind(continue_execution);
1986   __ add( Lbcp, Rj, Lbcp );
1987   __ dispatch_next( vtos );
1988 }
1989 
1990 
1991 void TemplateTable::_return(TosState state) {
1992   transition(state, state);
1993   assert(_desc->calls_vm(), "inconsistent calls_vm information");
1994 
1995   if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
1996     assert(state == vtos, "only valid state");
1997     __ mov(G0, G3_scratch);
1998     __ access_local_ptr(G3_scratch, Otos_i);
1999     __ load_klass(Otos_i, O2);
2000     __ set(JVM_ACC_HAS_FINALIZER, G3);
2001     __ ld(O2, in_bytes(Klass::access_flags_offset()), O2);
2002     __ andcc(G3, O2, G0);
2003     Label skip_register_finalizer;
2004     __ br(Assembler::zero, false, Assembler::pn, skip_register_finalizer);
2005     __ delayed()->nop();
2006 
2007     // Call out to do finalizer registration
2008     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), Otos_i);
2009 
2010     __ bind(skip_register_finalizer);
2011   }
2012 
2013   __ remove_activation(state, /* throw_monitor_exception */ true);
2014 
2015   // The caller's SP was adjusted upon method entry to accomodate
2016   // the callee's non-argument locals. Undo that adjustment.
2017   __ ret();                             // return to caller
2018   __ delayed()->restore(I5_savedSP, G0, SP);
2019 }
2020 
2021 
2022 // ----------------------------------------------------------------------------
2023 // Volatile variables demand their effects be made known to all CPU's in
2024 // order.  Store buffers on most chips allow reads & writes to reorder; the
2025 // JMM's ReadAfterWrite.java test fails in -Xint mode without some kind of
2026 // memory barrier (i.e., it's not sufficient that the interpreter does not
2027 // reorder volatile references, the hardware also must not reorder them).
2028 //
2029 // According to the new Java Memory Model (JMM):
2030 // (1) All volatiles are serialized wrt to each other.
2031 // ALSO reads & writes act as aquire & release, so:
2032 // (2) A read cannot let unrelated NON-volatile memory refs that happen after
2033 // the read float up to before the read.  It's OK for non-volatile memory refs
2034 // that happen before the volatile read to float down below it.
2035 // (3) Similar a volatile write cannot let unrelated NON-volatile memory refs
2036 // that happen BEFORE the write float down to after the write.  It's OK for
2037 // non-volatile memory refs that happen after the volatile write to float up
2038 // before it.
2039 //
2040 // We only put in barriers around volatile refs (they are expensive), not
2041 // _between_ memory refs (that would require us to track the flavor of the
2042 // previous memory refs).  Requirements (2) and (3) require some barriers
2043 // before volatile stores and after volatile loads.  These nearly cover
2044 // requirement (1) but miss the volatile-store-volatile-load case.  This final
2045 // case is placed after volatile-stores although it could just as well go
2046 // before volatile-loads.
2047 void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint) {
2048   // Helper function to insert a is-volatile test and memory barrier
2049   // All current sparc implementations run in TSO, needing only StoreLoad
2050   if ((order_constraint & Assembler::StoreLoad) == 0) return;
2051   __ membar( order_constraint );
2052 }
2053 
2054 // ----------------------------------------------------------------------------
2055 void TemplateTable::resolve_cache_and_index(int byte_no,
2056                                             Register Rcache,
2057                                             Register index,
2058                                             size_t index_size) {
2059   // Depends on cpCacheOop layout!
2060 
2061   Label resolved;
2062   Bytecodes::Code code = bytecode();
2063   switch (code) {
2064   case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2065   case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2066   }
2067 
2068   assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2069   __ get_cache_and_index_and_bytecode_at_bcp(Rcache, index, Lbyte_code, byte_no, 1, index_size);
2070   __ cmp(Lbyte_code, code);  // have we resolved this bytecode?
2071   __ br(Assembler::equal, false, Assembler::pt, resolved);
2072   __ delayed()->set(code, O1);
2073 
2074   address entry;
2075   
2076   switch (code) {
2077     case Bytecodes::_getstatic      : // fall through
2078     case Bytecodes::_putstatic      : // fall through
2079     case Bytecodes::_getfield       : // fall through
2080     case Bytecodes::_putfield       : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break;
2081     case Bytecodes::_invokevirtual  : // fall through
2082     case Bytecodes::_invokespecial  : // fall through
2083     case Bytecodes::_invokestatic   : // fall through
2084     case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke);  break;
2085     case Bytecodes::_invokehandle   : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokehandle);  break;
2086     case Bytecodes::_invokedynamic  : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic);  break;
2087     default:
2088       fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(code)));
2089       break;
2090   }
2091   // first time invocation - must resolve first
2092   __ call_VM(noreg, entry, O1);
2093   // Update registers with resolved info
2094   __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
2095   __ bind(resolved);
2096 }
2097 
2098 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2099                                                Register method,
2100                                                Register itable_index,
2101                                                Register flags,
2102                                                bool is_invokevirtual,
2103                                                bool is_invokevfinal,
2104                                                bool is_invokedynamic) {
2105   // Uses both G3_scratch and G4_scratch
2106   Register cache = G3_scratch;
2107   Register index = G4_scratch;
2108   assert_different_registers(cache, method, itable_index);
2109 
2110   // determine constant pool cache field offsets
2111   assert(is_invokevirtual == (byte_no == f2_byte), "is_invokevirtual flag redundant");
2112   const int method_offset = in_bytes(
2113       ConstantPoolCache::base_offset() +
2114       ((byte_no == f2_byte)
2115        ? ConstantPoolCacheEntry::f2_offset()
2116        : ConstantPoolCacheEntry::f1_offset()
2117       )
2118     );
2119   const int flags_offset = in_bytes(ConstantPoolCache::base_offset() +
2120                                     ConstantPoolCacheEntry::flags_offset());
2121   // access constant pool cache fields
2122   const int index_offset = in_bytes(ConstantPoolCache::base_offset() +
2123                                     ConstantPoolCacheEntry::f2_offset());
2124 
2125   if (is_invokevfinal) {
2126     __ get_cache_and_index_at_bcp(cache, index, 1);
2127     __ ld_ptr(Address(cache, method_offset), method);
2128   } else {
2129     size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2));
2130     resolve_cache_and_index(byte_no, cache, index, index_size);
2131     __ ld_ptr(Address(cache, method_offset), method);
2132   }
2133 
2134   if (itable_index != noreg) {
2135     // pick up itable or appendix index from f2 also:
2136     __ ld_ptr(Address(cache, index_offset), itable_index);
2137   }
2138   __ ld_ptr(Address(cache, flags_offset), flags);
2139 }
2140 
2141 // The Rcache register must be set before call
2142 void TemplateTable::load_field_cp_cache_entry(Register Robj,
2143                                               Register Rcache,
2144                                               Register index,
2145                                               Register Roffset,
2146                                               Register Rflags,
2147                                               bool is_static) {
2148   assert_different_registers(Rcache, Rflags, Roffset);
2149 
2150   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2151 
2152   __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
2153   __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
2154   if (is_static) {
2155     __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f1_offset(), Robj);
2156     const int mirror_offset = in_bytes(Klass::java_mirror_offset());
2157     __ ld_ptr( Robj, mirror_offset, Robj);
2158   }
2159 }
2160 
2161 // The registers Rcache and index expected to be set before call.
2162 // Correct values of the Rcache and index registers are preserved.
2163 void TemplateTable::jvmti_post_field_access(Register Rcache,
2164                                             Register index,
2165                                             bool is_static,
2166                                             bool has_tos) {
2167   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2168 
2169   if (JvmtiExport::can_post_field_access()) {
2170     // Check to see if a field access watch has been set before we take
2171     // the time to call into the VM.
2172     Label Label1;
2173     assert_different_registers(Rcache, index, G1_scratch);
2174     AddressLiteral get_field_access_count_addr(JvmtiExport::get_field_access_count_addr());
2175     __ load_contents(get_field_access_count_addr, G1_scratch);
2176     __ cmp_and_br_short(G1_scratch, 0, Assembler::equal, Assembler::pt, Label1);
2177 
2178     __ add(Rcache, in_bytes(cp_base_offset), Rcache);
2179 
2180     if (is_static) {
2181       __ clr(Otos_i);
2182     } else {
2183       if (has_tos) {
2184       // save object pointer before call_VM() clobbers it
2185         __ push_ptr(Otos_i);  // put object on tos where GC wants it.
2186       } else {
2187         // Load top of stack (do not pop the value off the stack);
2188         __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(0), Otos_i);
2189       }
2190       __ verify_oop(Otos_i);
2191     }
2192     // Otos_i: object pointer or NULL if static
2193     // Rcache: cache entry pointer
2194     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access),
2195                Otos_i, Rcache);
2196     if (!is_static && has_tos) {
2197       __ pop_ptr(Otos_i);  // restore object pointer
2198       __ verify_oop(Otos_i);
2199     }
2200     __ get_cache_and_index_at_bcp(Rcache, index, 1);
2201     __ bind(Label1);
2202   }
2203 }
2204 
2205 void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteControl rc) {
2206   transition(vtos, vtos);
2207 
2208   Register Rcache = G3_scratch;
2209   Register index  = G4_scratch;
2210   Register Rclass = Rcache;
2211   Register Roffset= G4_scratch;
2212   Register Rflags = G1_scratch;
2213   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2214 
2215   resolve_cache_and_index(byte_no, Rcache, index, sizeof(u2));
2216   jvmti_post_field_access(Rcache, index, is_static, false);
2217   load_field_cp_cache_entry(Rclass, Rcache, index, Roffset, Rflags, is_static);
2218 
2219   if (!is_static) {
2220     pop_and_check_object(Rclass);
2221   } else {
2222     __ verify_oop(Rclass);
2223   }
2224 
2225   Label exit;
2226 
2227   Assembler::Membar_mask_bits membar_bits =
2228     Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
2229 
2230   if (__ membar_has_effect(membar_bits)) {
2231     // Get volatile flag
2232     __ set((1 << ConstantPoolCacheEntry::is_volatile_shift), Lscratch);
2233     __ and3(Rflags, Lscratch, Lscratch);
2234   }
2235 
2236   Label checkVolatile;
2237 
2238   // compute field type
2239   Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj;
2240   __ srl(Rflags, ConstantPoolCacheEntry::tos_state_shift, Rflags);
2241   // Make sure we don't need to mask Rflags after the above shift
2242   ConstantPoolCacheEntry::verify_tos_state_shift();
2243 
2244   // Check atos before itos for getstatic, more likely (in Queens at least)
2245   __ cmp(Rflags, atos);
2246   __ br(Assembler::notEqual, false, Assembler::pt, notObj);
2247   __ delayed() ->cmp(Rflags, itos);
2248 
2249   // atos
2250   __ load_heap_oop(Rclass, Roffset, Otos_i);
2251   __ verify_oop(Otos_i);
2252   __ push(atos);
2253   if (!is_static && rc == may_rewrite) {
2254     patch_bytecode(Bytecodes::_fast_agetfield, G3_scratch, G4_scratch);
2255   }
2256   __ ba(checkVolatile);
2257   __ delayed()->tst(Lscratch);
2258 
2259   __ bind(notObj);
2260 
2261   // cmp(Rflags, itos);
2262   __ br(Assembler::notEqual, false, Assembler::pt, notInt);
2263   __ delayed() ->cmp(Rflags, ltos);
2264 
2265   // itos
2266   __ ld(Rclass, Roffset, Otos_i);
2267   __ push(itos);
2268   if (!is_static && rc == may_rewrite) {
2269     patch_bytecode(Bytecodes::_fast_igetfield, G3_scratch, G4_scratch);
2270   }
2271   __ ba(checkVolatile);
2272   __ delayed()->tst(Lscratch);
2273 
2274   __ bind(notInt);
2275 
2276   // cmp(Rflags, ltos);
2277   __ br(Assembler::notEqual, false, Assembler::pt, notLong);
2278   __ delayed() ->cmp(Rflags, btos);
2279 
2280   // ltos
2281   // load must be atomic
2282   __ ld_long(Rclass, Roffset, Otos_l);
2283   __ push(ltos);
2284   if (!is_static && rc == may_rewrite) {
2285     patch_bytecode(Bytecodes::_fast_lgetfield, G3_scratch, G4_scratch);
2286   }
2287   __ ba(checkVolatile);
2288   __ delayed()->tst(Lscratch);
2289 
2290   __ bind(notLong);
2291 
2292   // cmp(Rflags, btos);
2293   __ br(Assembler::notEqual, false, Assembler::pt, notByte);
2294   __ delayed() ->cmp(Rflags, ctos);
2295 
2296   // btos
2297   __ ldsb(Rclass, Roffset, Otos_i);
2298   __ push(itos);
2299   if (!is_static && rc == may_rewrite) {
2300     patch_bytecode(Bytecodes::_fast_bgetfield, G3_scratch, G4_scratch);
2301   }
2302   __ ba(checkVolatile);
2303   __ delayed()->tst(Lscratch);
2304 
2305   __ bind(notByte);
2306 
2307   // cmp(Rflags, ctos);
2308   __ br(Assembler::notEqual, false, Assembler::pt, notChar);
2309   __ delayed() ->cmp(Rflags, stos);
2310 
2311   // ctos
2312   __ lduh(Rclass, Roffset, Otos_i);
2313   __ push(itos);
2314   if (!is_static && rc == may_rewrite) {
2315     patch_bytecode(Bytecodes::_fast_cgetfield, G3_scratch, G4_scratch);
2316   }
2317   __ ba(checkVolatile);
2318   __ delayed()->tst(Lscratch);
2319 
2320   __ bind(notChar);
2321 
2322   // cmp(Rflags, stos);
2323   __ br(Assembler::notEqual, false, Assembler::pt, notShort);
2324   __ delayed() ->cmp(Rflags, ftos);
2325 
2326   // stos
2327   __ ldsh(Rclass, Roffset, Otos_i);
2328   __ push(itos);
2329   if (!is_static && rc == may_rewrite) {
2330     patch_bytecode(Bytecodes::_fast_sgetfield, G3_scratch, G4_scratch);
2331   }
2332   __ ba(checkVolatile);
2333   __ delayed()->tst(Lscratch);
2334 
2335   __ bind(notShort);
2336 
2337 
2338   // cmp(Rflags, ftos);
2339   __ br(Assembler::notEqual, false, Assembler::pt, notFloat);
2340   __ delayed() ->tst(Lscratch);
2341 
2342   // ftos
2343   __ ldf(FloatRegisterImpl::S, Rclass, Roffset, Ftos_f);
2344   __ push(ftos);
2345   if (!is_static && rc == may_rewrite) {
2346     patch_bytecode(Bytecodes::_fast_fgetfield, G3_scratch, G4_scratch);
2347   }
2348   __ ba(checkVolatile);
2349   __ delayed()->tst(Lscratch);
2350 
2351   __ bind(notFloat);
2352 
2353 
2354   // dtos
2355   __ ldf(FloatRegisterImpl::D, Rclass, Roffset, Ftos_d);
2356   __ push(dtos);
2357   if (!is_static && rc == may_rewrite) {
2358     patch_bytecode(Bytecodes::_fast_dgetfield, G3_scratch, G4_scratch);
2359   }
2360 
2361   __ bind(checkVolatile);
2362   if (__ membar_has_effect(membar_bits)) {
2363     // __ tst(Lscratch); executed in delay slot
2364     __ br(Assembler::zero, false, Assembler::pt, exit);
2365     __ delayed()->nop();
2366     volatile_barrier(membar_bits);
2367   }
2368 
2369   __ bind(exit);
2370 }
2371 
2372 void TemplateTable::getfield(int byte_no) {
2373   getfield_or_static(byte_no, false);
2374 }
2375 
2376 void TemplateTable::nofast_getfield(int byte_no) {
2377   getfield_or_static(byte_no, false, may_not_rewrite);
2378 }
2379 
2380 void TemplateTable::getstatic(int byte_no) {
2381   getfield_or_static(byte_no, true);
2382 }
2383 
2384 void TemplateTable::fast_accessfield(TosState state) {
2385   transition(atos, state);
2386   Register Rcache  = G3_scratch;
2387   Register index   = G4_scratch;
2388   Register Roffset = G4_scratch;
2389   Register Rflags  = Rcache;
2390   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2391 
2392   __ get_cache_and_index_at_bcp(Rcache, index, 1);
2393   jvmti_post_field_access(Rcache, index, /*is_static*/false, /*has_tos*/true);
2394 
2395   __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
2396 
2397   __ null_check(Otos_i);
2398   __ verify_oop(Otos_i);
2399 
2400   Label exit;
2401 
2402   Assembler::Membar_mask_bits membar_bits =
2403     Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
2404   if (__ membar_has_effect(membar_bits)) {
2405     // Get volatile flag
2406     __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Rflags);
2407     __ set((1 << ConstantPoolCacheEntry::is_volatile_shift), Lscratch);
2408   }
2409 
2410   switch (bytecode()) {
2411     case Bytecodes::_fast_bgetfield:
2412       __ ldsb(Otos_i, Roffset, Otos_i);
2413       break;
2414     case Bytecodes::_fast_cgetfield:
2415       __ lduh(Otos_i, Roffset, Otos_i);
2416       break;
2417     case Bytecodes::_fast_sgetfield:
2418       __ ldsh(Otos_i, Roffset, Otos_i);
2419       break;
2420     case Bytecodes::_fast_igetfield:
2421       __ ld(Otos_i, Roffset, Otos_i);
2422       break;
2423     case Bytecodes::_fast_lgetfield:
2424       __ ld_long(Otos_i, Roffset, Otos_l);
2425       break;
2426     case Bytecodes::_fast_fgetfield:
2427       __ ldf(FloatRegisterImpl::S, Otos_i, Roffset, Ftos_f);
2428       break;
2429     case Bytecodes::_fast_dgetfield:
2430       __ ldf(FloatRegisterImpl::D, Otos_i, Roffset, Ftos_d);
2431       break;
2432     case Bytecodes::_fast_agetfield:
2433       __ load_heap_oop(Otos_i, Roffset, Otos_i);
2434       break;
2435     default:
2436       ShouldNotReachHere();
2437   }
2438 
2439   if (__ membar_has_effect(membar_bits)) {
2440     __ btst(Lscratch, Rflags);
2441     __ br(Assembler::zero, false, Assembler::pt, exit);
2442     __ delayed()->nop();
2443     volatile_barrier(membar_bits);
2444     __ bind(exit);
2445   }
2446 
2447   if (state == atos) {
2448     __ verify_oop(Otos_i);    // does not blow flags!
2449   }
2450 }
2451 
2452 void TemplateTable::jvmti_post_fast_field_mod() {
2453   if (JvmtiExport::can_post_field_modification()) {
2454     // Check to see if a field modification watch has been set before we take
2455     // the time to call into the VM.
2456     Label done;
2457     AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
2458     __ load_contents(get_field_modification_count_addr, G4_scratch);
2459     __ cmp_and_br_short(G4_scratch, 0, Assembler::equal, Assembler::pt, done);
2460     __ pop_ptr(G4_scratch);     // copy the object pointer from tos
2461     __ verify_oop(G4_scratch);
2462     __ push_ptr(G4_scratch);    // put the object pointer back on tos
2463     __ get_cache_entry_pointer_at_bcp(G1_scratch, G3_scratch, 1);
2464     // Save tos values before call_VM() clobbers them. Since we have
2465     // to do it for every data type, we use the saved values as the
2466     // jvalue object.
2467     switch (bytecode()) {  // save tos values before call_VM() clobbers them
2468     case Bytecodes::_fast_aputfield: __ push_ptr(Otos_i); break;
2469     case Bytecodes::_fast_bputfield: // fall through
2470     case Bytecodes::_fast_sputfield: // fall through
2471     case Bytecodes::_fast_cputfield: // fall through
2472     case Bytecodes::_fast_iputfield: __ push_i(Otos_i); break;
2473     case Bytecodes::_fast_dputfield: __ push_d(Ftos_d); break;
2474     case Bytecodes::_fast_fputfield: __ push_f(Ftos_f); break;
2475     // get words in right order for use as jvalue object
2476     case Bytecodes::_fast_lputfield: __ push_l(Otos_l); break;
2477     }
2478     // setup pointer to jvalue object
2479     __ mov(Lesp, G3_scratch);  __ inc(G3_scratch, wordSize);
2480     // G4_scratch:  object pointer
2481     // G1_scratch: cache entry pointer
2482     // G3_scratch: jvalue object on the stack
2483     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), G4_scratch, G1_scratch, G3_scratch);
2484     switch (bytecode()) {             // restore tos values
2485     case Bytecodes::_fast_aputfield: __ pop_ptr(Otos_i); break;
2486     case Bytecodes::_fast_bputfield: // fall through
2487     case Bytecodes::_fast_sputfield: // fall through
2488     case Bytecodes::_fast_cputfield: // fall through
2489     case Bytecodes::_fast_iputfield: __ pop_i(Otos_i); break;
2490     case Bytecodes::_fast_dputfield: __ pop_d(Ftos_d); break;
2491     case Bytecodes::_fast_fputfield: __ pop_f(Ftos_f); break;
2492     case Bytecodes::_fast_lputfield: __ pop_l(Otos_l); break;
2493     }
2494     __ bind(done);
2495   }
2496 }
2497 
2498 // The registers Rcache and index expected to be set before call.
2499 // The function may destroy various registers, just not the Rcache and index registers.
2500 void TemplateTable::jvmti_post_field_mod(Register Rcache, Register index, bool is_static) {
2501   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2502 
2503   if (JvmtiExport::can_post_field_modification()) {
2504     // Check to see if a field modification watch has been set before we take
2505     // the time to call into the VM.
2506     Label Label1;
2507     assert_different_registers(Rcache, index, G1_scratch);
2508     AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
2509     __ load_contents(get_field_modification_count_addr, G1_scratch);
2510     __ cmp_and_br_short(G1_scratch, 0, Assembler::zero, Assembler::pt, Label1);
2511 
2512     // The Rcache and index registers have been already set.
2513     // This allows to eliminate this call but the Rcache and index
2514     // registers must be correspondingly used after this line.
2515     __ get_cache_and_index_at_bcp(G1_scratch, G4_scratch, 1);
2516 
2517     __ add(G1_scratch, in_bytes(cp_base_offset), G3_scratch);
2518     if (is_static) {
2519       // Life is simple.  Null out the object pointer.
2520       __ clr(G4_scratch);
2521     } else {
2522       Register Rflags = G1_scratch;
2523       // Life is harder. The stack holds the value on top, followed by the
2524       // object.  We don't know the size of the value, though; it could be
2525       // one or two words depending on its type. As a result, we must find
2526       // the type to determine where the object is.
2527 
2528       Label two_word, valsizeknown;
2529       __ ld_ptr(G1_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
2530       __ mov(Lesp, G4_scratch);
2531       __ srl(Rflags, ConstantPoolCacheEntry::tos_state_shift, Rflags);
2532       // Make sure we don't need to mask Rflags after the above shift
2533       ConstantPoolCacheEntry::verify_tos_state_shift();
2534       __ cmp(Rflags, ltos);
2535       __ br(Assembler::equal, false, Assembler::pt, two_word);
2536       __ delayed()->cmp(Rflags, dtos);
2537       __ br(Assembler::equal, false, Assembler::pt, two_word);
2538       __ delayed()->nop();
2539       __ inc(G4_scratch, Interpreter::expr_offset_in_bytes(1));
2540       __ ba_short(valsizeknown);
2541       __ bind(two_word);
2542 
2543       __ inc(G4_scratch, Interpreter::expr_offset_in_bytes(2));
2544 
2545       __ bind(valsizeknown);
2546       // setup object pointer
2547       __ ld_ptr(G4_scratch, 0, G4_scratch);
2548       __ verify_oop(G4_scratch);
2549     }
2550     // setup pointer to jvalue object
2551     __ mov(Lesp, G1_scratch);  __ inc(G1_scratch, wordSize);
2552     // G4_scratch:  object pointer or NULL if static
2553     // G3_scratch: cache entry pointer
2554     // G1_scratch: jvalue object on the stack
2555     __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification),
2556                G4_scratch, G3_scratch, G1_scratch);
2557     __ get_cache_and_index_at_bcp(Rcache, index, 1);
2558     __ bind(Label1);
2559   }
2560 }
2561 
2562 void TemplateTable::pop_and_check_object(Register r) {
2563   __ pop_ptr(r);
2564   __ null_check(r);  // for field access must check obj.
2565   __ verify_oop(r);
2566 }
2567 
2568 void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteControl rc) {
2569   transition(vtos, vtos);
2570   Register Rcache = G3_scratch;
2571   Register index  = G4_scratch;
2572   Register Rclass = Rcache;
2573   Register Roffset= G4_scratch;
2574   Register Rflags = G1_scratch;
2575   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2576 
2577   resolve_cache_and_index(byte_no, Rcache, index, sizeof(u2));
2578   jvmti_post_field_mod(Rcache, index, is_static);
2579   load_field_cp_cache_entry(Rclass, Rcache, index, Roffset, Rflags, is_static);
2580 
2581   Assembler::Membar_mask_bits read_bits =
2582     Assembler::Membar_mask_bits(Assembler::LoadStore | Assembler::StoreStore);
2583   Assembler::Membar_mask_bits write_bits = Assembler::StoreLoad;
2584 
2585   Label notVolatile, checkVolatile, exit;
2586   if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
2587     __ set((1 << ConstantPoolCacheEntry::is_volatile_shift), Lscratch);
2588     __ and3(Rflags, Lscratch, Lscratch);
2589 
2590     if (__ membar_has_effect(read_bits)) {
2591       __ cmp_and_br_short(Lscratch, 0, Assembler::equal, Assembler::pt, notVolatile);
2592       volatile_barrier(read_bits);
2593       __ bind(notVolatile);
2594     }
2595   }
2596 
2597   __ srl(Rflags, ConstantPoolCacheEntry::tos_state_shift, Rflags);
2598   // Make sure we don't need to mask Rflags after the above shift
2599   ConstantPoolCacheEntry::verify_tos_state_shift();
2600 
2601   // compute field type
2602   Label notInt, notShort, notChar, notObj, notByte, notLong, notFloat;
2603 
2604   if (is_static) {
2605     // putstatic with object type most likely, check that first
2606     __ cmp(Rflags, atos);
2607     __ br(Assembler::notEqual, false, Assembler::pt, notObj);
2608     __ delayed()->cmp(Rflags, itos);
2609 
2610     // atos
2611     {
2612       __ pop_ptr();
2613       __ verify_oop(Otos_i);
2614       do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
2615       __ ba(checkVolatile);
2616       __ delayed()->tst(Lscratch);
2617     }
2618 
2619     __ bind(notObj);
2620     // cmp(Rflags, itos);
2621     __ br(Assembler::notEqual, false, Assembler::pt, notInt);
2622     __ delayed()->cmp(Rflags, btos);
2623 
2624     // itos
2625     {
2626       __ pop_i();
2627       __ st(Otos_i, Rclass, Roffset);
2628       __ ba(checkVolatile);
2629       __ delayed()->tst(Lscratch);
2630     }
2631 
2632     __ bind(notInt);
2633   } else {
2634     // putfield with int type most likely, check that first
2635     __ cmp(Rflags, itos);
2636     __ br(Assembler::notEqual, false, Assembler::pt, notInt);
2637     __ delayed()->cmp(Rflags, atos);
2638 
2639     // itos
2640     {
2641       __ pop_i();
2642       pop_and_check_object(Rclass);
2643       __ st(Otos_i, Rclass, Roffset);
2644       if (rc == may_rewrite) patch_bytecode(Bytecodes::_fast_iputfield, G3_scratch, G4_scratch, true, byte_no);
2645       __ ba(checkVolatile);
2646       __ delayed()->tst(Lscratch);
2647     }
2648 
2649     __ bind(notInt);
2650     // cmp(Rflags, atos);
2651     __ br(Assembler::notEqual, false, Assembler::pt, notObj);
2652     __ delayed()->cmp(Rflags, btos);
2653 
2654     // atos
2655     {
2656       __ pop_ptr();
2657       pop_and_check_object(Rclass);
2658       __ verify_oop(Otos_i);
2659       do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
2660       if (rc == may_rewrite) patch_bytecode(Bytecodes::_fast_aputfield, G3_scratch, G4_scratch, true, byte_no);
2661       __ ba(checkVolatile);
2662       __ delayed()->tst(Lscratch);
2663     }
2664 
2665     __ bind(notObj);
2666   }
2667 
2668   // cmp(Rflags, btos);
2669   __ br(Assembler::notEqual, false, Assembler::pt, notByte);
2670   __ delayed()->cmp(Rflags, ltos);
2671 
2672   // btos
2673   {
2674     __ pop_i();
2675     if (!is_static) pop_and_check_object(Rclass);
2676     __ stb(Otos_i, Rclass, Roffset);
2677     if (!is_static && rc == may_rewrite) {
2678       patch_bytecode(Bytecodes::_fast_bputfield, G3_scratch, G4_scratch, true, byte_no);
2679     }
2680     __ ba(checkVolatile);
2681     __ delayed()->tst(Lscratch);
2682   }
2683 
2684   __ bind(notByte);
2685   // cmp(Rflags, ltos);
2686   __ br(Assembler::notEqual, false, Assembler::pt, notLong);
2687   __ delayed()->cmp(Rflags, ctos);
2688 
2689   // ltos
2690   {
2691     __ pop_l();
2692     if (!is_static) pop_and_check_object(Rclass);
2693     __ st_long(Otos_l, Rclass, Roffset);
2694     if (!is_static && rc == may_rewrite) {
2695       patch_bytecode(Bytecodes::_fast_lputfield, G3_scratch, G4_scratch, true, byte_no);
2696     }
2697     __ ba(checkVolatile);
2698     __ delayed()->tst(Lscratch);
2699   }
2700 
2701   __ bind(notLong);
2702   // cmp(Rflags, ctos);
2703   __ br(Assembler::notEqual, false, Assembler::pt, notChar);
2704   __ delayed()->cmp(Rflags, stos);
2705 
2706   // ctos (char)
2707   {
2708     __ pop_i();
2709     if (!is_static) pop_and_check_object(Rclass);
2710     __ sth(Otos_i, Rclass, Roffset);
2711     if (!is_static && rc == may_rewrite) {
2712       patch_bytecode(Bytecodes::_fast_cputfield, G3_scratch, G4_scratch, true, byte_no);
2713     }
2714     __ ba(checkVolatile);
2715     __ delayed()->tst(Lscratch);
2716   }
2717 
2718   __ bind(notChar);
2719   // cmp(Rflags, stos);
2720   __ br(Assembler::notEqual, false, Assembler::pt, notShort);
2721   __ delayed()->cmp(Rflags, ftos);
2722 
2723   // stos (short)
2724   {
2725     __ pop_i();
2726     if (!is_static) pop_and_check_object(Rclass);
2727     __ sth(Otos_i, Rclass, Roffset);
2728     if (!is_static && rc == may_rewrite) {
2729       patch_bytecode(Bytecodes::_fast_sputfield, G3_scratch, G4_scratch, true, byte_no);
2730     }
2731     __ ba(checkVolatile);
2732     __ delayed()->tst(Lscratch);
2733   }
2734 
2735   __ bind(notShort);
2736   // cmp(Rflags, ftos);
2737   __ br(Assembler::notZero, false, Assembler::pt, notFloat);
2738   __ delayed()->nop();
2739 
2740   // ftos
2741   {
2742     __ pop_f();
2743     if (!is_static) pop_and_check_object(Rclass);
2744     __ stf(FloatRegisterImpl::S, Ftos_f, Rclass, Roffset);
2745     if (!is_static && rc == may_rewrite) {
2746       patch_bytecode(Bytecodes::_fast_fputfield, G3_scratch, G4_scratch, true, byte_no);
2747     }
2748     __ ba(checkVolatile);
2749     __ delayed()->tst(Lscratch);
2750   }
2751 
2752   __ bind(notFloat);
2753 
2754   // dtos
2755   {
2756     __ pop_d();
2757     if (!is_static) pop_and_check_object(Rclass);
2758     __ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
2759     if (!is_static && rc == may_rewrite) {
2760       patch_bytecode(Bytecodes::_fast_dputfield, G3_scratch, G4_scratch, true, byte_no);
2761     }
2762   }
2763 
2764   __ bind(checkVolatile);
2765   __ tst(Lscratch);
2766 
2767   if (__ membar_has_effect(write_bits)) {
2768     // __ tst(Lscratch); in delay slot
2769     __ br(Assembler::zero, false, Assembler::pt, exit);
2770     __ delayed()->nop();
2771     volatile_barrier(Assembler::StoreLoad);
2772     __ bind(exit);
2773   }
2774 }
2775 
2776 void TemplateTable::fast_storefield(TosState state) {
2777   transition(state, vtos);
2778   Register Rcache = G3_scratch;
2779   Register Rclass = Rcache;
2780   Register Roffset= G4_scratch;
2781   Register Rflags = G1_scratch;
2782   ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2783 
2784   jvmti_post_fast_field_mod();
2785 
2786   __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 1);
2787 
2788   Assembler::Membar_mask_bits read_bits =
2789     Assembler::Membar_mask_bits(Assembler::LoadStore | Assembler::StoreStore);
2790   Assembler::Membar_mask_bits write_bits = Assembler::StoreLoad;
2791 
2792   Label notVolatile, checkVolatile, exit;
2793   if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
2794     __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
2795     __ set((1 << ConstantPoolCacheEntry::is_volatile_shift), Lscratch);
2796     __ and3(Rflags, Lscratch, Lscratch);
2797     if (__ membar_has_effect(read_bits)) {
2798       __ cmp_and_br_short(Lscratch, 0, Assembler::equal, Assembler::pt, notVolatile);
2799       volatile_barrier(read_bits);
2800       __ bind(notVolatile);
2801     }
2802   }
2803 
2804   __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
2805   pop_and_check_object(Rclass);
2806 
2807   switch (bytecode()) {
2808     case Bytecodes::_fast_bputfield: __ stb(Otos_i, Rclass, Roffset); break;
2809     case Bytecodes::_fast_cputfield: /* fall through */
2810     case Bytecodes::_fast_sputfield: __ sth(Otos_i, Rclass, Roffset); break;
2811     case Bytecodes::_fast_iputfield: __ st(Otos_i, Rclass, Roffset);  break;
2812     case Bytecodes::_fast_lputfield: __ st_long(Otos_l, Rclass, Roffset); break;
2813     case Bytecodes::_fast_fputfield:
2814       __ stf(FloatRegisterImpl::S, Ftos_f, Rclass, Roffset);
2815       break;
2816     case Bytecodes::_fast_dputfield:
2817       __ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
2818       break;
2819     case Bytecodes::_fast_aputfield:
2820       do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
2821       break;
2822     default:
2823       ShouldNotReachHere();
2824   }
2825 
2826   if (__ membar_has_effect(write_bits)) {
2827     __ cmp_and_br_short(Lscratch, 0, Assembler::equal, Assembler::pt, exit);
2828     volatile_barrier(Assembler::StoreLoad);
2829     __ bind(exit);
2830   }
2831 }
2832 
2833 void TemplateTable::putfield(int byte_no) {
2834   putfield_or_static(byte_no, false);
2835 }
2836 
2837 void TemplateTable::nofast_putfield(int byte_no) {
2838   putfield_or_static(byte_no, false, may_not_rewrite);
2839 }
2840 
2841 void TemplateTable::putstatic(int byte_no) {
2842   putfield_or_static(byte_no, true);
2843 }
2844 
2845 void TemplateTable::fast_xaccess(TosState state) {
2846   transition(vtos, state);
2847   Register Rcache = G3_scratch;
2848   Register Roffset = G4_scratch;
2849   Register Rflags  = G4_scratch;
2850   Register Rreceiver = Lscratch;
2851 
2852   __ ld_ptr(Llocals, 0, Rreceiver);
2853 
2854   // access constant pool cache  (is resolved)
2855   __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 2);
2856   __ ld_ptr(Rcache, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset(), Roffset);
2857   __ add(Lbcp, 1, Lbcp);       // needed to report exception at the correct bcp
2858 
2859   __ verify_oop(Rreceiver);
2860   __ null_check(Rreceiver);
2861   if (state == atos) {
2862     __ load_heap_oop(Rreceiver, Roffset, Otos_i);
2863   } else if (state == itos) {
2864     __ ld (Rreceiver, Roffset, Otos_i) ;
2865   } else if (state == ftos) {
2866     __ ldf(FloatRegisterImpl::S, Rreceiver, Roffset, Ftos_f);
2867   } else {
2868     ShouldNotReachHere();
2869   }
2870 
2871   Assembler::Membar_mask_bits membar_bits =
2872     Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
2873   if (__ membar_has_effect(membar_bits)) {
2874 
2875     // Get is_volatile value in Rflags and check if membar is needed
2876     __ ld_ptr(Rcache, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset(), Rflags);
2877 
2878     // Test volatile
2879     Label notVolatile;
2880     __ set((1 << ConstantPoolCacheEntry::is_volatile_shift), Lscratch);
2881     __ btst(Rflags, Lscratch);
2882     __ br(Assembler::zero, false, Assembler::pt, notVolatile);
2883     __ delayed()->nop();
2884     volatile_barrier(membar_bits);
2885     __ bind(notVolatile);
2886   }
2887 
2888   __ interp_verify_oop(Otos_i, state, __FILE__, __LINE__);
2889   __ sub(Lbcp, 1, Lbcp);
2890 }
2891 
2892 //----------------------------------------------------------------------------------------------------
2893 // Calls
2894 
2895 void TemplateTable::count_calls(Register method, Register temp) {
2896   // implemented elsewhere
2897   ShouldNotReachHere();
2898 }
2899 
2900 void TemplateTable::prepare_invoke(int byte_no,
2901                                    Register method,  // linked method (or i-klass)
2902                                    Register ra,      // return address
2903                                    Register index,   // itable index, MethodType, etc.
2904                                    Register recv,    // if caller wants to see it
2905                                    Register flags    // if caller wants to test it
2906                                    ) {
2907   // determine flags
2908   const Bytecodes::Code code = bytecode();
2909   const bool is_invokeinterface  = code == Bytecodes::_invokeinterface;
2910   const bool is_invokedynamic    = code == Bytecodes::_invokedynamic;
2911   const bool is_invokehandle     = code == Bytecodes::_invokehandle;
2912   const bool is_invokevirtual    = code == Bytecodes::_invokevirtual;
2913   const bool is_invokespecial    = code == Bytecodes::_invokespecial;
2914   const bool load_receiver       = (recv != noreg);
2915   assert(load_receiver == (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic), "");
2916   assert(recv  == noreg || recv  == O0, "");
2917   assert(flags == noreg || flags == O1, "");
2918 
2919   // setup registers & access constant pool cache
2920   if (recv  == noreg)  recv  = O0;
2921   if (flags == noreg)  flags = O1;
2922   const Register temp = O2;
2923   assert_different_registers(method, ra, index, recv, flags, temp);
2924 
2925   load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
2926 
2927   __ mov(SP, O5_savedSP);  // record SP that we wanted the callee to restore
2928 
2929   // maybe push appendix to arguments
2930   if (is_invokedynamic || is_invokehandle) {
2931     Label L_no_push;
2932     __ set((1 << ConstantPoolCacheEntry::has_appendix_shift), temp);
2933     __ btst(flags, temp);
2934     __ br(Assembler::zero, false, Assembler::pt, L_no_push);
2935     __ delayed()->nop();
2936     // Push the appendix as a trailing parameter.
2937     // This must be done before we get the receiver,
2938     // since the parameter_size includes it.
2939     assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0");
2940     __ load_resolved_reference_at_index(temp, index);
2941     __ verify_oop(temp);
2942     __ push_ptr(temp);  // push appendix (MethodType, CallSite, etc.)
2943     __ bind(L_no_push);
2944   }
2945 
2946   // load receiver if needed (after appendix is pushed so parameter size is correct)
2947   if (load_receiver) {
2948     __ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, temp);  // get parameter size
2949     __ load_receiver(temp, recv);  //  __ argument_address uses Gargs but we need Lesp
2950     __ verify_oop(recv);
2951   }
2952 
2953   // compute return type
2954   __ srl(flags, ConstantPoolCacheEntry::tos_state_shift, ra);
2955   // Make sure we don't need to mask flags after the above shift
2956   ConstantPoolCacheEntry::verify_tos_state_shift();
2957   // load return address
2958   {
2959     const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
2960     AddressLiteral table(table_addr);
2961     __ set(table, temp);
2962     __ sll(ra, LogBytesPerWord, ra);
2963     __ ld_ptr(Address(temp, ra), ra);
2964   }
2965 }
2966 
2967 
2968 void TemplateTable::generate_vtable_call(Register Rrecv, Register Rindex, Register Rret) {
2969   Register Rcall = Rindex;
2970   assert_different_registers(Rcall, G5_method, Gargs, Rret);
2971 
2972   // get target Method* & entry point
2973   __ lookup_virtual_method(Rrecv, Rindex, G5_method);
2974   __ profile_arguments_type(G5_method, Rcall, Gargs, true);
2975   __ call_from_interpreter(Rcall, Gargs, Rret);
2976 }
2977 
2978 void TemplateTable::invokevirtual(int byte_no) {
2979   transition(vtos, vtos);
2980   assert(byte_no == f2_byte, "use this argument");
2981 
2982   Register Rscratch = G3_scratch;
2983   Register Rtemp    = G4_scratch;
2984   Register Rret     = Lscratch;
2985   Register O0_recv  = O0;
2986   Label notFinal;
2987 
2988   load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, true, false, false);
2989   __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
2990 
2991   // Check for vfinal
2992   __ set((1 << ConstantPoolCacheEntry::is_vfinal_shift), G4_scratch);
2993   __ btst(Rret, G4_scratch);
2994   __ br(Assembler::zero, false, Assembler::pt, notFinal);
2995   __ delayed()->and3(Rret, 0xFF, G4_scratch);      // gets number of parameters
2996 
2997   if (RewriteBytecodes && !UseSharedSpaces) {
2998     patch_bytecode(Bytecodes::_fast_invokevfinal, Rscratch, Rtemp);
2999   }
3000 
3001   invokevfinal_helper(Rscratch, Rret);
3002 
3003   __ bind(notFinal);
3004 
3005   __ mov(G5_method, Rscratch);  // better scratch register
3006   __ load_receiver(G4_scratch, O0_recv);  // gets receiverOop
3007   // receiver is in O0_recv
3008   __ verify_oop(O0_recv);
3009 
3010   // get return address
3011   AddressLiteral table(Interpreter::invoke_return_entry_table());
3012   __ set(table, Rtemp);
3013   __ srl(Rret, ConstantPoolCacheEntry::tos_state_shift, Rret);          // get return type
3014   // Make sure we don't need to mask Rret after the above shift
3015   ConstantPoolCacheEntry::verify_tos_state_shift();
3016   __ sll(Rret,  LogBytesPerWord, Rret);
3017   __ ld_ptr(Rtemp, Rret, Rret);         // get return address
3018 
3019   // get receiver klass
3020   __ null_check(O0_recv, oopDesc::klass_offset_in_bytes());
3021   __ load_klass(O0_recv, O0_recv);
3022   __ verify_klass_ptr(O0_recv);
3023 
3024   __ profile_virtual_call(O0_recv, O4);
3025 
3026   generate_vtable_call(O0_recv, Rscratch, Rret);
3027 }
3028 
3029 void TemplateTable::fast_invokevfinal(int byte_no) {
3030   transition(vtos, vtos);
3031   assert(byte_no == f2_byte, "use this argument");
3032 
3033   load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Lscratch, true,
3034                              /*is_invokevfinal*/true, false);
3035   __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
3036   invokevfinal_helper(G3_scratch, Lscratch);
3037 }
3038 
3039 void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {
3040   Register Rtemp = G4_scratch;
3041 
3042   // Load receiver from stack slot
3043   __ ld_ptr(G5_method, in_bytes(Method::const_offset()), G4_scratch);
3044   __ lduh(G4_scratch, in_bytes(ConstMethod::size_of_parameters_offset()), G4_scratch);
3045   __ load_receiver(G4_scratch, O0);
3046 
3047   // receiver NULL check
3048   __ null_check(O0);
3049 
3050   __ profile_final_call(O4);
3051   __ profile_arguments_type(G5_method, Rscratch, Gargs, true);
3052 
3053   // get return address
3054   AddressLiteral table(Interpreter::invoke_return_entry_table());
3055   __ set(table, Rtemp);
3056   __ srl(Rret, ConstantPoolCacheEntry::tos_state_shift, Rret);          // get return type
3057   // Make sure we don't need to mask Rret after the above shift
3058   ConstantPoolCacheEntry::verify_tos_state_shift();
3059   __ sll(Rret,  LogBytesPerWord, Rret);
3060   __ ld_ptr(Rtemp, Rret, Rret);         // get return address
3061 
3062 
3063   // do the call
3064   __ call_from_interpreter(Rscratch, Gargs, Rret);
3065 }
3066 
3067 
3068 void TemplateTable::invokespecial(int byte_no) {
3069   transition(vtos, vtos);
3070   assert(byte_no == f1_byte, "use this argument");
3071 
3072   const Register Rret     = Lscratch;
3073   const Register O0_recv  = O0;
3074   const Register Rscratch = G3_scratch;
3075 
3076   prepare_invoke(byte_no, G5_method, Rret, noreg, O0_recv);  // get receiver also for null check
3077   __ null_check(O0_recv);
3078 
3079   // do the call
3080   __ profile_call(O4);
3081   __ profile_arguments_type(G5_method, Rscratch, Gargs, false);
3082   __ call_from_interpreter(Rscratch, Gargs, Rret);
3083 }
3084 
3085 
3086 void TemplateTable::invokestatic(int byte_no) {
3087   transition(vtos, vtos);
3088   assert(byte_no == f1_byte, "use this argument");
3089 
3090   const Register Rret     = Lscratch;
3091   const Register Rscratch = G3_scratch;
3092 
3093   prepare_invoke(byte_no, G5_method, Rret);  // get f1 Method*
3094 
3095   // do the call
3096   __ profile_call(O4);
3097   __ profile_arguments_type(G5_method, Rscratch, Gargs, false);
3098   __ call_from_interpreter(Rscratch, Gargs, Rret);
3099 }
3100 
3101 void TemplateTable::invokeinterface_object_method(Register RKlass,
3102                                                   Register Rcall,
3103                                                   Register Rret,
3104                                                   Register Rflags) {
3105   Register Rscratch = G4_scratch;
3106   Register Rindex = Lscratch;
3107 
3108   assert_different_registers(Rscratch, Rindex, Rret);
3109 
3110   Label notFinal;
3111 
3112   // Check for vfinal
3113   __ set((1 << ConstantPoolCacheEntry::is_vfinal_shift), Rscratch);
3114   __ btst(Rflags, Rscratch);
3115   __ br(Assembler::zero, false, Assembler::pt, notFinal);
3116   __ delayed()->nop();
3117 
3118   __ profile_final_call(O4);
3119 
3120   // do the call - the index (f2) contains the Method*
3121   assert_different_registers(G5_method, Gargs, Rcall);
3122   __ mov(Rindex, G5_method);
3123   __ profile_arguments_type(G5_method, Rcall, Gargs, true);
3124   __ call_from_interpreter(Rcall, Gargs, Rret);
3125   __ bind(notFinal);
3126 
3127   __ profile_virtual_call(RKlass, O4);
3128   generate_vtable_call(RKlass, Rindex, Rret);
3129 }
3130 
3131 
3132 void TemplateTable::invokeinterface(int byte_no) {
3133   transition(vtos, vtos);
3134   assert(byte_no == f1_byte, "use this argument");
3135 
3136   const Register Rinterface  = G1_scratch;
3137   const Register Rret        = G3_scratch;
3138   const Register Rindex      = Lscratch;
3139   const Register O0_recv     = O0;
3140   const Register O1_flags    = O1;
3141   const Register O2_Klass    = O2;
3142   const Register Rscratch    = G4_scratch;
3143   assert_different_registers(Rscratch, G5_method);
3144 
3145   prepare_invoke(byte_no, Rinterface, Rret, Rindex, O0_recv, O1_flags);
3146 
3147   // get receiver klass
3148   __ null_check(O0_recv, oopDesc::klass_offset_in_bytes());
3149   __ load_klass(O0_recv, O2_Klass);
3150 
3151   // Special case of invokeinterface called for virtual method of
3152   // java.lang.Object.  See cpCacheOop.cpp for details.
3153   // This code isn't produced by javac, but could be produced by
3154   // another compliant java compiler.
3155   Label notMethod;
3156   __ set((1 << ConstantPoolCacheEntry::is_forced_virtual_shift), Rscratch);
3157   __ btst(O1_flags, Rscratch);
3158   __ br(Assembler::zero, false, Assembler::pt, notMethod);
3159   __ delayed()->nop();
3160 
3161   invokeinterface_object_method(O2_Klass, Rinterface, Rret, O1_flags);
3162 
3163   __ bind(notMethod);
3164 
3165   __ profile_virtual_call(O2_Klass, O4);
3166 
3167   //
3168   // find entry point to call
3169   //
3170 
3171   // compute start of first itableOffsetEntry (which is at end of vtable)
3172   const int base = InstanceKlass::vtable_start_offset() * wordSize;
3173   Label search;
3174   Register Rtemp = O1_flags;
3175 
3176   __ ld(O2_Klass, InstanceKlass::vtable_length_offset() * wordSize, Rtemp);
3177   if (align_object_offset(1) > 1) {
3178     __ round_to(Rtemp, align_object_offset(1));
3179   }
3180   __ sll(Rtemp, LogBytesPerWord, Rtemp);   // Rscratch *= 4;
3181   if (Assembler::is_simm13(base)) {
3182     __ add(Rtemp, base, Rtemp);
3183   } else {
3184     __ set(base, Rscratch);
3185     __ add(Rscratch, Rtemp, Rtemp);
3186   }
3187   __ add(O2_Klass, Rtemp, Rscratch);
3188 
3189   __ bind(search);
3190 
3191   __ ld_ptr(Rscratch, itableOffsetEntry::interface_offset_in_bytes(), Rtemp);
3192   {
3193     Label ok;
3194 
3195     // Check that entry is non-null.  Null entries are probably a bytecode
3196     // problem.  If the interface isn't implemented by the receiver class,
3197     // the VM should throw IncompatibleClassChangeError.  linkResolver checks
3198     // this too but that's only if the entry isn't already resolved, so we
3199     // need to check again.
3200     __ br_notnull_short( Rtemp, Assembler::pt, ok);
3201     call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError));
3202     __ should_not_reach_here();
3203     __ bind(ok);
3204   }
3205 
3206   __ cmp(Rinterface, Rtemp);
3207   __ brx(Assembler::notEqual, true, Assembler::pn, search);
3208   __ delayed()->add(Rscratch, itableOffsetEntry::size() * wordSize, Rscratch);
3209 
3210   // entry found and Rscratch points to it
3211   __ ld(Rscratch, itableOffsetEntry::offset_offset_in_bytes(), Rscratch);
3212 
3213   assert(itableMethodEntry::method_offset_in_bytes() == 0, "adjust instruction below");
3214   __ sll(Rindex, exact_log2(itableMethodEntry::size() * wordSize), Rindex);       // Rindex *= 8;
3215   __ add(Rscratch, Rindex, Rscratch);
3216   __ ld_ptr(O2_Klass, Rscratch, G5_method);
3217 
3218   // Check for abstract method error.
3219   {
3220     Label ok;
3221     __ br_notnull_short(G5_method, Assembler::pt, ok);
3222     call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
3223     __ should_not_reach_here();
3224     __ bind(ok);
3225   }
3226 
3227   Register Rcall = Rinterface;
3228   assert_different_registers(Rcall, G5_method, Gargs, Rret);
3229 
3230   __ profile_arguments_type(G5_method, Rcall, Gargs, true);
3231   __ call_from_interpreter(Rcall, Gargs, Rret);
3232 }
3233 
3234 void TemplateTable::invokehandle(int byte_no) {
3235   transition(vtos, vtos);
3236   assert(byte_no == f1_byte, "use this argument");
3237 
3238   const Register Rret       = Lscratch;
3239   const Register G4_mtype   = G4_scratch;
3240   const Register O0_recv    = O0;
3241   const Register Rscratch   = G3_scratch;
3242 
3243   prepare_invoke(byte_no, G5_method, Rret, G4_mtype, O0_recv);
3244   __ null_check(O0_recv);
3245 
3246   // G4: MethodType object (from cpool->resolved_references[f1], if necessary)
3247   // G5: MH.invokeExact_MT method (from f2)
3248 
3249   // Note:  G4_mtype is already pushed (if necessary) by prepare_invoke
3250 
3251   // do the call
3252   __ verify_oop(G4_mtype);
3253   __ profile_final_call(O4);  // FIXME: profile the LambdaForm also
3254   __ profile_arguments_type(G5_method, Rscratch, Gargs, true);
3255   __ call_from_interpreter(Rscratch, Gargs, Rret);
3256 }
3257 
3258 
3259 void TemplateTable::invokedynamic(int byte_no) {
3260   transition(vtos, vtos);
3261   assert(byte_no == f1_byte, "use this argument");
3262 
3263   const Register Rret        = Lscratch;
3264   const Register G4_callsite = G4_scratch;
3265   const Register Rscratch    = G3_scratch;
3266 
3267   prepare_invoke(byte_no, G5_method, Rret, G4_callsite);
3268 
3269   // G4: CallSite object (from cpool->resolved_references[f1])
3270   // G5: MH.linkToCallSite method (from f2)
3271 
3272   // Note:  G4_callsite is already pushed by prepare_invoke
3273 
3274   // %%% should make a type profile for any invokedynamic that takes a ref argument
3275   // profile this call
3276   __ profile_call(O4);
3277 
3278   // do the call
3279   __ verify_oop(G4_callsite);
3280   __ profile_arguments_type(G5_method, Rscratch, Gargs, false);
3281   __ call_from_interpreter(Rscratch, Gargs, Rret);
3282 }
3283 
3284 
3285 //----------------------------------------------------------------------------------------------------
3286 // Allocation
3287 
3288 void TemplateTable::_new() {
3289   transition(vtos, atos);
3290 
3291   Label slow_case;
3292   Label done;
3293   Label initialize_header;
3294   Label initialize_object;  // including clearing the fields
3295 
3296   Register RallocatedObject = Otos_i;
3297   Register RinstanceKlass = O1;
3298   Register Roffset = O3;
3299   Register Rscratch = O4;
3300 
3301   __ get_2_byte_integer_at_bcp(1, Rscratch, Roffset, InterpreterMacroAssembler::Unsigned);
3302   __ get_cpool_and_tags(Rscratch, G3_scratch);
3303   // make sure the class we're about to instantiate has been resolved
3304   // This is done before loading InstanceKlass to be consistent with the order
3305   // how Constant Pool is updated (see ConstantPool::klass_at_put)
3306   __ add(G3_scratch, Array<u1>::base_offset_in_bytes(), G3_scratch);
3307   __ ldub(G3_scratch, Roffset, G3_scratch);
3308   __ cmp(G3_scratch, JVM_CONSTANT_Class);
3309   __ br(Assembler::notEqual, false, Assembler::pn, slow_case);
3310   __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
3311   // get InstanceKlass
3312   //__ sll(Roffset, LogBytesPerWord, Roffset);        // executed in delay slot
3313   __ add(Roffset, sizeof(ConstantPool), Roffset);
3314   __ ld_ptr(Rscratch, Roffset, RinstanceKlass);
3315 
3316   // make sure klass is fully initialized:
3317   __ ldub(RinstanceKlass, in_bytes(InstanceKlass::init_state_offset()), G3_scratch);
3318   __ cmp(G3_scratch, InstanceKlass::fully_initialized);
3319   __ br(Assembler::notEqual, false, Assembler::pn, slow_case);
3320   __ delayed()->ld(RinstanceKlass, in_bytes(Klass::layout_helper_offset()), Roffset);
3321 
3322   // get instance_size in InstanceKlass (already aligned)
3323   //__ ld(RinstanceKlass, in_bytes(Klass::layout_helper_offset()), Roffset);
3324 
3325   // make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class
3326   __ btst(Klass::_lh_instance_slow_path_bit, Roffset);
3327   __ br(Assembler::notZero, false, Assembler::pn, slow_case);
3328   __ delayed()->nop();
3329 
3330   // allocate the instance
3331   // 1) Try to allocate in the TLAB
3332   // 2) if fail, and the TLAB is not full enough to discard, allocate in the shared Eden
3333   // 3) if the above fails (or is not applicable), go to a slow case
3334   // (creates a new TLAB, etc.)
3335 
3336   const bool allow_shared_alloc =
3337     Universe::heap()->supports_inline_contig_alloc();
3338 
3339   if(UseTLAB) {
3340     Register RoldTopValue = RallocatedObject;
3341     Register RtlabWasteLimitValue = G3_scratch;
3342     Register RnewTopValue = G1_scratch;
3343     Register RendValue = Rscratch;
3344     Register RfreeValue = RnewTopValue;
3345 
3346     // check if we can allocate in the TLAB
3347     __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_top_offset()), RoldTopValue); // sets up RalocatedObject
3348     __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_end_offset()), RendValue);
3349     __ add(RoldTopValue, Roffset, RnewTopValue);
3350 
3351     // if there is enough space, we do not CAS and do not clear
3352     __ cmp(RnewTopValue, RendValue);
3353     if(ZeroTLAB) {
3354       // the fields have already been cleared
3355       __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_header);
3356     } else {
3357       // initialize both the header and fields
3358       __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_object);
3359     }
3360     __ delayed()->st_ptr(RnewTopValue, G2_thread, in_bytes(JavaThread::tlab_top_offset()));
3361 
3362     if (allow_shared_alloc) {
3363       // Check if tlab should be discarded (refill_waste_limit >= free)
3364       __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), RtlabWasteLimitValue);
3365       __ sub(RendValue, RoldTopValue, RfreeValue);
3366 #ifdef _LP64
3367       __ srlx(RfreeValue, LogHeapWordSize, RfreeValue);
3368 #else
3369       __ srl(RfreeValue, LogHeapWordSize, RfreeValue);
3370 #endif
3371       __ cmp_and_brx_short(RtlabWasteLimitValue, RfreeValue, Assembler::greaterEqualUnsigned, Assembler::pt, slow_case); // tlab waste is small
3372 
3373       // increment waste limit to prevent getting stuck on this slow path
3374       __ add(RtlabWasteLimitValue, ThreadLocalAllocBuffer::refill_waste_limit_increment(), RtlabWasteLimitValue);
3375       __ st_ptr(RtlabWasteLimitValue, G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()));
3376     } else {
3377       // No allocation in the shared eden.
3378       __ ba_short(slow_case);
3379     }
3380   }
3381 
3382   // Allocation in the shared Eden
3383   if (allow_shared_alloc) {
3384     Register RoldTopValue = G1_scratch;
3385     Register RtopAddr = G3_scratch;
3386     Register RnewTopValue = RallocatedObject;
3387     Register RendValue = Rscratch;
3388 
3389     __ set((intptr_t)Universe::heap()->top_addr(), RtopAddr);
3390 
3391     Label retry;
3392     __ bind(retry);
3393     __ set((intptr_t)Universe::heap()->end_addr(), RendValue);
3394     __ ld_ptr(RendValue, 0, RendValue);
3395     __ ld_ptr(RtopAddr, 0, RoldTopValue);
3396     __ add(RoldTopValue, Roffset, RnewTopValue);
3397 
3398     // RnewTopValue contains the top address after the new object
3399     // has been allocated.
3400     __ cmp_and_brx_short(RnewTopValue, RendValue, Assembler::greaterUnsigned, Assembler::pn, slow_case);
3401 
3402     __ cas_ptr(RtopAddr, RoldTopValue, RnewTopValue);
3403 
3404     // if someone beat us on the allocation, try again, otherwise continue
3405     __ cmp_and_brx_short(RoldTopValue, RnewTopValue, Assembler::notEqual, Assembler::pn, retry);
3406 
3407     // bump total bytes allocated by this thread
3408     // RoldTopValue and RtopAddr are dead, so can use G1 and G3
3409     __ incr_allocated_bytes(Roffset, G1_scratch, G3_scratch);
3410   }
3411 
3412   if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
3413     // clear object fields
3414     __ bind(initialize_object);
3415     __ deccc(Roffset, sizeof(oopDesc));
3416     __ br(Assembler::zero, false, Assembler::pt, initialize_header);
3417     __ delayed()->add(RallocatedObject, sizeof(oopDesc), G3_scratch);
3418 
3419     // initialize remaining object fields
3420     if (UseBlockZeroing) {
3421       // Use BIS for zeroing
3422       __ bis_zeroing(G3_scratch, Roffset, G1_scratch, initialize_header);
3423     } else {
3424       Label loop;
3425       __ subcc(Roffset, wordSize, Roffset);
3426       __ bind(loop);
3427       //__ subcc(Roffset, wordSize, Roffset);      // executed above loop or in delay slot
3428       __ st_ptr(G0, G3_scratch, Roffset);
3429       __ br(Assembler::notEqual, false, Assembler::pt, loop);
3430       __ delayed()->subcc(Roffset, wordSize, Roffset);
3431     }
3432     __ ba_short(initialize_header);
3433   }
3434 
3435   // slow case
3436   __ bind(slow_case);
3437   __ get_2_byte_integer_at_bcp(1, G3_scratch, O2, InterpreterMacroAssembler::Unsigned);
3438   __ get_constant_pool(O1);
3439 
3440   call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), O1, O2);
3441 
3442   __ ba_short(done);
3443 
3444   // Initialize the header: mark, klass
3445   __ bind(initialize_header);
3446 
3447   if (UseBiasedLocking) {
3448     __ ld_ptr(RinstanceKlass, in_bytes(Klass::prototype_header_offset()), G4_scratch);
3449   } else {
3450     __ set((intptr_t)markOopDesc::prototype(), G4_scratch);
3451   }
3452   __ st_ptr(G4_scratch, RallocatedObject, oopDesc::mark_offset_in_bytes());       // mark
3453   __ store_klass_gap(G0, RallocatedObject);         // klass gap if compressed
3454   __ store_klass(RinstanceKlass, RallocatedObject); // klass (last for cms)
3455 
3456   {
3457     SkipIfEqual skip_if(
3458       _masm, G4_scratch, &DTraceAllocProbes, Assembler::zero);
3459     // Trigger dtrace event
3460     __ push(atos);
3461     __ call_VM_leaf(noreg,
3462        CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), O0);
3463     __ pop(atos);
3464   }
3465 
3466   // continue
3467   __ bind(done);
3468 }
3469 
3470 
3471 
3472 void TemplateTable::newarray() {
3473   transition(itos, atos);
3474   __ ldub(Lbcp, 1, O1);
3475      call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), O1, Otos_i);
3476 }
3477 
3478 
3479 void TemplateTable::anewarray() {
3480   transition(itos, atos);
3481   __ get_constant_pool(O1);
3482   __ get_2_byte_integer_at_bcp(1, G4_scratch, O2, InterpreterMacroAssembler::Unsigned);
3483      call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), O1, O2, Otos_i);
3484 }
3485 
3486 
3487 void TemplateTable::arraylength() {
3488   transition(atos, itos);
3489   Label ok;
3490   __ verify_oop(Otos_i);
3491   __ tst(Otos_i);
3492   __ throw_if_not_1_x( Assembler::notZero, ok );
3493   __ delayed()->ld(Otos_i, arrayOopDesc::length_offset_in_bytes(), Otos_i);
3494   __ throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ok);
3495 }
3496 
3497 
3498 void TemplateTable::checkcast() {
3499   transition(atos, atos);
3500   Label done, is_null, quicked, cast_ok, resolved;
3501   Register Roffset = G1_scratch;
3502   Register RobjKlass = O5;
3503   Register RspecifiedKlass = O4;
3504 
3505   // Check for casting a NULL
3506   __ br_null_short(Otos_i, Assembler::pn, is_null);
3507 
3508   // Get value klass in RobjKlass
3509   __ load_klass(Otos_i, RobjKlass); // get value klass
3510 
3511   // Get constant pool tag
3512   __ get_2_byte_integer_at_bcp(1, Lscratch, Roffset, InterpreterMacroAssembler::Unsigned);
3513 
3514   // See if the checkcast has been quickened
3515   __ get_cpool_and_tags(Lscratch, G3_scratch);
3516   __ add(G3_scratch, Array<u1>::base_offset_in_bytes(), G3_scratch);
3517   __ ldub(G3_scratch, Roffset, G3_scratch);
3518   __ cmp(G3_scratch, JVM_CONSTANT_Class);
3519   __ br(Assembler::equal, true, Assembler::pt, quicked);
3520   __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
3521 
3522   __ push_ptr(); // save receiver for result, and for GC
3523   call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
3524   __ get_vm_result_2(RspecifiedKlass);
3525   __ pop_ptr(Otos_i, G3_scratch); // restore receiver
3526 
3527   __ ba_short(resolved);
3528 
3529   // Extract target class from constant pool
3530   __ bind(quicked);
3531   __ add(Roffset, sizeof(ConstantPool), Roffset);
3532   __ ld_ptr(Lscratch, Roffset, RspecifiedKlass);
3533   __ bind(resolved);
3534   __ load_klass(Otos_i, RobjKlass); // get value klass
3535 
3536   // Generate a fast subtype check.  Branch to cast_ok if no
3537   // failure.  Throw exception if failure.
3538   __ gen_subtype_check( RobjKlass, RspecifiedKlass, G3_scratch, G4_scratch, G1_scratch, cast_ok );
3539 
3540   // Not a subtype; so must throw exception
3541   __ throw_if_not_x( Assembler::never, Interpreter::_throw_ClassCastException_entry, G3_scratch );
3542 
3543   __ bind(cast_ok);
3544 
3545   if (ProfileInterpreter) {
3546     __ ba_short(done);
3547   }
3548   __ bind(is_null);
3549   __ profile_null_seen(G3_scratch);
3550   __ bind(done);
3551 }
3552 
3553 
3554 void TemplateTable::instanceof() {
3555   Label done, is_null, quicked, resolved;
3556   transition(atos, itos);
3557   Register Roffset = G1_scratch;
3558   Register RobjKlass = O5;
3559   Register RspecifiedKlass = O4;
3560 
3561   // Check for casting a NULL
3562   __ br_null_short(Otos_i, Assembler::pt, is_null);
3563 
3564   // Get value klass in RobjKlass
3565   __ load_klass(Otos_i, RobjKlass); // get value klass
3566 
3567   // Get constant pool tag
3568   __ get_2_byte_integer_at_bcp(1, Lscratch, Roffset, InterpreterMacroAssembler::Unsigned);
3569 
3570   // See if the checkcast has been quickened
3571   __ get_cpool_and_tags(Lscratch, G3_scratch);
3572   __ add(G3_scratch, Array<u1>::base_offset_in_bytes(), G3_scratch);
3573   __ ldub(G3_scratch, Roffset, G3_scratch);
3574   __ cmp(G3_scratch, JVM_CONSTANT_Class);
3575   __ br(Assembler::equal, true, Assembler::pt, quicked);
3576   __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
3577 
3578   __ push_ptr(); // save receiver for result, and for GC
3579   call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
3580   __ get_vm_result_2(RspecifiedKlass);
3581   __ pop_ptr(Otos_i, G3_scratch); // restore receiver
3582 
3583   __ ba_short(resolved);
3584 
3585   // Extract target class from constant pool
3586   __ bind(quicked);
3587   __ add(Roffset, sizeof(ConstantPool), Roffset);
3588   __ get_constant_pool(Lscratch);
3589   __ ld_ptr(Lscratch, Roffset, RspecifiedKlass);
3590   __ bind(resolved);
3591   __ load_klass(Otos_i, RobjKlass); // get value klass
3592 
3593   // Generate a fast subtype check.  Branch to cast_ok if no
3594   // failure.  Return 0 if failure.
3595   __ or3(G0, 1, Otos_i);      // set result assuming quick tests succeed
3596   __ gen_subtype_check( RobjKlass, RspecifiedKlass, G3_scratch, G4_scratch, G1_scratch, done );
3597   // Not a subtype; return 0;
3598   __ clr( Otos_i );
3599 
3600   if (ProfileInterpreter) {
3601     __ ba_short(done);
3602   }
3603   __ bind(is_null);
3604   __ profile_null_seen(G3_scratch);
3605   __ bind(done);
3606 }
3607 
3608 void TemplateTable::_breakpoint() {
3609 
3610    // Note: We get here even if we are single stepping..
3611    // jbug inists on setting breakpoints at every bytecode
3612    // even if we are in single step mode.
3613 
3614    transition(vtos, vtos);
3615    // get the unpatched byte code
3616    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), Lmethod, Lbcp);
3617    __ mov(O0, Lbyte_code);
3618 
3619    // post the breakpoint event
3620    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), Lmethod, Lbcp);
3621 
3622    // complete the execution of original bytecode
3623    __ dispatch_normal(vtos);
3624 }
3625 
3626 
3627 //----------------------------------------------------------------------------------------------------
3628 // Exceptions
3629 
3630 void TemplateTable::athrow() {
3631   transition(atos, vtos);
3632 
3633   // This works because exception is cached in Otos_i which is same as O0,
3634   // which is same as what throw_exception_entry_expects
3635   assert(Otos_i == Oexception, "see explanation above");
3636 
3637   __ verify_oop(Otos_i);
3638   __ null_check(Otos_i);
3639   __ throw_if_not_x(Assembler::never, Interpreter::throw_exception_entry(), G3_scratch);
3640 }
3641 
3642 
3643 //----------------------------------------------------------------------------------------------------
3644 // Synchronization
3645 
3646 
3647 // See frame_sparc.hpp for monitor block layout.
3648 // Monitor elements are dynamically allocated by growing stack as needed.
3649 
3650 void TemplateTable::monitorenter() {
3651   transition(atos, vtos);
3652   __ verify_oop(Otos_i);
3653   // Try to acquire a lock on the object
3654   // Repeat until succeeded (i.e., until
3655   // monitorenter returns true).
3656 
3657   {   Label ok;
3658     __ tst(Otos_i);
3659     __ throw_if_not_1_x( Assembler::notZero,  ok);
3660     __ delayed()->mov(Otos_i, Lscratch); // save obj
3661     __ throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ok);
3662   }
3663 
3664   assert(O0 == Otos_i, "Be sure where the object to lock is");
3665 
3666   // find a free slot in the monitor block
3667 
3668 
3669   // initialize entry pointer
3670   __ clr(O1); // points to free slot or NULL
3671 
3672   {
3673     Label entry, loop, exit;
3674     __ add( __ top_most_monitor(), O2 ); // last one to check
3675     __ ba( entry );
3676     __ delayed()->mov( Lmonitors, O3 ); // first one to check
3677 
3678 
3679     __ bind( loop );
3680 
3681     __ verify_oop(O4);          // verify each monitor's oop
3682     __ tst(O4); // is this entry unused?
3683     __ movcc( Assembler::zero, false, Assembler::ptr_cc, O3, O1);
3684 
3685     __ cmp(O4, O0); // check if current entry is for same object
3686     __ brx( Assembler::equal, false, Assembler::pn, exit );
3687     __ delayed()->inc( O3, frame::interpreter_frame_monitor_size() * wordSize ); // check next one
3688 
3689     __ bind( entry );
3690 
3691     __ cmp( O3, O2 );
3692     __ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, loop );
3693     __ delayed()->ld_ptr(O3, BasicObjectLock::obj_offset_in_bytes(), O4);
3694 
3695     __ bind( exit );
3696   }
3697 
3698   { Label allocated;
3699 
3700     // found free slot?
3701     __ br_notnull_short(O1, Assembler::pn, allocated);
3702 
3703     __ add_monitor_to_stack( false, O2, O3 );
3704     __ mov(Lmonitors, O1);
3705 
3706     __ bind(allocated);
3707   }
3708 
3709   // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly.
3710   // The object has already been poped from the stack, so the expression stack looks correct.
3711   __ inc(Lbcp);
3712 
3713   __ st_ptr(O0, O1, BasicObjectLock::obj_offset_in_bytes()); // store object
3714   __ lock_object(O1, O0);
3715 
3716   // check if there's enough space on the stack for the monitors after locking
3717   __ generate_stack_overflow_check(0);
3718 
3719   // The bcp has already been incremented. Just need to dispatch to next instruction.
3720   __ dispatch_next(vtos);
3721 }
3722 
3723 
3724 void TemplateTable::monitorexit() {
3725   transition(atos, vtos);
3726   __ verify_oop(Otos_i);
3727   __ tst(Otos_i);
3728   __ throw_if_not_x( Assembler::notZero, Interpreter::_throw_NullPointerException_entry, G3_scratch );
3729 
3730   assert(O0 == Otos_i, "just checking");
3731 
3732   { Label entry, loop, found;
3733     __ add( __ top_most_monitor(), O2 ); // last one to check
3734     __ ba(entry);
3735     // use Lscratch to hold monitor elem to check, start with most recent monitor,
3736     // By using a local it survives the call to the C routine.
3737     __ delayed()->mov( Lmonitors, Lscratch );
3738 
3739     __ bind( loop );
3740 
3741     __ verify_oop(O4);          // verify each monitor's oop
3742     __ cmp(O4, O0); // check if current entry is for desired object
3743     __ brx( Assembler::equal, true, Assembler::pt, found );
3744     __ delayed()->mov(Lscratch, O1); // pass found entry as argument to monitorexit
3745 
3746     __ inc( Lscratch, frame::interpreter_frame_monitor_size() * wordSize ); // advance to next
3747 
3748     __ bind( entry );
3749 
3750     __ cmp( Lscratch, O2 );
3751     __ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, loop );
3752     __ delayed()->ld_ptr(Lscratch, BasicObjectLock::obj_offset_in_bytes(), O4);
3753 
3754     call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
3755     __ should_not_reach_here();
3756 
3757     __ bind(found);
3758   }
3759   __ unlock_object(O1);
3760 }
3761 
3762 
3763 //----------------------------------------------------------------------------------------------------
3764 // Wide instructions
3765 
3766 void TemplateTable::wide() {
3767   transition(vtos, vtos);
3768   __ ldub(Lbcp, 1, G3_scratch);// get next bc
3769   __ sll(G3_scratch, LogBytesPerWord, G3_scratch);
3770   AddressLiteral ep(Interpreter::_wentry_point);
3771   __ set(ep, G4_scratch);
3772   __ ld_ptr(G4_scratch, G3_scratch, G3_scratch);
3773   __ jmp(G3_scratch, G0);
3774   __ delayed()->nop();
3775   // Note: the Lbcp increment step is part of the individual wide bytecode implementations
3776 }
3777 
3778 
3779 //----------------------------------------------------------------------------------------------------
3780 // Multi arrays
3781 
3782 void TemplateTable::multianewarray() {
3783   transition(vtos, atos);
3784      // put ndims * wordSize into Lscratch
3785   __ ldub( Lbcp,     3,               Lscratch);
3786   __ sll(  Lscratch, Interpreter::logStackElementSize, Lscratch);
3787      // Lesp points past last_dim, so set to O1 to first_dim address
3788   __ add(  Lesp,     Lscratch,        O1);
3789      call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), O1);
3790   __ add(  Lesp,     Lscratch,        Lesp); // pop all dimensions off the stack
3791 }
3792 #endif /* !CC_INTERP */