hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
changeset 2571 d602ad6538bd
parent 2332 5c7b6f4ce0a1
child 2867 69187054225f
equal deleted inserted replaced
2569:9e8daec25638 2571:d602ad6538bd
   194       int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord);
   194       int slot_offset = monitor_offset - ((i * BasicObjectLock::size()) * BytesPerWord);
   195 #ifdef ASSERT
   195 #ifdef ASSERT
   196       // verify the interpreter's monitor has a non-null object
   196       // verify the interpreter's monitor has a non-null object
   197       {
   197       {
   198         Label L;
   198         Label L;
   199         __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7);
   199         __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7);
   200         __ cmp(G0, O7);
   200         __ cmp(G0, O7);
   201         __ br(Assembler::notEqual, false, Assembler::pt, L);
   201         __ br(Assembler::notEqual, false, Assembler::pt, L);
   202         __ delayed()->nop();
   202         __ delayed()->nop();
   203         __ stop("locked object is NULL");
   203         __ stop("locked object is NULL");
   204         __ bind(L);
   204         __ bind(L);
   205       }
   205       }
   206 #endif // ASSERT
   206 #endif // ASSERT
   207       // Copy the lock field into the compiled activation.
   207       // Copy the lock field into the compiled activation.
   208       __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::lock_offset_in_bytes()), O7);
   208       __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes(), O7);
   209       __ st_ptr(O7, frame_map()->address_for_monitor_lock(i));
   209       __ st_ptr(O7, frame_map()->address_for_monitor_lock(i));
   210       __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7);
   210       __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7);
   211       __ st_ptr(O7, frame_map()->address_for_monitor_object(i));
   211       __ st_ptr(O7, frame_map()->address_for_monitor_object(i));
   212     }
   212     }
   213   }
   213   }
   214 }
   214 }
   215 
   215 
   236 
   236 
   237     int  value_offset = java_lang_String:: value_offset_in_bytes(); // char array
   237     int  value_offset = java_lang_String:: value_offset_in_bytes(); // char array
   238     int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position
   238     int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position
   239     int  count_offset = java_lang_String:: count_offset_in_bytes();
   239     int  count_offset = java_lang_String:: count_offset_in_bytes();
   240 
   240 
   241     __ ld_ptr(Address(str0, 0,  value_offset), tmp0);
   241     __ ld_ptr(str0, value_offset, tmp0);
   242     __ ld(Address(str0, 0, offset_offset), tmp2);
   242     __ ld(str0, offset_offset, tmp2);
   243     __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0);
   243     __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0);
   244     __ ld(Address(str0, 0, count_offset), str0);
   244     __ ld(str0, count_offset, str0);
   245     __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2);
   245     __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2);
   246 
   246 
   247     // str1 may be null
   247     // str1 may be null
   248     add_debug_info_for_null_check_here(info);
   248     add_debug_info_for_null_check_here(info);
   249 
   249 
   250     __ ld_ptr(Address(str1, 0,  value_offset), tmp1);
   250     __ ld_ptr(str1, value_offset, tmp1);
   251     __ add(tmp0, tmp2, tmp0);
   251     __ add(tmp0, tmp2, tmp0);
   252 
   252 
   253     __ ld(Address(str1, 0, offset_offset), tmp2);
   253     __ ld(str1, offset_offset, tmp2);
   254     __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1);
   254     __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1);
   255     __ ld(Address(str1, 0, count_offset), str1);
   255     __ ld(str1, count_offset, str1);
   256     __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2);
   256     __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2);
   257     __ subcc(str0, str1, O7);
   257     __ subcc(str0, str1, O7);
   258     __ add(tmp1, tmp2, tmp1);
   258     __ add(tmp1, tmp2, tmp1);
   259   }
   259   }
   260 
   260 
   410 #ifdef ASSERT
   410 #ifdef ASSERT
   411   int offset = code_offset();
   411   int offset = code_offset();
   412 #endif // ASSERT
   412 #endif // ASSERT
   413   compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset());
   413   compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset());
   414 
   414 
   415   Address deopt_blob(G3_scratch, SharedRuntime::deopt_blob()->unpack());
   415   AddressLiteral deopt_blob(SharedRuntime::deopt_blob()->unpack());
   416 
   416 
   417   __ JUMP(deopt_blob, 0); // sethi;jmp
   417   __ JUMP(deopt_blob, G3_scratch, 0); // sethi;jmp
   418   __ delayed()->nop();
   418   __ delayed()->nop();
   419 
   419 
   420   assert(code_offset() - offset <= deopt_handler_size, "overflow");
   420   assert(code_offset() - offset <= deopt_handler_size, "overflow");
   421 
   421 
   422   debug_only(__ stop("should have gone to the caller");)
   422   debug_only(__ stop("should have gone to the caller");)
   439 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) {
   439 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) {
   440   // Allocate a new index in oop table to hold the oop once it's been patched
   440   // Allocate a new index in oop table to hold the oop once it's been patched
   441   int oop_index = __ oop_recorder()->allocate_index((jobject)NULL);
   441   int oop_index = __ oop_recorder()->allocate_index((jobject)NULL);
   442   PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index);
   442   PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index);
   443 
   443 
   444   Address addr = Address(reg, address(NULL), oop_Relocation::spec(oop_index));
   444   AddressLiteral addrlit(NULL, oop_Relocation::spec(oop_index));
   445   assert(addr.rspec().type() == relocInfo::oop_type, "must be an oop reloc");
   445   assert(addrlit.rspec().type() == relocInfo::oop_type, "must be an oop reloc");
   446   // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the
   446   // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the
   447   // NULL will be dynamically patched later and the patched value may be large.  We must
   447   // NULL will be dynamically patched later and the patched value may be large.  We must
   448   // therefore generate the sethi/add as a placeholders
   448   // therefore generate the sethi/add as a placeholders
   449   __ sethi(addr, true);
   449   __ patchable_set(addrlit, reg);
   450   __ add(addr, reg, 0);
       
   451 
   450 
   452   patching_epilog(patch, lir_patch_normal, reg, info);
   451   patching_epilog(patch, lir_patch_normal, reg, info);
   453 }
   452 }
   454 
   453 
   455 
   454 
   704 }
   703 }
   705 
   704 
   706 
   705 
   707 void LIR_Assembler::vtable_call(int vtable_offset, CodeEmitInfo* info) {
   706 void LIR_Assembler::vtable_call(int vtable_offset, CodeEmitInfo* info) {
   708   add_debug_info_for_null_check_here(info);
   707   add_debug_info_for_null_check_here(info);
   709   __ ld_ptr(Address(O0, 0,  oopDesc::klass_offset_in_bytes()), G3_scratch);
   708   __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_scratch);
   710   if (__ is_simm13(vtable_offset) ) {
   709   if (__ is_simm13(vtable_offset) ) {
   711     __ ld_ptr(G3_scratch, vtable_offset, G5_method);
   710     __ ld_ptr(G3_scratch, vtable_offset, G5_method);
   712   } else {
   711   } else {
   713     // This will generate 2 instructions
   712     // This will generate 2 instructions
   714     __ set(vtable_offset, G5_method);
   713     __ set(vtable_offset, G5_method);
   715     // ld_ptr, set_hi, set
   714     // ld_ptr, set_hi, set
   716     __ ld_ptr(G3_scratch, G5_method, G5_method);
   715     __ ld_ptr(G3_scratch, G5_method, G5_method);
   717   }
   716   }
   718   __ ld_ptr(G5_method, in_bytes(methodOopDesc::from_compiled_offset()), G3_scratch);
   717   __ ld_ptr(G5_method, methodOopDesc::from_compiled_offset(), G3_scratch);
   719   __ callr(G3_scratch, G0);
   718   __ callr(G3_scratch, G0);
   720   // the peephole pass fills the delay slot
   719   // the peephole pass fills the delay slot
   721 }
   720 }
   722 
   721 
   723 
   722 
   736       case T_ARRAY : // fall through
   735       case T_ARRAY : // fall through
   737       case T_OBJECT: __ ld_ptr(s, disp, d); break;
   736       case T_OBJECT: __ ld_ptr(s, disp, d); break;
   738       default      : ShouldNotReachHere();
   737       default      : ShouldNotReachHere();
   739     }
   738     }
   740   } else {
   739   } else {
   741     __ sethi(disp & ~0x3ff, O7, true);
   740     __ set(disp, O7);
   742     __ add(O7, disp & 0x3ff, O7);
       
   743     if (info != NULL) add_debug_info_for_null_check_here(info);
   741     if (info != NULL) add_debug_info_for_null_check_here(info);
   744     load_offset = code_offset();
   742     load_offset = code_offset();
   745     switch(ld_type) {
   743     switch(ld_type) {
   746       case T_BOOLEAN: // fall through
   744       case T_BOOLEAN: // fall through
   747       case T_BYTE  : __ ldsb(s, O7, d); break;
   745       case T_BYTE  : __ ldsb(s, O7, d); break;
   773       case T_ARRAY : // fall through
   771       case T_ARRAY : // fall through
   774       case T_OBJECT: __ st_ptr(value, base, offset); break;
   772       case T_OBJECT: __ st_ptr(value, base, offset); break;
   775       default      : ShouldNotReachHere();
   773       default      : ShouldNotReachHere();
   776     }
   774     }
   777   } else {
   775   } else {
   778     __ sethi(offset & ~0x3ff, O7, true);
   776     __ set(offset, O7);
   779     __ add(O7, offset & 0x3ff, O7);
       
   780     if (info != NULL) add_debug_info_for_null_check_here(info);
   777     if (info != NULL) add_debug_info_for_null_check_here(info);
   781     switch (type) {
   778     switch (type) {
   782       case T_BOOLEAN: // fall through
   779       case T_BOOLEAN: // fall through
   783       case T_BYTE  : __ stb(value, base, O7); break;
   780       case T_BYTE  : __ stb(value, base, O7); break;
   784       case T_CHAR  : __ sth(value, base, O7); break;
   781       case T_CHAR  : __ sth(value, base, O7); break;
   811       __ ldf(FloatRegisterImpl::S, s, disp               , d);
   808       __ ldf(FloatRegisterImpl::S, s, disp               , d);
   812     } else {
   809     } else {
   813       __ ldf(w, s, disp, d);
   810       __ ldf(w, s, disp, d);
   814     }
   811     }
   815   } else {
   812   } else {
   816     __ sethi(disp & ~0x3ff, O7, true);
   813     __ set(disp, O7);
   817     __ add(O7, disp & 0x3ff, O7);
       
   818     if (info != NULL) add_debug_info_for_null_check_here(info);
   814     if (info != NULL) add_debug_info_for_null_check_here(info);
   819     __ ldf(w, s, O7, d);
   815     __ ldf(w, s, O7, d);
   820   }
   816   }
   821 }
   817 }
   822 
   818 
   837       __ stf(FloatRegisterImpl::S, value             , base, offset);
   833       __ stf(FloatRegisterImpl::S, value             , base, offset);
   838     } else {
   834     } else {
   839       __ stf(w, value, base, offset);
   835       __ stf(w, value, base, offset);
   840     }
   836     }
   841   } else {
   837   } else {
   842     __ sethi(offset & ~0x3ff, O7, true);
   838     __ set(offset, O7);
   843     __ add(O7, offset & 0x3ff, O7);
       
   844     if (info != NULL) add_debug_info_for_null_check_here(info);
   839     if (info != NULL) add_debug_info_for_null_check_here(info);
   845     __ stf(w, value, O7, base);
   840     __ stf(w, value, O7, base);
   846   }
   841   }
   847 }
   842 }
   848 
   843 
   850 int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool unaligned) {
   845 int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool unaligned) {
   851   int store_offset;
   846   int store_offset;
   852   if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
   847   if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
   853     assert(!unaligned, "can't handle this");
   848     assert(!unaligned, "can't handle this");
   854     // for offsets larger than a simm13 we setup the offset in O7
   849     // for offsets larger than a simm13 we setup the offset in O7
   855     __ sethi(offset & ~0x3ff, O7, true);
   850     __ set(offset, O7);
   856     __ add(O7, offset & 0x3ff, O7);
       
   857     store_offset = store(from_reg, base, O7, type);
   851     store_offset = store(from_reg, base, O7, type);
   858   } else {
   852   } else {
   859     if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register());
   853     if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register());
   860     store_offset = code_offset();
   854     store_offset = code_offset();
   861     switch (type) {
   855     switch (type) {
   935   int load_offset;
   929   int load_offset;
   936   if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
   930   if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
   937     assert(base != O7, "destroying register");
   931     assert(base != O7, "destroying register");
   938     assert(!unaligned, "can't handle this");
   932     assert(!unaligned, "can't handle this");
   939     // for offsets larger than a simm13 we setup the offset in O7
   933     // for offsets larger than a simm13 we setup the offset in O7
   940     __ sethi(offset & ~0x3ff, O7, true);
   934     __ set(offset, O7);
   941     __ add(O7, offset & 0x3ff, O7);
       
   942     load_offset = load(base, O7, to_reg, type);
   935     load_offset = load(base, O7, to_reg, type);
   943   } else {
   936   } else {
   944     load_offset = code_offset();
   937     load_offset = code_offset();
   945     switch(type) {
   938     switch(type) {
   946       case T_BOOLEAN: // fall through
   939       case T_BOOLEAN: // fall through
  1211         } else {
  1204         } else {
  1212           ShouldNotReachHere();
  1205           ShouldNotReachHere();
  1213           assert(to_reg->is_single_fpu(), "wrong register kind");
  1206           assert(to_reg->is_single_fpu(), "wrong register kind");
  1214 
  1207 
  1215           __ set(con, O7);
  1208           __ set(con, O7);
  1216           Address temp_slot(SP, 0, (frame::register_save_words * wordSize) + STACK_BIAS);
  1209           Address temp_slot(SP, (frame::register_save_words * wordSize) + STACK_BIAS);
  1217           __ st(O7, temp_slot);
  1210           __ st(O7, temp_slot);
  1218           __ ldf(FloatRegisterImpl::S, temp_slot, to_reg->as_float_reg());
  1211           __ ldf(FloatRegisterImpl::S, temp_slot, to_reg->as_float_reg());
  1219         }
  1212         }
  1220       }
  1213       }
  1221       break;
  1214       break;
  1236           __ set(con, to_reg->as_register());
  1229           __ set(con, to_reg->as_register());
  1237 #endif
  1230 #endif
  1238         } else {
  1231         } else {
  1239           ShouldNotReachHere();
  1232           ShouldNotReachHere();
  1240           assert(to_reg->is_double_fpu(), "wrong register kind");
  1233           assert(to_reg->is_double_fpu(), "wrong register kind");
  1241           Address temp_slot_lo(SP, 0, ((frame::register_save_words  ) * wordSize) + STACK_BIAS);
  1234           Address temp_slot_lo(SP, ((frame::register_save_words  ) * wordSize) + STACK_BIAS);
  1242           Address temp_slot_hi(SP, 0, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS);
  1235           Address temp_slot_hi(SP, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS);
  1243           __ set(low(con),  O7);
  1236           __ set(low(con),  O7);
  1244           __ st(O7, temp_slot_lo);
  1237           __ st(O7, temp_slot_lo);
  1245           __ set(high(con), O7);
  1238           __ set(high(con), O7);
  1246           __ st(O7, temp_slot_hi);
  1239           __ st(O7, temp_slot_hi);
  1247           __ ldf(FloatRegisterImpl::D, temp_slot_lo, to_reg->as_double_reg());
  1240           __ ldf(FloatRegisterImpl::D, temp_slot_lo, to_reg->as_double_reg());
  1265         if (const_addr == NULL) {
  1258         if (const_addr == NULL) {
  1266           bailout("const section overflow");
  1259           bailout("const section overflow");
  1267           break;
  1260           break;
  1268         }
  1261         }
  1269         RelocationHolder rspec = internal_word_Relocation::spec(const_addr);
  1262         RelocationHolder rspec = internal_word_Relocation::spec(const_addr);
       
  1263         AddressLiteral const_addrlit(const_addr, rspec);
  1270         if (to_reg->is_single_fpu()) {
  1264         if (to_reg->is_single_fpu()) {
  1271           __ sethi(  (intx)const_addr & ~0x3ff, O7, true, rspec);
  1265           __ patchable_sethi(const_addrlit, O7);
  1272           __ relocate(rspec);
  1266           __ relocate(rspec);
  1273 
  1267           __ ldf(FloatRegisterImpl::S, O7, const_addrlit.low10(), to_reg->as_float_reg());
  1274           int offset = (intx)const_addr & 0x3ff;
       
  1275           __ ldf (FloatRegisterImpl::S, O7, offset, to_reg->as_float_reg());
       
  1276 
  1268 
  1277         } else {
  1269         } else {
  1278           assert(to_reg->is_single_cpu(), "Must be a cpu register.");
  1270           assert(to_reg->is_single_cpu(), "Must be a cpu register.");
  1279 
  1271 
  1280           __ set((intx)const_addr, O7, rspec);
  1272           __ set(const_addrlit, O7);
  1281           load(O7, 0, to_reg->as_register(), T_INT);
  1273           load(O7, 0, to_reg->as_register(), T_INT);
  1282         }
  1274         }
  1283       }
  1275       }
  1284       break;
  1276       break;
  1285 
  1277 
  1291           break;
  1283           break;
  1292         }
  1284         }
  1293         RelocationHolder rspec = internal_word_Relocation::spec(const_addr);
  1285         RelocationHolder rspec = internal_word_Relocation::spec(const_addr);
  1294 
  1286 
  1295         if (to_reg->is_double_fpu()) {
  1287         if (to_reg->is_double_fpu()) {
  1296           __ sethi(  (intx)const_addr & ~0x3ff, O7, true, rspec);
  1288           AddressLiteral const_addrlit(const_addr, rspec);
  1297           int offset = (intx)const_addr & 0x3ff;
  1289           __ patchable_sethi(const_addrlit, O7);
  1298           __ relocate(rspec);
  1290           __ relocate(rspec);
  1299           __ ldf (FloatRegisterImpl::D, O7, offset, to_reg->as_double_reg());
  1291           __ ldf (FloatRegisterImpl::D, O7, const_addrlit.low10(), to_reg->as_double_reg());
  1300         } else {
  1292         } else {
  1301           assert(to_reg->is_double_cpu(), "Must be a long register.");
  1293           assert(to_reg->is_double_cpu(), "Must be a long register.");
  1302 #ifdef _LP64
  1294 #ifdef _LP64
  1303           __ set(jlong_cast(c->as_jdouble()), to_reg->as_register_lo());
  1295           __ set(jlong_cast(c->as_jdouble()), to_reg->as_register_lo());
  1304 #else
  1296 #else
  1315   }
  1307   }
  1316 }
  1308 }
  1317 
  1309 
  1318 Address LIR_Assembler::as_Address(LIR_Address* addr) {
  1310 Address LIR_Assembler::as_Address(LIR_Address* addr) {
  1319   Register reg = addr->base()->as_register();
  1311   Register reg = addr->base()->as_register();
  1320   return Address(reg, 0, addr->disp());
  1312   return Address(reg, addr->disp());
  1321 }
  1313 }
  1322 
  1314 
  1323 
  1315 
  1324 void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) {
  1316 void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) {
  1325   switch (type) {
  1317   switch (type) {
  1358 }
  1350 }
  1359 
  1351 
  1360 
  1352 
  1361 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) {
  1353 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) {
  1362   Address base = as_Address(addr);
  1354   Address base = as_Address(addr);
  1363   return Address(base.base(), 0, base.disp() + hi_word_offset_in_bytes);
  1355   return Address(base.base(), base.disp() + hi_word_offset_in_bytes);
  1364 }
  1356 }
  1365 
  1357 
  1366 
  1358 
  1367 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
  1359 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
  1368   Address base = as_Address(addr);
  1360   Address base = as_Address(addr);
  1369   return Address(base.base(), 0, base.disp() + lo_word_offset_in_bytes);
  1361   return Address(base.base(), base.disp() + lo_word_offset_in_bytes);
  1370 }
  1362 }
  1371 
  1363 
  1372 
  1364 
  1373 void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type,
  1365 void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type,
  1374                             LIR_PatchCode patch_code, CodeEmitInfo* info, bool unaligned) {
  1366                             LIR_PatchCode patch_code, CodeEmitInfo* info, bool unaligned) {
  1394   }
  1386   }
  1395 
  1387 
  1396   if (addr->index()->is_illegal()) {
  1388   if (addr->index()->is_illegal()) {
  1397     if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) {
  1389     if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) {
  1398       if (needs_patching) {
  1390       if (needs_patching) {
  1399         __ sethi(0, O7, true);
  1391         __ patchable_set(0, O7);
  1400         __ add(O7, 0, O7);
       
  1401       } else {
  1392       } else {
  1402         __ set(disp_value, O7);
  1393         __ set(disp_value, O7);
  1403       }
  1394       }
  1404       disp_reg = O7;
  1395       disp_reg = O7;
  1405     }
  1396     }
  1542   }
  1533   }
  1543 
  1534 
  1544   if (addr->index()->is_illegal()) {
  1535   if (addr->index()->is_illegal()) {
  1545     if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) {
  1536     if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) {
  1546       if (needs_patching) {
  1537       if (needs_patching) {
  1547         __ sethi(0, O7, true);
  1538         __ patchable_set(0, O7);
  1548         __ add(O7, 0, O7);
       
  1549       } else {
  1539       } else {
  1550         __ set(disp_value, O7);
  1540         __ set(disp_value, O7);
  1551       }
  1541       }
  1552       disp_reg = O7;
  1542       disp_reg = O7;
  1553     }
  1543     }
  1625   int start = __ offset();
  1615   int start = __ offset();
  1626   __ relocate(static_stub_Relocation::spec(call_pc));
  1616   __ relocate(static_stub_Relocation::spec(call_pc));
  1627 
  1617 
  1628   __ set_oop(NULL, G5);
  1618   __ set_oop(NULL, G5);
  1629   // must be set to -1 at code generation time
  1619   // must be set to -1 at code generation time
  1630   Address a(G3, (address)-1);
  1620   AddressLiteral addrlit(-1);
  1631   __ jump_to(a, 0);
  1621   __ jump_to(addrlit, G3);
  1632   __ delayed()->nop();
  1622   __ delayed()->nop();
  1633 
  1623 
  1634   assert(__ offset() - start <= call_stub_size, "stub too big");
  1624   assert(__ offset() - start <= call_stub_size, "stub too big");
  1635   __ end_a_stub();
  1625   __ end_a_stub();
  1636 }
  1626 }
  2061   } else {
  2051   } else {
  2062     // reuse the debug info from the safepoint poll for the throw op itself
  2052     // reuse the debug info from the safepoint poll for the throw op itself
  2063     address pc_for_athrow  = __ pc();
  2053     address pc_for_athrow  = __ pc();
  2064     int pc_for_athrow_offset = __ offset();
  2054     int pc_for_athrow_offset = __ offset();
  2065     RelocationHolder rspec = internal_word_Relocation::spec(pc_for_athrow);
  2055     RelocationHolder rspec = internal_word_Relocation::spec(pc_for_athrow);
  2066     __ set((intptr_t)pc_for_athrow, Oissuing_pc, rspec);
  2056     __ set(pc_for_athrow, Oissuing_pc, rspec);
  2067     add_call_info(pc_for_athrow_offset, info); // for exception handler
  2057     add_call_info(pc_for_athrow_offset, info); // for exception handler
  2068 
  2058 
  2069     __ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type);
  2059     __ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type);
  2070     __ delayed()->nop();
  2060     __ delayed()->nop();
  2071   }
  2061   }
  2449         __ set(mdo_offset_bias, data_val);
  2439         __ set(mdo_offset_bias, data_val);
  2450         __ add(mdo, data_val, mdo);
  2440         __ add(mdo, data_val, mdo);
  2451       }
  2441       }
  2452 
  2442 
  2453 
  2443 
  2454       Address flags_addr(mdo, 0, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias);
  2444       Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias);
  2455       __ ldub(flags_addr, data_val);
  2445       __ ldub(flags_addr, data_val);
  2456       __ or3(data_val, BitData::null_seen_byte_constant(), data_val);
  2446       __ or3(data_val, BitData::null_seen_byte_constant(), data_val);
  2457       __ stb(data_val, flags_addr);
  2447       __ stb(data_val, flags_addr);
  2458       __ bind(profile_done);
  2448       __ bind(profile_done);
  2459     }
  2449     }
  2736     mdo_offset_bias = md->byte_offset_of_slot(data, CounterData::count_offset());
  2726     mdo_offset_bias = md->byte_offset_of_slot(data, CounterData::count_offset());
  2737     __ set(mdo_offset_bias, O7);
  2727     __ set(mdo_offset_bias, O7);
  2738     __ add(mdo, O7, mdo);
  2728     __ add(mdo, O7, mdo);
  2739   }
  2729   }
  2740 
  2730 
  2741   Address counter_addr(mdo, 0, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias);
  2731   Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias);
  2742   __ lduw(counter_addr, tmp1);
  2732   __ lduw(counter_addr, tmp1);
  2743   __ add(tmp1, DataLayout::counter_increment, tmp1);
  2733   __ add(tmp1, DataLayout::counter_increment, tmp1);
  2744   __ stw(tmp1, counter_addr);
  2734   __ stw(tmp1, counter_addr);
  2745   Bytecodes::Code bc = method->java_code_at_bci(bci);
  2735   Bytecodes::Code bc = method->java_code_at_bci(bci);
  2746   // Perform additional virtual call profiling for invokevirtual and
  2736   // Perform additional virtual call profiling for invokevirtual and
  2762       ciVirtualCallData* vc_data = (ciVirtualCallData*) data;
  2752       ciVirtualCallData* vc_data = (ciVirtualCallData*) data;
  2763       uint i;
  2753       uint i;
  2764       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2754       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2765         ciKlass* receiver = vc_data->receiver(i);
  2755         ciKlass* receiver = vc_data->receiver(i);
  2766         if (known_klass->equals(receiver)) {
  2756         if (known_klass->equals(receiver)) {
  2767           Address data_addr(mdo, 0, md->byte_offset_of_slot(data,
  2757           Address data_addr(mdo, md->byte_offset_of_slot(data,
  2768                                                             VirtualCallData::receiver_count_offset(i)) -
  2758                                                          VirtualCallData::receiver_count_offset(i)) -
  2769                             mdo_offset_bias);
  2759                             mdo_offset_bias);
  2770           __ lduw(data_addr, tmp1);
  2760           __ lduw(data_addr, tmp1);
  2771           __ add(tmp1, DataLayout::counter_increment, tmp1);
  2761           __ add(tmp1, DataLayout::counter_increment, tmp1);
  2772           __ stw(tmp1, data_addr);
  2762           __ stw(tmp1, data_addr);
  2773           return;
  2763           return;
  2780       // always does a write to the receiver part of the
  2770       // always does a write to the receiver part of the
  2781       // VirtualCallData rather than just the first time
  2771       // VirtualCallData rather than just the first time
  2782       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2772       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2783         ciKlass* receiver = vc_data->receiver(i);
  2773         ciKlass* receiver = vc_data->receiver(i);
  2784         if (receiver == NULL) {
  2774         if (receiver == NULL) {
  2785           Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
  2775           Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
  2786                             mdo_offset_bias);
  2776                             mdo_offset_bias);
  2787           jobject2reg(known_klass->encoding(), tmp1);
  2777           jobject2reg(known_klass->encoding(), tmp1);
  2788           __ st_ptr(tmp1, recv_addr);
  2778           __ st_ptr(tmp1, recv_addr);
  2789           Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
  2779           Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
  2790                             mdo_offset_bias);
  2780                             mdo_offset_bias);
  2791           __ lduw(data_addr, tmp1);
  2781           __ lduw(data_addr, tmp1);
  2792           __ add(tmp1, DataLayout::counter_increment, tmp1);
  2782           __ add(tmp1, DataLayout::counter_increment, tmp1);
  2793           __ stw(tmp1, data_addr);
  2783           __ stw(tmp1, data_addr);
  2794           return;
  2784           return;
  2795         }
  2785         }
  2796       }
  2786       }
  2797     } else {
  2787     } else {
  2798       load(Address(recv, 0, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
  2788       load(Address(recv, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT);
  2799       Label update_done;
  2789       Label update_done;
  2800       uint i;
  2790       uint i;
  2801       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2791       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2802         Label next_test;
  2792         Label next_test;
  2803         // See if the receiver is receiver[n].
  2793         // See if the receiver is receiver[n].
  2804         Address receiver_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
  2794         Address receiver_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
  2805                               mdo_offset_bias);
  2795                               mdo_offset_bias);
  2806         __ ld_ptr(receiver_addr, tmp1);
  2796         __ ld_ptr(receiver_addr, tmp1);
  2807         __ verify_oop(tmp1);
  2797         __ verify_oop(tmp1);
  2808         __ cmp(recv, tmp1);
  2798         __ cmp(recv, tmp1);
  2809         __ brx(Assembler::notEqual, false, Assembler::pt, next_test);
  2799         __ brx(Assembler::notEqual, false, Assembler::pt, next_test);
  2810         __ delayed()->nop();
  2800         __ delayed()->nop();
  2811         Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
  2801         Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
  2812                           mdo_offset_bias);
  2802                           mdo_offset_bias);
  2813         __ lduw(data_addr, tmp1);
  2803         __ lduw(data_addr, tmp1);
  2814         __ add(tmp1, DataLayout::counter_increment, tmp1);
  2804         __ add(tmp1, DataLayout::counter_increment, tmp1);
  2815         __ stw(tmp1, data_addr);
  2805         __ stw(tmp1, data_addr);
  2816         __ br(Assembler::always, false, Assembler::pt, update_done);
  2806         __ br(Assembler::always, false, Assembler::pt, update_done);
  2819       }
  2809       }
  2820 
  2810 
  2821       // Didn't find receiver; find next empty slot and fill it in
  2811       // Didn't find receiver; find next empty slot and fill it in
  2822       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2812       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  2823         Label next_test;
  2813         Label next_test;
  2824         Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
  2814         Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) -
  2825                           mdo_offset_bias);
  2815                           mdo_offset_bias);
  2826         load(recv_addr, tmp1, T_OBJECT);
  2816         load(recv_addr, tmp1, T_OBJECT);
  2827         __ tst(tmp1);
  2817         __ tst(tmp1);
  2828         __ brx(Assembler::notEqual, false, Assembler::pt, next_test);
  2818         __ brx(Assembler::notEqual, false, Assembler::pt, next_test);
  2829         __ delayed()->nop();
  2819         __ delayed()->nop();
  2830         __ st_ptr(recv, recv_addr);
  2820         __ st_ptr(recv, recv_addr);
  2831         __ set(DataLayout::counter_increment, tmp1);
  2821         __ set(DataLayout::counter_increment, tmp1);
  2832         __ st_ptr(tmp1, Address(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
  2822         __ st_ptr(tmp1, mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) -
  2833                                 mdo_offset_bias));
  2823                   mdo_offset_bias);
  2834         if (i < (VirtualCallData::row_limit() - 1)) {
  2824         if (i < (VirtualCallData::row_limit() - 1)) {
  2835           __ br(Assembler::always, false, Assembler::pt, update_done);
  2825           __ br(Assembler::always, false, Assembler::pt, update_done);
  2836           __ delayed()->nop();
  2826           __ delayed()->nop();
  2837         }
  2827         }
  2838         __ bind(next_test);
  2828         __ bind(next_test);