1.1 --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Apr 20 14:48:03 2009 -0700 1.2 +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Apr 21 11:16:30 2009 -0700 1.3 @@ -196,7 +196,7 @@ 1.4 // verify the interpreter's monitor has a non-null object 1.5 { 1.6 Label L; 1.7 - __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7); 1.8 + __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7); 1.9 __ cmp(G0, O7); 1.10 __ br(Assembler::notEqual, false, Assembler::pt, L); 1.11 __ delayed()->nop(); 1.12 @@ -205,9 +205,9 @@ 1.13 } 1.14 #endif // ASSERT 1.15 // Copy the lock field into the compiled activation. 1.16 - __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::lock_offset_in_bytes()), O7); 1.17 + __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::lock_offset_in_bytes(), O7); 1.18 __ st_ptr(O7, frame_map()->address_for_monitor_lock(i)); 1.19 - __ ld_ptr(Address(OSR_buf, 0, slot_offset + BasicObjectLock::obj_offset_in_bytes()), O7); 1.20 + __ ld_ptr(OSR_buf, slot_offset + BasicObjectLock::obj_offset_in_bytes(), O7); 1.21 __ st_ptr(O7, frame_map()->address_for_monitor_object(i)); 1.22 } 1.23 } 1.24 @@ -238,21 +238,21 @@ 1.25 int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position 1.26 int count_offset = java_lang_String:: count_offset_in_bytes(); 1.27 1.28 - __ ld_ptr(Address(str0, 0, value_offset), tmp0); 1.29 - __ ld(Address(str0, 0, offset_offset), tmp2); 1.30 + __ ld_ptr(str0, value_offset, tmp0); 1.31 + __ ld(str0, offset_offset, tmp2); 1.32 __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); 1.33 - __ ld(Address(str0, 0, count_offset), str0); 1.34 + __ ld(str0, count_offset, str0); 1.35 __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); 1.36 1.37 // str1 may be null 1.38 add_debug_info_for_null_check_here(info); 1.39 1.40 - __ ld_ptr(Address(str1, 0, value_offset), tmp1); 1.41 + __ ld_ptr(str1, value_offset, tmp1); 1.42 __ add(tmp0, tmp2, tmp0); 1.43 1.44 - __ ld(Address(str1, 0, offset_offset), tmp2); 1.45 + __ ld(str1, offset_offset, tmp2); 1.46 __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); 1.47 - __ ld(Address(str1, 0, count_offset), str1); 1.48 + __ ld(str1, count_offset, str1); 1.49 __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); 1.50 __ subcc(str0, str1, O7); 1.51 __ add(tmp1, tmp2, tmp1); 1.52 @@ -412,9 +412,9 @@ 1.53 #endif // ASSERT 1.54 compilation()->offsets()->set_value(CodeOffsets::Deopt, code_offset()); 1.55 1.56 - Address deopt_blob(G3_scratch, SharedRuntime::deopt_blob()->unpack()); 1.57 - 1.58 - __ JUMP(deopt_blob, 0); // sethi;jmp 1.59 + AddressLiteral deopt_blob(SharedRuntime::deopt_blob()->unpack()); 1.60 + 1.61 + __ JUMP(deopt_blob, G3_scratch, 0); // sethi;jmp 1.62 __ delayed()->nop(); 1.63 1.64 assert(code_offset() - offset <= deopt_handler_size, "overflow"); 1.65 @@ -441,13 +441,12 @@ 1.66 int oop_index = __ oop_recorder()->allocate_index((jobject)NULL); 1.67 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id, oop_index); 1.68 1.69 - Address addr = Address(reg, address(NULL), oop_Relocation::spec(oop_index)); 1.70 - assert(addr.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); 1.71 + AddressLiteral addrlit(NULL, oop_Relocation::spec(oop_index)); 1.72 + assert(addrlit.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); 1.73 // It may not seem necessary to use a sethi/add pair to load a NULL into dest, but the 1.74 // NULL will be dynamically patched later and the patched value may be large. We must 1.75 // therefore generate the sethi/add as a placeholders 1.76 - __ sethi(addr, true); 1.77 - __ add(addr, reg, 0); 1.78 + __ patchable_set(addrlit, reg); 1.79 1.80 patching_epilog(patch, lir_patch_normal, reg, info); 1.81 } 1.82 @@ -706,7 +705,7 @@ 1.83 1.84 void LIR_Assembler::vtable_call(int vtable_offset, CodeEmitInfo* info) { 1.85 add_debug_info_for_null_check_here(info); 1.86 - __ ld_ptr(Address(O0, 0, oopDesc::klass_offset_in_bytes()), G3_scratch); 1.87 + __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_scratch); 1.88 if (__ is_simm13(vtable_offset) ) { 1.89 __ ld_ptr(G3_scratch, vtable_offset, G5_method); 1.90 } else { 1.91 @@ -715,7 +714,7 @@ 1.92 // ld_ptr, set_hi, set 1.93 __ ld_ptr(G3_scratch, G5_method, G5_method); 1.94 } 1.95 - __ ld_ptr(G5_method, in_bytes(methodOopDesc::from_compiled_offset()), G3_scratch); 1.96 + __ ld_ptr(G5_method, methodOopDesc::from_compiled_offset(), G3_scratch); 1.97 __ callr(G3_scratch, G0); 1.98 // the peephole pass fills the delay slot 1.99 } 1.100 @@ -738,8 +737,7 @@ 1.101 default : ShouldNotReachHere(); 1.102 } 1.103 } else { 1.104 - __ sethi(disp & ~0x3ff, O7, true); 1.105 - __ add(O7, disp & 0x3ff, O7); 1.106 + __ set(disp, O7); 1.107 if (info != NULL) add_debug_info_for_null_check_here(info); 1.108 load_offset = code_offset(); 1.109 switch(ld_type) { 1.110 @@ -775,8 +773,7 @@ 1.111 default : ShouldNotReachHere(); 1.112 } 1.113 } else { 1.114 - __ sethi(offset & ~0x3ff, O7, true); 1.115 - __ add(O7, offset & 0x3ff, O7); 1.116 + __ set(offset, O7); 1.117 if (info != NULL) add_debug_info_for_null_check_here(info); 1.118 switch (type) { 1.119 case T_BOOLEAN: // fall through 1.120 @@ -813,8 +810,7 @@ 1.121 __ ldf(w, s, disp, d); 1.122 } 1.123 } else { 1.124 - __ sethi(disp & ~0x3ff, O7, true); 1.125 - __ add(O7, disp & 0x3ff, O7); 1.126 + __ set(disp, O7); 1.127 if (info != NULL) add_debug_info_for_null_check_here(info); 1.128 __ ldf(w, s, O7, d); 1.129 } 1.130 @@ -839,8 +835,7 @@ 1.131 __ stf(w, value, base, offset); 1.132 } 1.133 } else { 1.134 - __ sethi(offset & ~0x3ff, O7, true); 1.135 - __ add(O7, offset & 0x3ff, O7); 1.136 + __ set(offset, O7); 1.137 if (info != NULL) add_debug_info_for_null_check_here(info); 1.138 __ stf(w, value, O7, base); 1.139 } 1.140 @@ -852,8 +847,7 @@ 1.141 if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) { 1.142 assert(!unaligned, "can't handle this"); 1.143 // for offsets larger than a simm13 we setup the offset in O7 1.144 - __ sethi(offset & ~0x3ff, O7, true); 1.145 - __ add(O7, offset & 0x3ff, O7); 1.146 + __ set(offset, O7); 1.147 store_offset = store(from_reg, base, O7, type); 1.148 } else { 1.149 if (type == T_ARRAY || type == T_OBJECT) __ verify_oop(from_reg->as_register()); 1.150 @@ -937,8 +931,7 @@ 1.151 assert(base != O7, "destroying register"); 1.152 assert(!unaligned, "can't handle this"); 1.153 // for offsets larger than a simm13 we setup the offset in O7 1.154 - __ sethi(offset & ~0x3ff, O7, true); 1.155 - __ add(O7, offset & 0x3ff, O7); 1.156 + __ set(offset, O7); 1.157 load_offset = load(base, O7, to_reg, type); 1.158 } else { 1.159 load_offset = code_offset(); 1.160 @@ -1213,7 +1206,7 @@ 1.161 assert(to_reg->is_single_fpu(), "wrong register kind"); 1.162 1.163 __ set(con, O7); 1.164 - Address temp_slot(SP, 0, (frame::register_save_words * wordSize) + STACK_BIAS); 1.165 + Address temp_slot(SP, (frame::register_save_words * wordSize) + STACK_BIAS); 1.166 __ st(O7, temp_slot); 1.167 __ ldf(FloatRegisterImpl::S, temp_slot, to_reg->as_float_reg()); 1.168 } 1.169 @@ -1238,8 +1231,8 @@ 1.170 } else { 1.171 ShouldNotReachHere(); 1.172 assert(to_reg->is_double_fpu(), "wrong register kind"); 1.173 - Address temp_slot_lo(SP, 0, ((frame::register_save_words ) * wordSize) + STACK_BIAS); 1.174 - Address temp_slot_hi(SP, 0, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS); 1.175 + Address temp_slot_lo(SP, ((frame::register_save_words ) * wordSize) + STACK_BIAS); 1.176 + Address temp_slot_hi(SP, ((frame::register_save_words) * wordSize) + (longSize/2) + STACK_BIAS); 1.177 __ set(low(con), O7); 1.178 __ st(O7, temp_slot_lo); 1.179 __ set(high(con), O7); 1.180 @@ -1267,17 +1260,16 @@ 1.181 break; 1.182 } 1.183 RelocationHolder rspec = internal_word_Relocation::spec(const_addr); 1.184 + AddressLiteral const_addrlit(const_addr, rspec); 1.185 if (to_reg->is_single_fpu()) { 1.186 - __ sethi( (intx)const_addr & ~0x3ff, O7, true, rspec); 1.187 + __ patchable_sethi(const_addrlit, O7); 1.188 __ relocate(rspec); 1.189 - 1.190 - int offset = (intx)const_addr & 0x3ff; 1.191 - __ ldf (FloatRegisterImpl::S, O7, offset, to_reg->as_float_reg()); 1.192 + __ ldf(FloatRegisterImpl::S, O7, const_addrlit.low10(), to_reg->as_float_reg()); 1.193 1.194 } else { 1.195 assert(to_reg->is_single_cpu(), "Must be a cpu register."); 1.196 1.197 - __ set((intx)const_addr, O7, rspec); 1.198 + __ set(const_addrlit, O7); 1.199 load(O7, 0, to_reg->as_register(), T_INT); 1.200 } 1.201 } 1.202 @@ -1293,10 +1285,10 @@ 1.203 RelocationHolder rspec = internal_word_Relocation::spec(const_addr); 1.204 1.205 if (to_reg->is_double_fpu()) { 1.206 - __ sethi( (intx)const_addr & ~0x3ff, O7, true, rspec); 1.207 - int offset = (intx)const_addr & 0x3ff; 1.208 + AddressLiteral const_addrlit(const_addr, rspec); 1.209 + __ patchable_sethi(const_addrlit, O7); 1.210 __ relocate(rspec); 1.211 - __ ldf (FloatRegisterImpl::D, O7, offset, to_reg->as_double_reg()); 1.212 + __ ldf (FloatRegisterImpl::D, O7, const_addrlit.low10(), to_reg->as_double_reg()); 1.213 } else { 1.214 assert(to_reg->is_double_cpu(), "Must be a long register."); 1.215 #ifdef _LP64 1.216 @@ -1317,7 +1309,7 @@ 1.217 1.218 Address LIR_Assembler::as_Address(LIR_Address* addr) { 1.219 Register reg = addr->base()->as_register(); 1.220 - return Address(reg, 0, addr->disp()); 1.221 + return Address(reg, addr->disp()); 1.222 } 1.223 1.224 1.225 @@ -1360,13 +1352,13 @@ 1.226 1.227 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) { 1.228 Address base = as_Address(addr); 1.229 - return Address(base.base(), 0, base.disp() + hi_word_offset_in_bytes); 1.230 + return Address(base.base(), base.disp() + hi_word_offset_in_bytes); 1.231 } 1.232 1.233 1.234 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) { 1.235 Address base = as_Address(addr); 1.236 - return Address(base.base(), 0, base.disp() + lo_word_offset_in_bytes); 1.237 + return Address(base.base(), base.disp() + lo_word_offset_in_bytes); 1.238 } 1.239 1.240 1.241 @@ -1396,8 +1388,7 @@ 1.242 if (addr->index()->is_illegal()) { 1.243 if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) { 1.244 if (needs_patching) { 1.245 - __ sethi(0, O7, true); 1.246 - __ add(O7, 0, O7); 1.247 + __ patchable_set(0, O7); 1.248 } else { 1.249 __ set(disp_value, O7); 1.250 } 1.251 @@ -1544,8 +1535,7 @@ 1.252 if (addr->index()->is_illegal()) { 1.253 if (!Assembler::is_simm13(disp_value) && (!unaligned || Assembler::is_simm13(disp_value + 4))) { 1.254 if (needs_patching) { 1.255 - __ sethi(0, O7, true); 1.256 - __ add(O7, 0, O7); 1.257 + __ patchable_set(0, O7); 1.258 } else { 1.259 __ set(disp_value, O7); 1.260 } 1.261 @@ -1627,8 +1617,8 @@ 1.262 1.263 __ set_oop(NULL, G5); 1.264 // must be set to -1 at code generation time 1.265 - Address a(G3, (address)-1); 1.266 - __ jump_to(a, 0); 1.267 + AddressLiteral addrlit(-1); 1.268 + __ jump_to(addrlit, G3); 1.269 __ delayed()->nop(); 1.270 1.271 assert(__ offset() - start <= call_stub_size, "stub too big"); 1.272 @@ -2063,7 +2053,7 @@ 1.273 address pc_for_athrow = __ pc(); 1.274 int pc_for_athrow_offset = __ offset(); 1.275 RelocationHolder rspec = internal_word_Relocation::spec(pc_for_athrow); 1.276 - __ set((intptr_t)pc_for_athrow, Oissuing_pc, rspec); 1.277 + __ set(pc_for_athrow, Oissuing_pc, rspec); 1.278 add_call_info(pc_for_athrow_offset, info); // for exception handler 1.279 1.280 __ call(Runtime1::entry_for(Runtime1::handle_exception_id), relocInfo::runtime_call_type); 1.281 @@ -2451,7 +2441,7 @@ 1.282 } 1.283 1.284 1.285 - Address flags_addr(mdo, 0, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); 1.286 + Address flags_addr(mdo, md->byte_offset_of_slot(data, DataLayout::flags_offset()) - mdo_offset_bias); 1.287 __ ldub(flags_addr, data_val); 1.288 __ or3(data_val, BitData::null_seen_byte_constant(), data_val); 1.289 __ stb(data_val, flags_addr); 1.290 @@ -2738,7 +2728,7 @@ 1.291 __ add(mdo, O7, mdo); 1.292 } 1.293 1.294 - Address counter_addr(mdo, 0, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); 1.295 + Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()) - mdo_offset_bias); 1.296 __ lduw(counter_addr, tmp1); 1.297 __ add(tmp1, DataLayout::counter_increment, tmp1); 1.298 __ stw(tmp1, counter_addr); 1.299 @@ -2764,8 +2754,8 @@ 1.300 for (i = 0; i < VirtualCallData::row_limit(); i++) { 1.301 ciKlass* receiver = vc_data->receiver(i); 1.302 if (known_klass->equals(receiver)) { 1.303 - Address data_addr(mdo, 0, md->byte_offset_of_slot(data, 1.304 - VirtualCallData::receiver_count_offset(i)) - 1.305 + Address data_addr(mdo, md->byte_offset_of_slot(data, 1.306 + VirtualCallData::receiver_count_offset(i)) - 1.307 mdo_offset_bias); 1.308 __ lduw(data_addr, tmp1); 1.309 __ add(tmp1, DataLayout::counter_increment, tmp1); 1.310 @@ -2782,11 +2772,11 @@ 1.311 for (i = 0; i < VirtualCallData::row_limit(); i++) { 1.312 ciKlass* receiver = vc_data->receiver(i); 1.313 if (receiver == NULL) { 1.314 - Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - 1.315 + Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - 1.316 mdo_offset_bias); 1.317 jobject2reg(known_klass->encoding(), tmp1); 1.318 __ st_ptr(tmp1, recv_addr); 1.319 - Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - 1.320 + Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - 1.321 mdo_offset_bias); 1.322 __ lduw(data_addr, tmp1); 1.323 __ add(tmp1, DataLayout::counter_increment, tmp1); 1.324 @@ -2795,20 +2785,20 @@ 1.325 } 1.326 } 1.327 } else { 1.328 - load(Address(recv, 0, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT); 1.329 + load(Address(recv, oopDesc::klass_offset_in_bytes()), recv, T_OBJECT); 1.330 Label update_done; 1.331 uint i; 1.332 for (i = 0; i < VirtualCallData::row_limit(); i++) { 1.333 Label next_test; 1.334 // See if the receiver is receiver[n]. 1.335 - Address receiver_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - 1.336 + Address receiver_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - 1.337 mdo_offset_bias); 1.338 __ ld_ptr(receiver_addr, tmp1); 1.339 __ verify_oop(tmp1); 1.340 __ cmp(recv, tmp1); 1.341 __ brx(Assembler::notEqual, false, Assembler::pt, next_test); 1.342 __ delayed()->nop(); 1.343 - Address data_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - 1.344 + Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - 1.345 mdo_offset_bias); 1.346 __ lduw(data_addr, tmp1); 1.347 __ add(tmp1, DataLayout::counter_increment, tmp1); 1.348 @@ -2821,7 +2811,7 @@ 1.349 // Didn't find receiver; find next empty slot and fill it in 1.350 for (i = 0; i < VirtualCallData::row_limit(); i++) { 1.351 Label next_test; 1.352 - Address recv_addr(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - 1.353 + Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)) - 1.354 mdo_offset_bias); 1.355 load(recv_addr, tmp1, T_OBJECT); 1.356 __ tst(tmp1); 1.357 @@ -2829,8 +2819,8 @@ 1.358 __ delayed()->nop(); 1.359 __ st_ptr(recv, recv_addr); 1.360 __ set(DataLayout::counter_increment, tmp1); 1.361 - __ st_ptr(tmp1, Address(mdo, 0, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - 1.362 - mdo_offset_bias)); 1.363 + __ st_ptr(tmp1, mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)) - 1.364 + mdo_offset_bias); 1.365 if (i < (VirtualCallData::row_limit() - 1)) { 1.366 __ br(Assembler::always, false, Assembler::pt, update_done); 1.367 __ delayed()->nop();