src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp

changeset 1162
6b2273dd6fa9
parent 1100
c89f86385056
child 1215
c96bf21b756f
     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();

mercurial