v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
dataview-lowering-reducer.h
Go to the documentation of this file.
1// Copyright 2023 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_COMPILER_TURBOSHAFT_DATAVIEW_LOWERING_REDUCER_H_
6#define V8_COMPILER_TURBOSHAFT_DATAVIEW_LOWERING_REDUCER_H_
7
9
11
13
14template <typename Next>
15class DataViewLoweringReducer : public Next {
16 public:
17 TURBOSHAFT_REDUCER_BOILERPLATE(DataViewLowering)
18
20 switch (type) {
24 return value;
26 return __ Word32ShiftRightArithmetic(__ Word32ReverseBytes(value), 16);
29 return __ Word32ShiftRightLogical(__ Word32ReverseBytes(value), 16);
32 return __ Word32ReverseBytes(value);
34 V<Word32> bytes = __ BitcastFloat32ToWord32(value);
35 V<Word32> reversed = __ Word32ReverseBytes(bytes);
36 return __ BitcastWord32ToFloat32(reversed);
37 }
39 if constexpr (Is64()) {
40 V<Word64> bytes = __ BitcastFloat64ToWord64(value);
41 V<Word64> reversed = __ Word64ReverseBytes(bytes);
42 return __ BitcastWord64ToFloat64(reversed);
43 } else {
44 V<Word32> reversed_lo =
45 __ Word32ReverseBytes(__ Float64ExtractLowWord32(value));
46 V<Word32> reversed_hi =
47 __ Word32ReverseBytes(__ Float64ExtractHighWord32(value));
48 return __ BitcastWord32PairToFloat64(reversed_lo, reversed_hi);
49 }
50 }
53 return __ Word64ReverseBytes(value);
54 }
55 }
56
59 V<Word32> is_little_endian,
60 ExternalArrayType element_type) {
61 const MachineType machine_type =
63 const MemoryRepresentation memory_rep =
65
66 OpIndex value =
67 __ Load(storage, index,
68 LoadOp::Kind::MaybeUnaligned(memory_rep).NotLoadEliminable(),
69 memory_rep);
70
71 Variable result = Asm().NewLoopInvariantVariable(
73 IF (is_little_endian) {
74#if V8_TARGET_LITTLE_ENDIAN
75 Asm().SetVariable(result, value);
76#else
77 Asm().SetVariable(result, BuildReverseBytes(element_type, value));
78#endif // V8_TARGET_LITTLE_ENDIAN
79 } ELSE {
80#if V8_TARGET_LITTLE_ENDIAN
81 Asm().SetVariable(result, BuildReverseBytes(element_type, value));
82#else
83 Asm().SetVariable(result, value);
84#endif // V8_TARGET_LITTLE_ENDIAN
85 }
86
87 // We need to keep the {object} (either the JSArrayBuffer or the JSDataView)
88 // alive so that the GC will not release the JSArrayBuffer (if there's any)
89 // as long as we are still operating on it.
90 __ Retain(object);
91 return Asm().GetVariable(result);
92 }
93
96 V<Word32> is_little_endian,
97 ExternalArrayType element_type) {
98 const MachineType machine_type =
100
101 Variable value_to_store = Asm().NewLoopInvariantVariable(
103 IF (is_little_endian) {
104#if V8_TARGET_LITTLE_ENDIAN
105 Asm().SetVariable(value_to_store, value);
106#else
107 Asm().SetVariable(value_to_store, BuildReverseBytes(element_type, value));
108#endif // V8_TARGET_LITTLE_ENDIAN
109 } ELSE {
110#if V8_TARGET_LITTLE_ENDIAN
111 Asm().SetVariable(value_to_store, BuildReverseBytes(element_type, value));
112#else
113 Asm().SetVariable(value_to_store, value);
114#endif // V8_TARGET_LITTLE_ENDIAN
115 }
116
117 const MemoryRepresentation memory_rep =
119 __ Store(storage, index, Asm().GetVariable(value_to_store),
120 StoreOp::Kind::MaybeUnaligned(memory_rep).NotLoadEliminable(),
122
123 // We need to keep the {object} (either the JSArrayBuffer or the JSDataView)
124 // alive so that the GC will not release the JSArrayBuffer (if there's any)
125 // as long as we are still operating on it.
126 __ Retain(object);
127 return {};
128 }
129};
130
132
133} // namespace v8::internal::compiler::turboshaft
134
135#endif // V8_COMPILER_TURBOSHAFT_DATAVIEW_LOWERING_REDUCER_H_
#define REDUCE(operation)
#define ELSE
#define IF(...)
static ElementAccess ForTypedArrayElement(ExternalArrayType type, bool is_external)
OpIndex REDUCE StoreDataViewElement(V< Object > object, V< WordPtr > storage, V< WordPtr > index, OpIndex value, V< Word32 > is_little_endian, ExternalArrayType element_type)
OpIndex BuildReverseBytes(ExternalArrayType type, OpIndex value)
OpIndex REDUCE LoadDataViewElement(V< Object > object, V< WordPtr > storage, V< WordPtr > index, V< Word32 > is_little_endian, ExternalArrayType element_type)
static MemoryRepresentation FromMachineType(MachineType type)
#define TURBOSHAFT_REDUCER_BOILERPLATE(Name)
Definition assembler.h:823
ZoneVector< RpoNumber > & result
constexpr RegisterRepresentation RegisterRepresentationForArrayType(ExternalArrayType array_type)
@ kExternalFloat64Array
Definition globals.h:2461
@ kExternalUint32Array
Definition globals.h:2458
@ kExternalBigInt64Array
Definition globals.h:2463
@ kExternalInt32Array
Definition globals.h:2457
@ kExternalInt8Array
Definition globals.h:2453
@ kExternalUint8ClampedArray
Definition globals.h:2462
@ kExternalUint8Array
Definition globals.h:2454
@ kExternalUint16Array
Definition globals.h:2456
@ kExternalFloat32Array
Definition globals.h:2460
@ kExternalInt16Array
Definition globals.h:2455
@ kExternalFloat16Array
Definition globals.h:2459
@ kExternalBigUint64Array
Definition globals.h:2464
return value
Definition map-inl.h:893
constexpr bool Is64()
i::Address Load(i::Address address)
Definition unwinder.cc:19
static constexpr Kind MaybeUnaligned(MemoryRepresentation rep)