hotspot/src/cpu/sparc/vm/assembler_sparc.cpp
changeset 590 2954744d7bba
parent 371 1aacedc9db7c
child 593 803947e176bd
equal deleted inserted replaced
589:a44a1e70a3e4 590:2954744d7bba
  1519 
  1519 
  1520 Address MacroAssembler::constant_oop_address(jobject obj, Register d) {
  1520 Address MacroAssembler::constant_oop_address(jobject obj, Register d) {
  1521   assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
  1521   assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
  1522   int oop_index = oop_recorder()->find_index(obj);
  1522   int oop_index = oop_recorder()->find_index(obj);
  1523   return Address(d, address(obj), oop_Relocation::spec(oop_index));
  1523   return Address(d, address(obj), oop_Relocation::spec(oop_index));
       
  1524 }
       
  1525 
       
  1526 void  MacroAssembler::set_narrow_oop(jobject obj, Register d) {
       
  1527   assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
       
  1528   int oop_index = oop_recorder()->find_index(obj);
       
  1529   RelocationHolder rspec = oop_Relocation::spec(oop_index);
       
  1530 
       
  1531   assert_not_delayed();
       
  1532   // Relocation with special format (see relocInfo_sparc.hpp).
       
  1533   relocate(rspec, 1);
       
  1534   // Assembler::sethi(0x3fffff, d);
       
  1535   emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(0x3fffff) );
       
  1536   // Don't add relocation for 'add'. Do patching during 'sethi' processing.
       
  1537   add(d, 0x3ff, d);
       
  1538 
  1524 }
  1539 }
  1525 
  1540 
  1526 
  1541 
  1527 void MacroAssembler::align(int modulus) {
  1542 void MacroAssembler::align(int modulus) {
  1528   while (offset() % modulus != 0) nop();
  1543   while (offset() % modulus != 0) nop();
  3535     set((-i*offset)+STACK_BIAS, Rscratch);
  3550     set((-i*offset)+STACK_BIAS, Rscratch);
  3536     st(G0, Rtsp, Rscratch);
  3551     st(G0, Rtsp, Rscratch);
  3537   }
  3552   }
  3538 }
  3553 }
  3539 
  3554 
  3540 void MacroAssembler::load_klass(Register s, Register d) {
  3555 void MacroAssembler::load_klass(Register src_oop, Register klass) {
  3541   // The number of bytes in this code is used by
  3556   // The number of bytes in this code is used by
  3542   // MachCallDynamicJavaNode::ret_addr_offset()
  3557   // MachCallDynamicJavaNode::ret_addr_offset()
  3543   // if this changes, change that.
  3558   // if this changes, change that.
  3544   if (UseCompressedOops) {
  3559   if (UseCompressedOops) {
  3545     lduw(s, oopDesc::klass_offset_in_bytes(), d);
  3560     lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass);
  3546     decode_heap_oop_not_null(d);
  3561     decode_heap_oop_not_null(klass);
  3547   } else {
  3562   } else {
  3548     ld_ptr(s, oopDesc::klass_offset_in_bytes(), d);
  3563     ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass);
  3549   }
  3564   }
  3550 }
  3565 }
  3551 
  3566 
  3552 // ??? figure out src vs. dst!
  3567 void MacroAssembler::store_klass(Register klass, Register dst_oop) {
  3553 void MacroAssembler::store_klass(Register d, Register s1) {
       
  3554   if (UseCompressedOops) {
  3568   if (UseCompressedOops) {
  3555     assert(s1 != d, "not enough registers");
  3569     assert(dst_oop != klass, "not enough registers");
  3556     encode_heap_oop_not_null(d);
  3570     encode_heap_oop_not_null(klass);
  3557     // Zero out entire klass field first.
  3571     sllx(klass, BitsPerInt, klass);
  3558     st_ptr(G0, s1, oopDesc::klass_offset_in_bytes());
  3572     stx(klass, dst_oop, oopDesc::klass_offset_in_bytes());
  3559     st(d, s1, oopDesc::klass_offset_in_bytes());
       
  3560   } else {
  3573   } else {
  3561     st_ptr(d, s1, oopDesc::klass_offset_in_bytes());
  3574     st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes());
  3562   }
  3575   }
  3563 }
  3576 }
  3564 
  3577 
  3565 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) {
  3578 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) {
  3566   if (UseCompressedOops) {
  3579   if (UseCompressedOops) {