3909 |
3909 |
3910 void MacroAssembler::load_klass(Register src_oop, Register klass) { |
3910 void MacroAssembler::load_klass(Register src_oop, Register klass) { |
3911 // The number of bytes in this code is used by |
3911 // The number of bytes in this code is used by |
3912 // MachCallDynamicJavaNode::ret_addr_offset() |
3912 // MachCallDynamicJavaNode::ret_addr_offset() |
3913 // if this changes, change that. |
3913 // if this changes, change that. |
3914 if (UseCompressedKlassPointers) { |
3914 if (UseCompressedClassPointers) { |
3915 lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass); |
3915 lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass); |
3916 decode_klass_not_null(klass); |
3916 decode_klass_not_null(klass); |
3917 } else { |
3917 } else { |
3918 ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass); |
3918 ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass); |
3919 } |
3919 } |
3920 } |
3920 } |
3921 |
3921 |
3922 void MacroAssembler::store_klass(Register klass, Register dst_oop) { |
3922 void MacroAssembler::store_klass(Register klass, Register dst_oop) { |
3923 if (UseCompressedKlassPointers) { |
3923 if (UseCompressedClassPointers) { |
3924 assert(dst_oop != klass, "not enough registers"); |
3924 assert(dst_oop != klass, "not enough registers"); |
3925 encode_klass_not_null(klass); |
3925 encode_klass_not_null(klass); |
3926 st(klass, dst_oop, oopDesc::klass_offset_in_bytes()); |
3926 st(klass, dst_oop, oopDesc::klass_offset_in_bytes()); |
3927 } else { |
3927 } else { |
3928 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); |
3928 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); |
3929 } |
3929 } |
3930 } |
3930 } |
3931 |
3931 |
3932 void MacroAssembler::store_klass_gap(Register s, Register d) { |
3932 void MacroAssembler::store_klass_gap(Register s, Register d) { |
3933 if (UseCompressedKlassPointers) { |
3933 if (UseCompressedClassPointers) { |
3934 assert(s != d, "not enough registers"); |
3934 assert(s != d, "not enough registers"); |
3935 st(s, d, oopDesc::klass_gap_offset_in_bytes()); |
3935 st(s, d, oopDesc::klass_gap_offset_in_bytes()); |
3936 } |
3936 } |
3937 } |
3937 } |
3938 |
3938 |
4087 if (Universe::narrow_oop_base() != NULL) |
4087 if (Universe::narrow_oop_base() != NULL) |
4088 add(dst, G6_heapbase, dst); |
4088 add(dst, G6_heapbase, dst); |
4089 } |
4089 } |
4090 |
4090 |
4091 void MacroAssembler::encode_klass_not_null(Register r) { |
4091 void MacroAssembler::encode_klass_not_null(Register r) { |
4092 assert (UseCompressedKlassPointers, "must be compressed"); |
4092 assert (UseCompressedClassPointers, "must be compressed"); |
4093 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4093 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4094 assert(r != G6_heapbase, "bad register choice"); |
4094 assert(r != G6_heapbase, "bad register choice"); |
4095 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); |
4095 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); |
4096 sub(r, G6_heapbase, r); |
4096 sub(r, G6_heapbase, r); |
4097 if (Universe::narrow_klass_shift() != 0) { |
4097 if (Universe::narrow_klass_shift() != 0) { |
4103 |
4103 |
4104 void MacroAssembler::encode_klass_not_null(Register src, Register dst) { |
4104 void MacroAssembler::encode_klass_not_null(Register src, Register dst) { |
4105 if (src == dst) { |
4105 if (src == dst) { |
4106 encode_klass_not_null(src); |
4106 encode_klass_not_null(src); |
4107 } else { |
4107 } else { |
4108 assert (UseCompressedKlassPointers, "must be compressed"); |
4108 assert (UseCompressedClassPointers, "must be compressed"); |
4109 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4109 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4110 set((intptr_t)Universe::narrow_klass_base(), dst); |
4110 set((intptr_t)Universe::narrow_klass_base(), dst); |
4111 sub(src, dst, dst); |
4111 sub(src, dst, dst); |
4112 if (Universe::narrow_klass_shift() != 0) { |
4112 if (Universe::narrow_klass_shift() != 0) { |
4113 srlx(dst, LogKlassAlignmentInBytes, dst); |
4113 srlx(dst, LogKlassAlignmentInBytes, dst); |
4117 |
4117 |
4118 // Function instr_size_for_decode_klass_not_null() counts the instructions |
4118 // Function instr_size_for_decode_klass_not_null() counts the instructions |
4119 // generated by decode_klass_not_null() and reinit_heapbase(). Hence, if |
4119 // generated by decode_klass_not_null() and reinit_heapbase(). Hence, if |
4120 // the instructions they generate change, then this method needs to be updated. |
4120 // the instructions they generate change, then this method needs to be updated. |
4121 int MacroAssembler::instr_size_for_decode_klass_not_null() { |
4121 int MacroAssembler::instr_size_for_decode_klass_not_null() { |
4122 assert (UseCompressedKlassPointers, "only for compressed klass ptrs"); |
4122 assert (UseCompressedClassPointers, "only for compressed klass ptrs"); |
4123 // set + add + set |
4123 // set + add + set |
4124 int num_instrs = insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) + 1 + |
4124 int num_instrs = insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) + 1 + |
4125 insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base()); |
4125 insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base()); |
4126 if (Universe::narrow_klass_shift() == 0) { |
4126 if (Universe::narrow_klass_shift() == 0) { |
4127 return num_instrs * BytesPerInstWord; |
4127 return num_instrs * BytesPerInstWord; |
4133 // !!! If the instructions that get generated here change then function |
4133 // !!! If the instructions that get generated here change then function |
4134 // instr_size_for_decode_klass_not_null() needs to get updated. |
4134 // instr_size_for_decode_klass_not_null() needs to get updated. |
4135 void MacroAssembler::decode_klass_not_null(Register r) { |
4135 void MacroAssembler::decode_klass_not_null(Register r) { |
4136 // Do not add assert code to this unless you change vtableStubs_sparc.cpp |
4136 // Do not add assert code to this unless you change vtableStubs_sparc.cpp |
4137 // pd_code_size_limit. |
4137 // pd_code_size_limit. |
4138 assert (UseCompressedKlassPointers, "must be compressed"); |
4138 assert (UseCompressedClassPointers, "must be compressed"); |
4139 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4139 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4140 assert(r != G6_heapbase, "bad register choice"); |
4140 assert(r != G6_heapbase, "bad register choice"); |
4141 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); |
4141 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); |
4142 if (Universe::narrow_klass_shift() != 0) |
4142 if (Universe::narrow_klass_shift() != 0) |
4143 sllx(r, LogKlassAlignmentInBytes, r); |
4143 sllx(r, LogKlassAlignmentInBytes, r); |
4149 if (src == dst) { |
4149 if (src == dst) { |
4150 decode_klass_not_null(src); |
4150 decode_klass_not_null(src); |
4151 } else { |
4151 } else { |
4152 // Do not add assert code to this unless you change vtableStubs_sparc.cpp |
4152 // Do not add assert code to this unless you change vtableStubs_sparc.cpp |
4153 // pd_code_size_limit. |
4153 // pd_code_size_limit. |
4154 assert (UseCompressedKlassPointers, "must be compressed"); |
4154 assert (UseCompressedClassPointers, "must be compressed"); |
4155 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4155 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); |
4156 if (Universe::narrow_klass_shift() != 0) { |
4156 if (Universe::narrow_klass_shift() != 0) { |
4157 assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice"); |
4157 assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice"); |
4158 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); |
4158 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); |
4159 sllx(src, LogKlassAlignmentInBytes, dst); |
4159 sllx(src, LogKlassAlignmentInBytes, dst); |
4165 } |
4165 } |
4166 } |
4166 } |
4167 } |
4167 } |
4168 |
4168 |
4169 void MacroAssembler::reinit_heapbase() { |
4169 void MacroAssembler::reinit_heapbase() { |
4170 if (UseCompressedOops || UseCompressedKlassPointers) { |
4170 if (UseCompressedOops || UseCompressedClassPointers) { |
4171 if (Universe::heap() != NULL) { |
4171 if (Universe::heap() != NULL) { |
4172 set((intptr_t)Universe::narrow_ptrs_base(), G6_heapbase); |
4172 set((intptr_t)Universe::narrow_ptrs_base(), G6_heapbase); |
4173 } else { |
4173 } else { |
4174 AddressLiteral base(Universe::narrow_ptrs_base_addr()); |
4174 AddressLiteral base(Universe::narrow_ptrs_base_addr()); |
4175 load_ptr_contents(base, G6_heapbase); |
4175 load_ptr_contents(base, G6_heapbase); |