5#ifndef V8_OBJECTS_TAGGED_FIELD_INL_H_
6#define V8_OBJECTS_TAGGED_FIELD_INL_H_
19template <
typename T,
typename CompressionScheme>
22#ifdef V8_COMPRESS_POINTERS
23 if constexpr (std::is_same_v<Smi, T>) {
25 return CompressionScheme::DecompressTaggedSigned(tagged_value);
27 return CompressionScheme::DecompressTagged(CompressionScheme::base(),
36template <
typename T,
typename CompressionScheme>
38#ifdef V8_COMPRESS_POINTERS
39 return CompressionScheme::CompressObject(value);
45template <
typename T,
typename CompressionScheme>
50template <
typename T,
typename CompressionScheme>
54 store_no_write_barrier(value);
58template <
typename T,
typename CompressionScheme>
64template <
typename T,
typename CompressionScheme>
68 Relaxed_Store_no_write_barrier(value);
72template <
typename T,
typename CompressionScheme>
78template <
typename T,
typename CompressionScheme>
82 Release_Store_no_write_barrier(value);
86template <
typename T,
typename CompressionScheme>
92template <
typename T,
typename CompressionScheme>
96 SeqCst_Store_no_write_barrier(value);
100template <
typename T,
typename CompressionScheme>
104 this->ptr_location(), full_to_tagged(value.ptr()))));
109template <
typename T,
typename CompressionScheme>
114 this->ptr_location(), full_to_tagged(expected_value.
ptr()),
115 full_to_tagged(value.ptr()))));
116 if (old_value == expected_value) {
122template <
typename T,
typename CompressionScheme>
125#ifdef V8_ATOMIC_OBJECT_FIELD_WRITES
126 Relaxed_Store_no_write_barrier(value);
128 *this->ptr_location() = full_to_tagged(value.ptr());
132template <
typename T,
typename CompressionScheme>
136 full_to_tagged(value.ptr()));
139template <
typename T,
typename CompressionScheme>
143 full_to_tagged(value.ptr()));
146template <
typename T,
typename CompressionScheme>
150 full_to_tagged(value.ptr()));
153template <
typename T,
typename CompressionScheme>
157#ifndef V8_DISABLE_WRITE_BARRIERS
158 if constexpr (!std::is_same_v<Smi, T>) {
159#if V8_ENABLE_UNCONDITIONAL_WRITE_BARRIERS
169template <
typename T,
int kFieldOffset,
typename CompressionScheme>
176template <
typename T,
int kFieldOffset,
typename CompressionScheme>
183template <
typename T,
int kFieldOffset,
typename CompressionScheme>
184template <
typename TOnHeapAddress>
186 TOnHeapAddress on_heap_addr,
Tagged_t tagged_value) {
187#ifdef V8_COMPRESS_POINTERS
188 if constexpr (kIsSmi) {
190 return CompressionScheme::DecompressTaggedSigned(tagged_value);
192 return CompressionScheme::DecompressTagged(on_heap_addr, tagged_value);
200template <
typename T,
int kFieldOffset,
typename CompressionScheme>
203#ifdef V8_COMPRESS_POINTERS
205 return CompressionScheme::CompressObject(value);
212template <
typename T,
int kFieldOffset,
typename CompressionScheme>
218 return PtrType(tagged_to_full(host.
ptr(), value));
222template <
typename T,
int kFieldOffset,
typename CompressionScheme>
228 return PtrType(tagged_to_full(cage_base, value));
232template <
typename T,
int kFieldOffset,
typename CompressionScheme>
235#ifdef V8_ATOMIC_OBJECT_FIELD_WRITES
236 Relaxed_Store(host, value);
240 *location(host) = full_to_tagged(ptr);
245template <
typename T,
int kFieldOffset,
typename CompressionScheme>
248#ifdef V8_ATOMIC_OBJECT_FIELD_WRITES
253 *location(host,
offset) = full_to_tagged(ptr);
258template <
typename T,
int kFieldOffset,
typename CompressionScheme>
264 return PtrType(tagged_to_full(host.
ptr(), value));
268template <
typename T,
int kFieldOffset,
typename CompressionScheme>
274 return PtrType(tagged_to_full(cage_base, value));
278template <
typename T,
int kFieldOffset,
typename CompressionScheme>
283 return PtrType(tagged_to_full(cage_base, value));
287template <
typename T,
int kFieldOffset,
typename CompressionScheme>
294template <
typename T,
int kFieldOffset,
typename CompressionScheme>
303template <
typename T,
int kFieldOffset,
typename CompressionScheme>
312template <
typename T,
int kFieldOffset,
typename CompressionScheme>
318 return PtrType(tagged_to_full(host.
ptr(), value));
322template <
typename T,
int kFieldOffset,
typename CompressionScheme>
327 return PtrType(tagged_to_full(cage_base, value));
330template <
typename T,
int kFieldOffset,
typename CompressionScheme>
336 return PtrType(tagged_to_full(cage_base, value));
340template <
typename T,
int kFieldOffset,
typename CompressionScheme>
349template <
typename T,
int kFieldOffset,
typename CompressionScheme>
357template <
typename T,
int kFieldOffset,
typename CompressionScheme>
366template <
typename T,
int kFieldOffset,
typename CompressionScheme>
370 Tagged_t old_value = full_to_tagged(old.ptr());
371 Tagged_t new_value = full_to_tagged(value.ptr());
373 location(host), old_value, new_value);
378template <
typename T,
int kFieldOffset,
typename CompressionScheme>
382 Tagged_t old_value = full_to_tagged(old.ptr());
383 Tagged_t new_value = full_to_tagged(value.ptr());
385 location(host), old_value, new_value);
390template <
typename T,
int kFieldOffset,
typename CompressionScheme>
396 return PtrType(tagged_to_full(host.
ptr(), value));
400template <
typename T,
int kFieldOffset,
typename CompressionScheme>
406 return PtrType(tagged_to_full(cage_base, value));
410template <
typename T,
int kFieldOffset,
typename CompressionScheme>
419template <
typename T,
int kFieldOffset,
typename CompressionScheme>
428template <
typename T,
int kFieldOffset,
typename CompressionScheme>
437 return PtrType(tagged_to_full(host.
ptr(), old_value));
441template <
typename T,
int kFieldOffset,
typename CompressionScheme>
451 return PtrType(tagged_to_full(cage_base, old_value));
455template <
typename T,
int kFieldOffset,
typename CompressionScheme>
463 location(host,
offset), full_to_tagged(old_ptr), full_to_tagged(ptr));
465 tagged_to_full(host.
ptr(), old_value));
static T Relaxed_CompareAndSwap(T *addr, typename std::remove_reference< T >::type old_value, typename std::remove_reference< T >::type new_value)
static void Release_Store(T *addr, typename std::remove_reference< T >::type new_value)
static void SeqCst_Store(T *addr, typename std::remove_reference< T >::type new_value)
static T Acquire_Load(T *addr)
static void Relaxed_Store(T *addr, typename std::remove_reference< T >::type new_value)
static T Release_CompareAndSwap(T *addr, typename std::remove_reference< T >::type old_value, typename std::remove_reference< T >::type new_value)
static T SeqCst_Swap(T *addr, typename std::remove_reference< T >::type new_value)
static T SeqCst_Load(T *addr)
static T SeqCst_CompareAndSwap(T *addr, typename std::remove_reference< T >::type old_value, typename std::remove_reference< T >::type new_value)
static T Relaxed_Load(T *addr)
static V8_INLINE bool IsOwnedByAnyHeap(Tagged< HeapObject > object)
static constexpr int kMapOffset
static void SeqCst_Store(Tagged< HeapObject > host, PtrType value)
static Tagged_t Relaxed_CompareAndSwap(Tagged< HeapObject > host, PtrType old, PtrType value)
static void Release_Store(Tagged< HeapObject > host, PtrType value)
std::conditional_t< std::is_same_v< MapWord, T >, MapWord, Tagged< T > > PtrType
static PtrType load(Tagged< HeapObject > host, int offset=0)
static void Relaxed_Store(Tagged< HeapObject > host, PtrType value)
static void Relaxed_Store_Map_Word(Tagged< HeapObject > host, PtrType value)
static PtrType Relaxed_Load(Tagged< HeapObject > host, int offset=0)
static Address address(Tagged< HeapObject > host, int offset=0)
static Tagged_t full_to_tagged(Address value)
static PtrType Acquire_Load_No_Unpack(PtrComprCageBase cage_base, Tagged< HeapObject > host, int offset=0)
static PtrType SeqCst_CompareAndSwap(Tagged< HeapObject > host, int offset, PtrType old, PtrType value)
static void store(Tagged< HeapObject > host, PtrType value)
static Tagged_t Release_CompareAndSwap(Tagged< HeapObject > host, PtrType old, PtrType value)
static Tagged_t * location(Tagged< HeapObject > host, int offset=0)
static PtrType Acquire_Load(Tagged< HeapObject > host, int offset=0)
static PtrType SeqCst_Load(Tagged< HeapObject > host, int offset=0)
static Address tagged_to_full(TOnHeapAddress on_heap_addr, Tagged_t tagged_value)
static PtrType SeqCst_Swap(Tagged< HeapObject > host, int offset, PtrType value)
static void Release_Store_Map_Word(Tagged< HeapObject > host, PtrType value)
static PtrType Relaxed_Load_Map_Word(PtrComprCageBase cage_base, Tagged< HeapObject > host)
V8_INLINE constexpr StorageType ptr() const
Tagged< T > SeqCst_Load() const
Tagged< T > Relaxed_Load() const
void store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
Tagged< T > SeqCst_Swap(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void SeqCst_Store_no_write_barrier(Tagged< T > value)
void Relaxed_Store_no_write_barrier(Tagged< T > value)
Tagged< T > SeqCst_CompareAndSwap(HeapObjectLayout *host, Tagged< T > expected_value, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void store_no_write_barrier(Tagged< T > value)
void Release_Store_no_write_barrier(Tagged< T > value)
static Address tagged_to_full(Tagged_t tagged_value)
void SeqCst_Store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void Release_Store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void WriteBarrier(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode)
Tagged< T > Acquire_Load() const
void Relaxed_Store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static Tagged_t full_to_tagged(Address value)
static void ForValue(Tagged< HeapObject > host, MaybeObjectSlot slot, Tagged< T > value, WriteBarrierMode mode)
#define HAS_SMI_TAG(value)
ZoneVector< RpoNumber > & result
Tagged(T object) -> Tagged< T >
base::AtomicWord AtomicTagged_t
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)