267 // not headers. 268 inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) { 269 if (UseCompressedOops) { 270 // encode exchange value from oop to T 271 narrowOop val = encode_heap_oop(exchange_value); 272 narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest); 273 // decode old from T to oop 274 return decode_heap_oop(old); 275 } else { 276 return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest); 277 } 278 } 279 280 // In order to put or get a field out of an instance, must first check 281 // if the field has been compressed and uncompress it. 282 inline oop oopDesc::obj_field(int offset) const { 283 return UseCompressedOops ? 284 load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) : 285 load_decode_heap_oop(obj_field_addr<oop>(offset)); 286 } 287 inline volatile oop oopDesc::obj_field_volatile(int offset) const { 288 volatile oop value = obj_field(offset); 289 OrderAccess::acquire(); 290 return value; 291 } 292 inline void oopDesc::obj_field_put(int offset, oop value) { 293 UseCompressedOops ? oop_store(obj_field_addr<narrowOop>(offset), value) : 294 oop_store(obj_field_addr<oop>(offset), value); 295 } 296 297 inline Metadata* oopDesc::metadata_field(int offset) const { 298 return *metadata_field_addr(offset); 299 } 300 301 inline void oopDesc::metadata_field_put(int offset, Metadata* value) { 302 *metadata_field_addr(offset) = value; 303 } 304 305 inline void oopDesc::obj_field_put_raw(int offset, oop value) { 306 UseCompressedOops ? 307 encode_store_heap_oop(obj_field_addr<narrowOop>(offset), value) : 308 encode_store_heap_oop(obj_field_addr<oop>(offset), value); 309 } 310 inline void oopDesc::obj_field_put_volatile(int offset, oop value) { 311 OrderAccess::release(); | 267 // not headers. 268 inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) { 269 if (UseCompressedOops) { 270 // encode exchange value from oop to T 271 narrowOop val = encode_heap_oop(exchange_value); 272 narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest); 273 // decode old from T to oop 274 return decode_heap_oop(old); 275 } else { 276 return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest); 277 } 278 } 279 280 // In order to put or get a field out of an instance, must first check 281 // if the field has been compressed and uncompress it. 282 inline oop oopDesc::obj_field(int offset) const { 283 return UseCompressedOops ? 284 load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) : 285 load_decode_heap_oop(obj_field_addr<oop>(offset)); 286 } 287 inline void oopDesc::obj_field_put(int offset, oop value) { 288 UseCompressedOops ? oop_store(obj_field_addr<narrowOop>(offset), value) : 289 oop_store(obj_field_addr<oop>(offset), value); 290 } 291 292 inline Metadata* oopDesc::metadata_field(int offset) const { 293 return *metadata_field_addr(offset); 294 } 295 296 inline void oopDesc::metadata_field_put(int offset, Metadata* value) { 297 *metadata_field_addr(offset) = value; 298 } 299 300 inline void oopDesc::obj_field_put_raw(int offset, oop value) { 301 UseCompressedOops ? 302 encode_store_heap_oop(obj_field_addr<narrowOop>(offset), value) : 303 encode_store_heap_oop(obj_field_addr<oop>(offset), value); 304 } 305 inline void oopDesc::obj_field_put_volatile(int offset, oop value) { 306 OrderAccess::release(); |