v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
elements-kind.h
Go to the documentation of this file.
1// Copyright 2012 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_OBJECTS_ELEMENTS_KIND_H_
6#define V8_OBJECTS_ELEMENTS_KIND_H_
7
8#include "src/base/bits.h"
9#include "src/base/bounds.h"
10#include "src/base/macros.h"
11#include "src/common/checks.h"
12#include "src/flags/flags.h"
13
14namespace v8 {
15namespace internal {
16
17// V has parameters (Type, type, TYPE, C type)
18#define TYPED_ARRAYS_BASE(V) \
19 V(Uint8, uint8, UINT8, uint8_t) \
20 V(Int8, int8, INT8, int8_t) \
21 V(Uint16, uint16, UINT16, uint16_t) \
22 V(Int16, int16, INT16, int16_t) \
23 V(Uint32, uint32, UINT32, uint32_t) \
24 V(Int32, int32, INT32, int32_t) \
25 V(BigUint64, biguint64, BIGUINT64, uint64_t) \
26 V(BigInt64, bigint64, BIGINT64, int64_t) \
27 V(Uint8Clamped, uint8_clamped, UINT8_CLAMPED, uint8_t) \
28 V(Float32, float32, FLOAT32, float) \
29 V(Float64, float64, FLOAT64, double)
30
31#define TYPED_ARRAYS_FLOAT16(V) V(Float16, float16, FLOAT16, uint16_t)
32
33#define TYPED_ARRAYS(V) \
34 TYPED_ARRAYS_BASE(V) \
35 TYPED_ARRAYS_FLOAT16(V)
36
37#define RAB_GSAB_TYPED_ARRAYS_BASE(V) \
38 V(RabGsabUint8, rab_gsab_uint8, RAB_GSAB_UINT8, uint8_t) \
39 V(RabGsabInt8, rab_gsab_int8, RAB_GSAB_INT8, int8_t) \
40 V(RabGsabUint16, rab_gsab_uint16, RAB_GSAB_UINT16, uint16_t) \
41 V(RabGsabInt16, rab_gsab_int16, RAB_GSAB_INT16, int16_t) \
42 V(RabGsabUint32, rab_gsab_uint32, RAB_GSAB_UINT32, uint32_t) \
43 V(RabGsabInt32, rab_gsab_int32, RAB_GSAB_INT32, int32_t) \
44 V(RabGsabBigUint64, rab_gsab_biguint64, RAB_GSAB_BIGUINT64, uint64_t) \
45 V(RabGsabBigInt64, rab_gsab_bigint64, RAB_GSAB_BIGINT64, int64_t) \
46 V(RabGsabUint8Clamped, rab_gsab_uint8_clamped, RAB_GSAB_UINT8_CLAMPED, \
47 uint8_t) \
48 V(RabGsabFloat32, rab_gsab_float32, RAB_GSAB_FLOAT32, float) \
49 V(RabGsabFloat64, rab_gsab_float64, RAB_GSAB_FLOAT64, double)
50
51#define RAB_GSAB_TYPED_ARRAYS_FLOAT16(V) \
52 V(RabGsabFloat16, rab_gsab_float16, RAB_GSAB_FLOAT16, uint16_t)
53
54#define RAB_GSAB_TYPED_ARRAYS(V) \
55 RAB_GSAB_TYPED_ARRAYS_BASE(V) \
56 RAB_GSAB_TYPED_ARRAYS_FLOAT16(V)
57
58// The TypedArrays backed by RAB / GSAB are called Uint8Array, Uint16Array etc,
59// and not RabGsabUint8Array, RabGsabUint16Array etc. This macro is used for
60// generating code which refers to the TypedArray type.
61#define RAB_GSAB_TYPED_ARRAYS_WITH_TYPED_ARRAY_TYPE_BASE(V) \
62 V(Uint8, rab_gsab_uint8, RAB_GSAB_UINT8, uint8_t) \
63 V(Int8, rab_gsab_int8, RAB_GSAB_INT8, int8_t) \
64 V(Uint16, rab_gsab_uint16, RAB_GSAB_UINT16, uint16_t) \
65 V(Int16, rab_gsab_int16, RAB_GSAB_INT16, int16_t) \
66 V(Uint32, rab_gsab_uint32, RAB_GSAB_UINT32, uint32_t) \
67 V(Int32, rab_gsab_int32, RAB_GSAB_INT32, int32_t) \
68 V(BigUint64, rab_gsab_biguint64, RAB_GSAB_BIGUINT64, uint64_t) \
69 V(BigInt64, rab_gsab_bigint64, RAB_GSAB_BIGINT64, int64_t) \
70 V(Uint8Clamped, rab_gsab_uint8_clamped, RAB_GSAB_UINT8_CLAMPED, uint8_t) \
71 V(Float32, rab_gsab_float32, RAB_GSAB_FLOAT32, float) \
72 V(Float64, rab_gsab_float64, RAB_GSAB_FLOAT64, double)
73
74#define RAB_GSAB_TYPED_ARRAYS_WITH_TYPED_ARRAY_TYPE_FLOAT16(V) \
75 V(Float16, rab_gsab_float16, RAB_GSAB_FLOAT16, uint16_t)
76
77#define RAB_GSAB_TYPED_ARRAYS_WITH_TYPED_ARRAY_TYPE(V) \
78 RAB_GSAB_TYPED_ARRAYS_WITH_TYPED_ARRAY_TYPE_BASE(V) \
79 RAB_GSAB_TYPED_ARRAYS_WITH_TYPED_ARRAY_TYPE_FLOAT16(V)
80
81// Like RAB_GSAB_TYPED_ARRAYS but has an additional parameter for
82// for the corresponding non-RAB/GSAB ElementsKind.
83#define RAB_GSAB_TYPED_ARRAYS_WITH_NON_RAB_GSAB_ELEMENTS_KIND_BASE(V) \
84 V(RabGsabUint8, rab_gsab_uint8, RAB_GSAB_UINT8, uint8_t, UINT8) \
85 V(RabGsabInt8, rab_gsab_int8, RAB_GSAB_INT8, int8_t, INT8) \
86 V(RabGsabUint16, rab_gsab_uint16, RAB_GSAB_UINT16, uint16_t, UINT16) \
87 V(RabGsabInt16, rab_gsab_int16, RAB_GSAB_INT16, int16_t, INT16) \
88 V(RabGsabUint32, rab_gsab_uint32, RAB_GSAB_UINT32, uint32_t, UINT32) \
89 V(RabGsabInt32, rab_gsab_int32, RAB_GSAB_INT32, int32_t, INT32) \
90 V(RabGsabBigUint64, rab_gsab_biguint64, RAB_GSAB_BIGUINT64, uint64_t, \
91 BIGUINT64) \
92 V(RabGsabBigInt64, rab_gsab_bigint64, RAB_GSAB_BIGINT64, int64_t, BIGINT64) \
93 V(RabGsabUint8Clamped, rab_gsab_uint8_clamped, RAB_GSAB_UINT8_CLAMPED, \
94 uint8_t, UINT8_CLAMPED) \
95 V(RabGsabFloat32, rab_gsab_float32, RAB_GSAB_FLOAT32, float, FLOAT32) \
96 V(RabGsabFloat64, rab_gsab_float64, RAB_GSAB_FLOAT64, double, FLOAT64)
97
98#define RAB_GSAB_TYPED_ARRAYS_WITH_NON_RAB_GSAB_ELEMENTS_KIND_FLOAT16(V) \
99 V(RabGsabFloat16, rab_gsab_float16, RAB_GSAB_FLOAT16, uint16_t, FLOAT16)
100
101#define RAB_GSAB_TYPED_ARRAYS_WITH_NON_RAB_GSAB_ELEMENTS_KIND(V) \
102 RAB_GSAB_TYPED_ARRAYS_WITH_NON_RAB_GSAB_ELEMENTS_KIND_BASE(V) \
103 RAB_GSAB_TYPED_ARRAYS_WITH_NON_RAB_GSAB_ELEMENTS_KIND_FLOAT16(V)
104
105enum ElementsKind : uint8_t {
106 // The "fast" kind for elements that only contain SMI values. Must be first
107 // to make it possible to efficiently check maps for this kind.
110
111 // The "fast" kind for tagged values. Must be second to make it possible to
112 // efficiently check maps for this and the PACKED_SMI_ELEMENTS kind
113 // together at once.
116
117 // The "fast" kind for unwrapped, non-tagged double values.
120
121 // The nonextensible kind for elements.
124
125 // The sealed kind for elements.
128
129 // The frozen kind for elements.
132
133 // SharedArray elements kind. A FAST_SEALED_ELEMENTS variation useful to
134 // code specific paths for SharedArrays.
136
137 // The "slow" kind.
139
140 // Elements kind of the "arguments" object (only in sloppy mode).
143
144 // For string wrapper objects ("new String('...')"), the string's characters
145 // are overlaid onto a regular elements backing store.
148
149// Fixed typed arrays.
150#define TYPED_ARRAY_ELEMENTS_KIND(Type, type, TYPE, ctype) TYPE##_ELEMENTS,
153#undef TYPED_ARRAY_ELEMENTS_KIND
154
155 // WasmObject elements kind. The actual elements type is read from the
156 // respective WasmTypeInfo.
158
159 // Sentinel ElementsKind for objects with no elements.
161
162 // Derived constants from ElementsKind.
164 LAST_ELEMENTS_KIND = RAB_GSAB_FLOAT16_ELEMENTS,
176
177// Alias for kSystemPointerSize-sized elements
178#ifdef V8_COMPRESS_POINTERS
180#else
182#endif
183};
184
188
189// The number to add to a packed elements kind to reach a holey elements kind
192
193constexpr int kElementsKindBits = 6;
194static_assert((1 << kElementsKindBits) > LAST_ELEMENTS_KIND);
195static_assert((1 << (kElementsKindBits - 1)) <= LAST_ELEMENTS_KIND);
196
197constexpr int kFastElementsKindBits = 3;
198static_assert((1 << kFastElementsKindBits) > LAST_FAST_ELEMENTS_KIND);
199static_assert((1 << (kFastElementsKindBits - 1)) <= LAST_FAST_ELEMENTS_KIND);
200
201V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, ElementsKind kind);
202
205inline constexpr int ElementsKindToShiftSize(ElementsKind elements_kind) {
206 switch (elements_kind) {
207 case UINT8_ELEMENTS:
208 case INT8_ELEMENTS:
209 case UINT8_CLAMPED_ELEMENTS:
210 case RAB_GSAB_UINT8_ELEMENTS:
211 case RAB_GSAB_INT8_ELEMENTS:
212 case RAB_GSAB_UINT8_CLAMPED_ELEMENTS:
213 return 0;
214 case UINT16_ELEMENTS:
215 case INT16_ELEMENTS:
216 case FLOAT16_ELEMENTS:
217 case RAB_GSAB_FLOAT16_ELEMENTS:
218 case RAB_GSAB_UINT16_ELEMENTS:
219 case RAB_GSAB_INT16_ELEMENTS:
220 return 1;
221 case UINT32_ELEMENTS:
222 case INT32_ELEMENTS:
223 case FLOAT32_ELEMENTS:
224 case RAB_GSAB_UINT32_ELEMENTS:
225 case RAB_GSAB_INT32_ELEMENTS:
226 case RAB_GSAB_FLOAT32_ELEMENTS:
227 return 2;
230 case FLOAT64_ELEMENTS:
231 case BIGINT64_ELEMENTS:
232 case BIGUINT64_ELEMENTS:
233 case RAB_GSAB_FLOAT64_ELEMENTS:
234 case RAB_GSAB_BIGINT64_ELEMENTS:
235 case RAB_GSAB_BIGUINT64_ELEMENTS:
236 return 3;
238 case PACKED_ELEMENTS:
243 case HOLEY_ELEMENTS:
253 return kTaggedSizeLog2;
255 case NO_ELEMENTS:
257 }
259}
260inline constexpr int ElementsKindToByteSize(ElementsKind elements_kind) {
261 return 1 << ElementsKindToShiftSize(elements_kind);
262}
265
267
270
272
276
280
284
289
294
299
304
309
311 return kind == BIGINT64_ELEMENTS || kind == BIGUINT64_ELEMENTS ||
312 kind == RAB_GSAB_BIGINT64_ELEMENTS ||
313 kind == RAB_GSAB_BIGUINT64_ELEMENTS;
314}
315
317 return kind == FLOAT16_ELEMENTS || kind == RAB_GSAB_FLOAT16_ELEMENTS;
318}
319
321 return kind == FLOAT16_ELEMENTS || kind == RAB_GSAB_FLOAT16_ELEMENTS ||
322 kind == FLOAT32_ELEMENTS || kind == FLOAT64_ELEMENTS ||
323 kind == RAB_GSAB_FLOAT32_ELEMENTS || kind == RAB_GSAB_FLOAT64_ELEMENTS;
324}
325
327 return kind == INT8_ELEMENTS || kind == RAB_GSAB_INT8_ELEMENTS ||
328 kind == INT16_ELEMENTS || kind == RAB_GSAB_INT16_ELEMENTS ||
329 kind == INT32_ELEMENTS || kind == RAB_GSAB_INT32_ELEMENTS;
330}
331
333 return kind == UINT8_CLAMPED_ELEMENTS ||
334 kind == RAB_GSAB_UINT8_CLAMPED_ELEMENTS || kind == UINT8_ELEMENTS ||
335 kind == RAB_GSAB_UINT8_ELEMENTS || kind == UINT16_ELEMENTS ||
336 kind == RAB_GSAB_UINT16_ELEMENTS || kind == UINT32_ELEMENTS ||
337 kind == RAB_GSAB_UINT32_ELEMENTS;
338}
339
343
347
353
355 static_assert(FIRST_FAST_ELEMENTS_KIND == 0);
357}
358
365
369
370// This predicate is used for disabling respective functionality in builtins.
375
379
384
389
393
402
406
410
414
418
423
425 return kind % 2 == 1 && kind <= HOLEY_DOUBLE_ELEMENTS;
426}
427
429 return kind % 2 == 1 && kind <= HOLEY_FROZEN_ELEMENTS;
430}
431
435
437 return kind % 2 == 0 && kind <= PACKED_DOUBLE_ELEMENTS;
438}
439
441 if (holey_kind == HOLEY_SMI_ELEMENTS) {
442 return PACKED_SMI_ELEMENTS;
443 }
444 if (holey_kind == HOLEY_DOUBLE_ELEMENTS) {
446 }
447 if (holey_kind == HOLEY_ELEMENTS) {
448 return PACKED_ELEMENTS;
449 }
450 return holey_kind;
451}
452
454 if (packed_kind == PACKED_SMI_ELEMENTS) {
455 return HOLEY_SMI_ELEMENTS;
456 }
457 if (packed_kind == PACKED_DOUBLE_ELEMENTS) {
459 }
460 if (packed_kind == PACKED_ELEMENTS) {
461 return HOLEY_ELEMENTS;
462 }
463 if (packed_kind == PACKED_NONEXTENSIBLE_ELEMENTS) {
465 }
466 return packed_kind;
467}
468
475
483
485 ElementsKind b) {
486 // Assert that the union of two ElementKinds can be computed via std::max.
488 "ElementsKind union not computable via std::max.");
489 static_assert(PACKED_ELEMENTS < HOLEY_ELEMENTS,
490 "ElementsKind union not computable via std::max.");
492 "ElementsKind union not computable via std::max.");
493 ElementsKind a = *a_out;
494 switch (a) {
497 if (b == PACKED_SMI_ELEMENTS || b == HOLEY_SMI_ELEMENTS) {
498 *a_out = std::max(a, b);
499 return true;
500 }
501 break;
502 case PACKED_ELEMENTS:
503 case HOLEY_ELEMENTS:
504 if (b == PACKED_ELEMENTS || b == HOLEY_ELEMENTS) {
505 *a_out = std::max(a, b);
506 return true;
507 }
508 break;
512 *a_out = std::max(a, b);
513 return true;
514 }
515 break;
516 default:
517 break;
518 }
519 return false;
520}
521
523
528
530 ElementsKind to_kind) {
531 return (GetHoleyElementsKind(from_kind) == to_kind) ||
532 (IsSmiElementsKind(from_kind) && IsObjectElementsKind(to_kind));
533}
534
536 ElementsKind to_kind);
537
539 ElementsKind to_kind) {
540 if (IsMoreGeneralElementsKindTransition(from_kind, to_kind)) {
541 return to_kind;
542 }
543 return from_kind;
544}
545
547 return IsFastElementsKind(from_kind) &&
548 from_kind != TERMINAL_FAST_ELEMENTS_KIND;
549}
550
551inline bool ElementsKindEqual(ElementsKind a, ElementsKind b) { return a == b; }
552
553} // namespace internal
554} // namespace v8
555
556#endif // V8_OBJECTS_ELEMENTS_KIND_H_
Builtins::Kind kind
Definition builtins.cc:40
#define RAB_GSAB_TYPED_ARRAYS(V)
#define TYPED_ARRAYS(V)
#define TYPED_ARRAY_ELEMENTS_KIND(Type, type, TYPE, ctype)
ZoneVector< RpoNumber > & result
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
Definition bounds.h:20
constexpr int kFastElementsKindCount
bool IsSlowArgumentsElementsKind(ElementsKind kind)
ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_number)
bool IsWasmArrayElementsKind(ElementsKind kind)
constexpr bool IsHoleyElementsKind(ElementsKind kind)
bool IsAnyHoleyNonextensibleElementsKind(ElementsKind kind)
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
bool IsTransitionElementsKind(ElementsKind kind)
bool IsSealedElementsKind(ElementsKind kind)
bool IsFastOrNonextensibleOrSealedElementsKind(ElementsKind kind)
bool IsTypedArrayElementsKind(ElementsKind kind)
bool IsRabGsabTypedArrayElementsKind(ElementsKind kind)
const uint8_t * TypedArrayAndRabGsabTypedArrayElementsKindShifts()
ElementsKind GetCorrespondingRabGsabElementsKind(ElementsKind typed_array_kind)
constexpr bool IsSmiElementsKind(ElementsKind kind)
ElementsKind GetPackedElementsKind(ElementsKind holey_kind)
constexpr int kFastElementsKindPackedToHoley
bool IsAnyNonextensibleElementsKind(ElementsKind kind)
constexpr bool IsObjectElementsKind(ElementsKind kind)
constexpr bool IsFloat16TypedArrayElementsKind(ElementsKind kind)
bool IsNonextensibleElementsKind(ElementsKind kind)
@ FIRST_ANY_NONEXTENSIBLE_ELEMENTS_KIND
@ HOLEY_NONEXTENSIBLE_ELEMENTS
@ FIRST_VALID_ATOMICS_TYPED_ARRAY_ELEMENTS_KIND
@ FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ SLOW_STRING_WRAPPER_ELEMENTS
@ PACKED_NONEXTENSIBLE_ELEMENTS
@ LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND
@ TERMINAL_FAST_ELEMENTS_KIND
@ SLOW_SLOPPY_ARGUMENTS_ELEMENTS
@ LAST_VALID_ATOMICS_TYPED_ARRAY_ELEMENTS_KIND
@ FIRST_RAB_GSAB_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ LAST_RAB_GSAB_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ FAST_SLOPPY_ARGUMENTS_ELEMENTS
@ FAST_STRING_WRAPPER_ELEMENTS
bool IsSimpleMapChangeTransition(ElementsKind from_kind, ElementsKind to_kind)
const char * ElementsKindToString(ElementsKind kind)
std::ostream & operator<<(std::ostream &os, AtomicMemoryOrder order)
bool IsHoleyElementsKindForRead(ElementsKind kind)
constexpr int kFastElementsKindBits
ElementsKind GetCorrespondingNonRabGsabElementsKind(ElementsKind typed_array_kind)
bool IsSmiOrObjectElementsKind(ElementsKind kind)
int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind)
int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind)
bool IsSignedIntTypedArrayElementsKind(ElementsKind kind)
bool IsFastArgumentsElementsKind(ElementsKind kind)
bool IsFastPackedElementsKind(ElementsKind kind)
constexpr int ElementsKindToShiftSize(ElementsKind elements_kind)
constexpr int kTaggedSizeLog2
Definition globals.h:543
ElementsKind GetHoleyElementsKind(ElementsKind packed_kind)
bool IsSloppyArgumentsElementsKind(ElementsKind kind)
bool IsFastNumberElementsKind(ElementsKind kind)
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
bool IsFrozenElementsKind(ElementsKind kind)
ElementsKind GetNextTransitionElementsKind(ElementsKind kind)
bool IsTerminalElementsKind(ElementsKind kind)
bool IsBigIntTypedArrayElementsKind(ElementsKind kind)
bool IsFastElementsKind(ElementsKind kind)
bool IsSharedArrayElementsKind(ElementsKind kind)
DONT_OVERRIDE DISABLE_ALLOCATION_SITES DISABLE_ALLOCATION_SITES HOLEY_DOUBLE_ELEMENTS
bool IsHoleyOrDictionaryElementsKind(ElementsKind kind)
bool IsDictionaryElementsKind(ElementsKind kind)
bool UnionElementsKindUptoSize(ElementsKind *a_out, ElementsKind b)
bool IsFloatTypedArrayElementsKind(ElementsKind kind)
bool ElementsKindEqual(ElementsKind a, ElementsKind b)
constexpr int kElementsKindBits
bool IsUnsignedIntTypedArrayElementsKind(ElementsKind kind)
const uint8_t * TypedArrayAndRabGsabTypedArrayElementsKindSizes()
bool IsTypedArrayOrRabGsabTypedArrayElementsKind(ElementsKind kind)
bool IsStringWrapperElementsKind(ElementsKind kind)
bool IsAnyNonextensibleElementsKindUnchecked(ElementsKind kind)
constexpr bool IsDoubleElementsKind(ElementsKind kind)
constexpr int kElementsKindCount
ElementsKind GetMoreGeneralElementsKind(ElementsKind from_kind, ElementsKind to_kind)
bool IsTransitionableFastElementsKind(ElementsKind from_kind)
ElementsKind GetInitialFastElementsKind()
constexpr int ElementsKindToByteSize(ElementsKind elements_kind)
ElementsKind FastSmiToObjectElementsKind(ElementsKind from_kind)
bool UnionElementsKindUptoPackedness(ElementsKind *a_out, ElementsKind b)
#define DCHECK_IMPLIES(v1, v2)
Definition logging.h:493
#define CONSTEXPR_UNREACHABLE()
Definition logging.h:73
#define DCHECK(condition)
Definition logging.h:482
#define V8_EXPORT_PRIVATE
Definition macros.h:460