5#ifndef V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_
6#define V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_
8#include <initializer_list>
34class SourcePositionTable;
53 MachineOperatorBuilder::Flag::kNoFlags,
56 FullUnalignedAccessSupport());
77 TFGraph* ExportForOptimization();
85 Node* UndefinedConstant();
89 return IntPtrConstant(
reinterpret_cast<intptr_t
>(value));
94 : Int32Constant(
static_cast<int>(value));
98 return AddNode(common()->Int32Constant(value));
101 return AddNode(machine()->StackSlot(rep, alignment));
104 return AddNode(machine()->StackSlot(size, alignment));
107 return AddNode(common()->Int64Constant(value));
113 return AddNode(common()->Float32Constant(value));
116 return AddNode(common()->Float64Constant(value));
119 return AddNode(common()->HeapConstant(
object));
122 return AddNode(common()->ExternalConstant(address));
125 return AddNode(common()->RelocatableInt32Constant(value, rmode));
128 return AddNode(common()->RelocatableInt64Constant(value, rmode));
132 return AddNode(common()->Projection(index), a);
137 return Load(type,
base, IntPtrConstant(0));
140 const Operator* op = machine()->Load(type);
141 Node* load = AddNode(op,
base, index);
145 return LoadImmutable(type,
base, IntPtrConstant(0));
148 const Operator* op = machine()->LoadImmutable(type);
149 return AddNode(op,
base, index);
153 if (
m.Is(HeapObject::kMapOffset))
return true;
155 if (node->opcode() == IrOpcode::kPhi) {
157 if (!
Int64Matcher(input).
Is(HeapObject::kMapOffset))
return false;
172 type == MachineType::MapInHeader());
181 Node* tagged = LoadFromObject(MachineType::Int32(),
base,
offset);
182 Node* trusted_cage_base =
183 LoadImmutable(MachineType::Pointer(), LoadRootRegister(),
184 IntPtrConstant(IsolateData::trusted_cage_base_offset()));
185 return BitcastWordToTagged(
186 WordOr(trusted_cage_base, ChangeUint32ToUint64(tagged)));
188 return LoadFromObject(MachineType::AnyTagged(),
base,
offset);
194 return Store(rep,
base, IntPtrConstant(0), value, write_barrier);
203 ObjectAccess access = {MachineType::TypeForRepresentation(rep),
211 DCHECK_NE(rep, MachineRepresentation::kIndirectPointer);
215 MachineType::TypeForRepresentation(rep),
216 write_barrier,
"OptimizedStoreField")),
223 DCHECK(write_barrier == WriteBarrierKind::kNoWriteBarrier ||
224 write_barrier == WriteBarrierKind::kIndirectPointerWriteBarrier);
226 OptionalMapRef(), Type::Any(),
227 MachineType::IndirectPointer(), write_barrier,
228 "OptimizedStoreIndirectPointerField");
229 access.indirect_pointer_tag = tag;
230 AddNode(
simplified()->StoreField(access),
object, value);
234 AddNode(
simplified()->StoreField(AccessBuilder::ForMap(write_barrier)),
243 return UnalignedLoad(type,
base, IntPtrConstant(0));
249 if (machine()->UnalignedLoadSupported(rep)) {
250 return AddNode(machine()->
Load(type),
base, index);
252 return AddNode(machine()->UnalignedLoad(type),
base, index);
256 return UnalignedStore(rep,
base, IntPtrConstant(0), value);
262 if (machine()->UnalignedStoreSupported(rep)) {
264 rep, WriteBarrierKind::kNoWriteBarrier)),
276 MachineRepresentation::kWord64);
277 return AddNode(machine()->Word32AtomicLoad(rep),
base, index);
281 if (machine()->
Is64()) {
285 return AddNode(machine()->Word64AtomicLoad(rep),
base, index);
287 return AddNode(machine()->Word32AtomicPairLoad(rep.
order()),
base, index);
291#if defined(V8_TARGET_BIG_ENDIAN)
292#define VALUE_HALVES value_high, value
294#define VALUE_HALVES value, value_high
299 DCHECK(!IsMapOffsetConstantMinusTag(index));
300 DCHECK_NE(params.representation(), MachineRepresentation::kWord64);
301 return AddNode(machine()->Word32AtomicStore(params),
base, index, value);
306 if (machine()->
Is64()) {
308 return AddNode(machine()->Word64AtomicStore(params),
base, index, value);
310 DCHECK(params.representation() != MachineRepresentation::kTaggedPointer &&
311 params.representation() != MachineRepresentation::kTaggedSigned &&
312 params.representation() != MachineRepresentation::kTagged);
313 return AddNode(machine()->Word32AtomicPairStore(params.order()),
base,
318#define ATOMIC_FUNCTION(name) \
319 Node* Atomic##name(MachineType type, Node* base, Node* index, Node* value) { \
320 DCHECK_NE(type.representation(), MachineRepresentation::kWord64); \
321 return AddNode(machine()->Word32Atomic##name(type), base, index, value); \
323 Node* Atomic##name##64(Node * base, Node * index, Node * value, \
324 Node * value_high) { \
325 if (machine()->Is64()) { \
326 DCHECK_NULL(value_high); \
330 return AddNode(machine()->Word64Atomic##name(MachineType::Uint64()), \
331 base, index, value); \
333 return AddNode(machine()->Word32AtomicPair##name(), base, index, \
343#undef ATOMIC_FUNCTION
348 DCHECK_NE(type.representation(), MachineRepresentation::kWord64);
349 return AddNode(machine()->Word32AtomicCompareExchange(type),
base, index,
350 old_value, new_value);
354 Node* old_value_high,
Node* new_value,
355 Node* new_value_high) {
356 if (machine()->
Is64()) {
363 machine()->Word64AtomicCompareExchange(MachineType::Uint64()),
base,
364 index, old_value, new_value);
366 return AddNode(machine()->Word32AtomicPairCompareExchange(),
base, index,
367 old_value, old_value_high, new_value, new_value_high);
372 return AddNode(machine()->MemoryBarrier(order));
377 return AddNode(machine()->WordAnd(), a, b);
381 return AddNode(machine()->WordXor(), a, b);
384 return AddNode(machine()->WordShl(), a, b);
387 return AddNode(machine()->WordShr(), a, b);
390 return AddNode(machine()->WordSar(), a, b);
393 return AddNode(machine()->WordSarShiftOutZeros(), a, b);
396 return AddNode(machine()->WordRor(), a, b);
399 return AddNode(machine()->WordEqual(), a, b);
402 return Word32BinaryNot(WordEqual(a, b));
405 if (machine()->Is32()) {
406 return Word32BitwiseNot(a);
413 return AddNode(machine()->Word32And(), a, b);
416 return AddNode(machine()->Word32Or(), a, b);
419 return AddNode(machine()->Word32Xor(), a, b);
422 return AddNode(machine()->Word32Shl(), a, b);
425 return AddNode(machine()->Word32Shr(), a, b);
428 return AddNode(machine()->Word32Sar(), a, b);
431 return AddNode(machine()->Word32SarShiftOutZeros(), a, b);
434 return AddNode(machine()->Word32Ror(), a, b);
438 return AddNode(machine()->Word32Equal(), a, b);
441 return Word32BinaryNot(Word32Equal(a, b));
447 return AddNode(machine()->Word64And(), a, b);
450 return AddNode(machine()->Word64Or(), a, b);
453 return AddNode(machine()->Word64Xor(), a, b);
456 return AddNode(machine()->Word64Shl(), a, b);
459 return AddNode(machine()->Word64Shr(), a, b);
462 return AddNode(machine()->Word64Sar(), a, b);
465 return AddNode(machine()->Word64Ror(), a, b);
469 return AddNode(machine()->Word64Equal(), a, b);
472 return Word32BinaryNot(Word64Equal(a, b));
477 return AddNode(machine()->Int32Add(), a, b);
480 return AddNode(machine()->Int32AddWithOverflow(), a, b);
483 return AddNode(machine()->Int32Sub(), a, b);
486 return AddNode(machine()->Int32SubWithOverflow(), a, b);
489 return AddNode(machine()->Int32Mul(), a, b);
492 return AddNode(machine()->Int32MulHigh(), a, b);
495 return AddNode(machine()->Int32MulWithOverflow(), a, b);
498 return AddNode(machine()->Int32Div(), a, b);
501 return AddNode(machine()->Int32Mod(), a, b);
504 return AddNode(machine()->Int32LessThan(), a, b);
507 return AddNode(machine()->Int32LessThanOrEqual(), a, b);
510 return AddNode(machine()->Uint32Div(), a, b);
513 return AddNode(machine()->Uint32LessThan(), a, b);
516 return AddNode(machine()->Uint32LessThanOrEqual(), a, b);
519 return AddNode(machine()->Uint32Mod(), a, b);
522 return AddNode(machine()->Uint32MulHigh(), a, b);
526 return Int32LessThanOrEqual(b, a);
530 return Uint32LessThanOrEqual(b, a);
535 return AddNode(machine()->Int64Add(), a, b);
538 return AddNode(machine()->Int64AddWithOverflow(), a, b);
541 return AddNode(machine()->Int64Sub(), a, b);
544 return AddNode(machine()->Int64SubWithOverflow(), a, b);
547 return AddNode(machine()->Int64Mul(), a, b);
550 return AddNode(machine()->Int64MulHigh(), a, b);
553 return AddNode(machine()->Uint64MulHigh(), a, b);
556 return AddNode(machine()->Int64MulWithOverflow(), a, b);
559 return AddNode(machine()->Int64Div(), a, b);
562 return AddNode(machine()->Int64Mod(), a, b);
566 return AddNode(machine()->Int64LessThan(), a, b);
569 return AddNode(machine()->Int64LessThanOrEqual(), a, b);
572 return AddNode(machine()->Uint64LessThan(), a, b);
575 return AddNode(machine()->Uint64LessThanOrEqual(), a, b);
579 return Int64LessThanOrEqual(b, a);
583 return Uint64LessThanOrEqual(b, a);
586 return AddNode(machine()->Uint64Div(), a, b);
589 return AddNode(machine()->Uint64Mod(), a, b);
592 return AddNode(machine()->Int32PairAdd(), a_low, a_high, b_low, b_high);
595 return AddNode(machine()->Int32PairSub(), a_low, a_high, b_low, b_high);
598 return AddNode(machine()->Int32PairMul(), a_low, a_high, b_low, b_high);
601 return AddNode(machine()->Word32PairShl(), low_word, high_word, shift);
604 return AddNode(machine()->Word32PairShr(), low_word, high_word, shift);
607 return AddNode(machine()->Word32PairSar(), low_word, high_word, shift);
610 return AddNode(machine()->Word32Popcnt().op(), a);
613 return AddNode(machine()->Word64Popcnt().op(), a);
619 return AddNode(machine()->Word32Select().op(),
condition, b, c);
623 return AddNode(machine()->Word64Select().op(),
condition, b, c);
628 machine()->StackPointerGreaterThan(StackCheckKind::kCodeStubAssembler),
632#define INTPTR_BINOP(prefix, name) \
633 Node* IntPtr##name(Node* a, Node* b) { \
634 return kSystemPointerSize == 8 ? prefix##64##name(a, b) \
635 : prefix##32##name(a, b); \
656#define UINTPTR_BINOP(prefix, name) \
657 Node* UintPtr##name(Node* a, Node* b) { \
658 return kSystemPointerSize == 8 ? prefix##64##name(a, b) \
659 : prefix##32##name(a, b); \
671 return AddNode(machine()->Int32AbsWithOverflow().op(), a);
675 return AddNode(machine()->Int64AbsWithOverflow().op(), a);
680 : Int32AbsWithOverflow(a);
684 return AddNode(machine()->Float32Add(), a, b);
687 return AddNode(machine()->Float32Sub(), a, b);
690 return AddNode(machine()->Float32Mul(), a, b);
693 return AddNode(machine()->Float32Div(), a, b);
699 return AddNode(machine()->Float32Equal(), a, b);
702 return Word32BinaryNot(Float32Equal(a, b));
705 return AddNode(machine()->Float32LessThan(), a, b);
708 return AddNode(machine()->Float32LessThanOrEqual(), a, b);
712 return Float32LessThanOrEqual(b, a);
715 return AddNode(machine()->Float32Max(), a, b);
718 return AddNode(machine()->Float32Min(), a, b);
721 return AddNode(machine()->
Float64Add(), a, b);
724 return AddNode(machine()->Float64Sub(), a, b);
727 return AddNode(machine()->Float64Mul(), a, b);
730 return AddNode(machine()->Float64Div(), a, b);
733 return AddNode(machine()->Float64Mod(), a, b);
736 return AddNode(machine()->Float64Max(), a, b);
739 return AddNode(machine()->Float64Min(), a, b);
750 return AddNode(machine()->Float64Atan2(), a, b);
762 return AddNode(machine()->Float64Pow(), a, b);
770 return AddNode(machine()->Float64Equal(), a, b);
773 return Word32BinaryNot(Float64Equal(a, b));
776 return AddNode(machine()->Float64LessThan(), a, b);
779 return AddNode(machine()->Float64LessThanOrEqual(), a, b);
783 return Float64LessThanOrEqual(b, a);
786 return AddNode(machine()->Float32Select().op(),
condition, b, c);
789 return AddNode(machine()->Float64Select().op(),
condition, b, c);
794 return AddNode(machine()->BitcastTaggedToWord(), a);
797 return AddNode(machine()->BitcastTaggedToWordForTagAndSmiBits(), a);
800 return AddNode(machine()->BitcastMaybeObjectToWord(), a);
803 return AddNode(machine()->BitcastWordToTagged(), a);
806 return AddNode(machine()->BitcastWordToTaggedSigned(), a);
809 return AddNode(machine()->TruncateFloat64ToWord32(), a);
812 return AddNode(machine()->ChangeFloat32ToFloat64(), a);
815 return AddNode(machine()->ChangeInt32ToFloat64(), a);
818 return AddNode(machine()->ChangeInt64ToFloat64(), a);
821 return AddNode(machine()->ChangeUint32ToFloat64(), a);
824 return AddNode(machine()->ChangeFloat64ToInt32(), a);
827 return AddNode(machine()->ChangeFloat64ToInt64(), a);
830 return AddNode(machine()->ChangeFloat64ToUint32(), a);
833 return AddNode(machine()->ChangeFloat64ToUint64(), a);
836 return AddNode(machine()->TruncateFloat64ToUint32(), a);
839 return AddNode(machine()->TruncateFloat32ToInt32(
kind), a);
842 return AddNode(machine()->TruncateFloat32ToUint32(
kind), a);
845 return AddNode(machine()->TruncateFloat64ToInt64(
kind), a);
848 return AddNode(machine()->TryTruncateFloat32ToInt64(), a);
851 return AddNode(machine()->TryTruncateFloat64ToInt64(), a);
854 return AddNode(machine()->TryTruncateFloat32ToUint64(), a);
857 return AddNode(machine()->TryTruncateFloat64ToUint64(), a);
860 return AddNode(machine()->TryTruncateFloat64ToInt32(), a);
863 return AddNode(machine()->TryTruncateFloat64ToUint32(), a);
866 return AddNode(machine()->ChangeInt32ToInt64(), a);
870 return ChangeInt32ToInt64(a);
876 return AddNode(machine()->ChangeUint32ToUint64(), a);
879 return AddNode(machine()->TruncateFloat64ToFloat32(), a);
882 return AddNode(machine()->TruncateFloat64ToFloat16RawBits().placeholder(),
886 return AddNode(machine()->TruncateInt64ToInt32(), a);
889 return AddNode(machine()->RoundFloat64ToInt32(), a);
892 return AddNode(machine()->RoundInt32ToFloat32(), a);
895 return AddNode(machine()->RoundInt64ToFloat32(), a);
898 return AddNode(machine()->RoundInt64ToFloat64(), a);
901 return AddNode(machine()->RoundUint32ToFloat32(), a);
904 return AddNode(machine()->RoundUint64ToFloat32(), a);
907 return AddNode(machine()->RoundUint64ToFloat64(), a);
910 return AddNode(machine()->BitcastFloat32ToInt32(), a);
913 return AddNode(machine()->BitcastFloat64ToInt64(), a);
916 return AddNode(machine()->BitcastInt32ToFloat32(), a);
919 return AddNode(machine()->BitcastInt64ToFloat64(), a);
922 return AddNode(machine()->Float32RoundDown().op(), a);
925 return AddNode(machine()->Float64RoundDown().placeholder(), a);
928 return AddNode(machine()->Float32RoundUp().op(), a);
931 return AddNode(machine()->Float64RoundUp().placeholder(), a);
934 return AddNode(machine()->Float32RoundTruncate().op(), a);
937 return AddNode(machine()->Float64RoundTruncate().placeholder(), a);
940 return AddNode(machine()->Float64RoundTiesAway().op(), a);
943 return AddNode(machine()->Float32RoundTiesEven().op(), a);
946 return AddNode(machine()->Float64RoundTiesEven().placeholder(), a);
949 return AddNode(machine()->Word32ReverseBytes(), a);
952 return AddNode(machine()->Word64ReverseBytes(), a);
957 return AddNode(machine()->Float64ExtractLowWord32(), a);
960 return AddNode(machine()->Float64ExtractHighWord32(), a);
963 return AddNode(machine()->Float64InsertLowWord32(), a, b);
966 return AddNode(machine()->Float64InsertHighWord32(), a, b);
969 return AddNode(machine()->Float64SilenceNaN(), a);
975 return AddNode(machine()->LoadParentFramePointer());
982 return AddNode(machine()->I8x16Eq(), a, b);
985#if V8_ENABLE_WEBASSEMBLY
987 Node* S128Const(
const uint8_t value[16]) {
988 return AddNode(machine()->S128Const(value));
990 Node* I64x2Splat(Node* a) {
return AddNode(machine()->I64x2Splat(), a); }
991 Node* I64x2SplatI32Pair(Node* a, Node* b) {
992 return AddNode(machine()->I64x2SplatI32Pair(), a, b);
994 Node* I32x4Splat(Node* a) {
return AddNode(machine()->I32x4Splat(), a); }
995 Node* I16x8Splat(Node* a) {
return AddNode(machine()->I16x8Splat(), a); }
997 Node* LoadStackPointer() {
return AddNode(machine()->LoadStackPointer()); }
998 void SetStackPointer(Node* ptr) {
999 AddNode(machine()->SetStackPointer(), ptr);
1004 Node* TargetParameter();
1005 Node* Parameter(
size_t index);
1010 return Load(type, PointerConstant(address), Int32Constant(
offset));
1017 return UnalignedLoad(type, PointerConstant(address), Int32Constant(
offset));
1021 return UnalignedStore(rep, PointerConstant(address), node);
1024 return HeapConstant(
isolate()->factory()->InternalizeUtf8String(
string));
1030 Node*
const* inputs);
1035 Node*
const* inputs);
1040 Node*
const* inputs);
1046 template <
class... CArgs>
1050 std::conjunction_v<std::is_convertible<CArgs, CFunctionArg>...>,
1051 "invalid argument types");
1052 return CallCFunction(function, return_type, {cargs...});
1056 std::initializer_list<CFunctionArg>
args);
1059 template <
class... CArgs>
1064 std::conjunction_v<std::is_convertible<CArgs, CFunctionArg>...>,
1065 "invalid argument types");
1066 return CallCFunctionWithoutFunctionDescriptor(function, return_type,
1072 std::initializer_list<CFunctionArg>
args);
1075 template <
class... CArgs>
1081 std::conjunction_v<std::is_convertible<CArgs, CFunctionArg>...>,
1082 "invalid argument types");
1083 return CallCFunctionWithCallerSavedRegisters(function, return_type, mode,
1089 std::initializer_list<CFunctionArg>
args);
1103 void Return(
Node* value);
1108 void PopAndReturn(
Node* pop,
Node* value);
1114 void AbortCSADcheck(
Node* message);
1117 void Comment(
const std::string& msg);
1118 void StaticAssert(
Node* value,
const char* source);
1123 void PrintCurrentBlock(std::ostream& os);
1134 return AddNode(common()->Phi(rep, 2), n1, n2,
graph()->
start());
1137 return AddNode(common()->Phi(rep, 3), n1, n2, n3,
graph()->
start());
1140 return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4,
graph()->
start());
1143 void AppendPhiInput(
Node* phi,
Node* new_input);
1153 return AddNode(op, 0,
static_cast<Node* const*
>(
nullptr));
1156 template <
class... TArgs>
1159 return AddNode(op,
sizeof...(
args) + 1, buffer);
1162 void SetCurrentExternalSourcePosition(
FileAndLine file_and_line);
1163 FileAndLine GetCurrentExternalSourcePosition()
const;
1202 void MakeReschedulable();
1203 Node* CreateNodeFromPredecessors(
const std::vector<BasicBlock*>& predecessors,
1204 const std::vector<Node*>& sidetable,
1206 const std::vector<Node*>& additional_inputs);
1207 void MakePhiBinary(
Node* phi,
int split_point,
Node* left_control,
1208 Node* right_control);
1209 void MarkControlDeferred(
Node* control_input);
1250 bool bound_ =
false;
SimplifiedOperatorBuilder * simplified
constexpr MachineRepresentation representation() const
LoadRepresentation representation() const
AtomicMemoryOrder order() const
Node * Int64Sub(Node *a, Node *b)
Node * Float64Sqrt(Node *a)
Node * CallCFunction(Node *function, std::optional< MachineType > return_type, std::initializer_list< CFunctionArg > args)
Node * Float32Select(Node *condition, Node *b, Node *c)
Node * Word32Clz(Node *a)
Node * HeapConstant(Handle< HeapObject > object)
Node * Uint64MulHigh(Node *a, Node *b)
Node * Float32Add(Node *a, Node *b)
Node * Float64Min(Node *a, Node *b)
Node * Float64LessThanOrEqual(Node *a, Node *b)
Node * Float32RoundUp(Node *a)
Node * Word32And(Node *a, Node *b)
Node * RelocatableInt32Constant(int32_t value, RelocInfo::Mode rmode)
Node * Float32Sub(Node *a, Node *b)
Node * Float32NotEqual(Node *a, Node *b)
void StoreToObject(MachineRepresentation rep, Node *object, Node *offset, Node *value, WriteBarrierKind write_barrier)
Node * Word32BitwiseNot(Node *a)
Node * Int64MulHigh(Node *a, Node *b)
Node * ChangeFloat64ToUint32(Node *a)
Node * Uint64LessThan(Node *a, Node *b)
Node * Float64LessThan(Node *a, Node *b)
void Deoptimize(Node *state)
Node * Word32Select(Node *condition, Node *b, Node *c)
Node * Float64RoundTiesAway(Node *a)
Node * Float64Log(Node *a)
Node * Float64Asinh(Node *a)
Node * Float64Log2(Node *a)
Node * Word32Ctz(Node *a)
Node * Store(MachineRepresentation rep, Node *base, Node *index, Node *value, WriteBarrierKind write_barrier)
Node * Word32NotEqual(Node *a, Node *b)
Node * BitcastFloat64ToInt64(Node *a)
Node * Int64GreaterThan(Node *a, Node *b)
Node * Float32Equal(Node *a, Node *b)
Node * UnalignedStore(MachineRepresentation rep, Node *base, Node *index, Node *value)
Node * Int32MulWithOverflow(Node *a, Node *b)
Node * Word64Shl(Node *a, Node *b)
Node * Uint64GreaterThan(Node *a, Node *b)
Node * TruncateFloat64ToFloat32(Node *a)
Node * Float64Sinh(Node *a)
std::pair< MachineType, Node * > CFunctionArg
Node * Float64Atan2(Node *a, Node *b)
Node * Float64Atanh(Node *a)
void OptimizedStoreIndirectPointerField(Node *object, int offset, IndirectPointerTag tag, Node *value, WriteBarrierKind write_barrier)
Node * Float64RoundUp(Node *a)
Node * CallCFunctionWithCallerSavedRegisters(Node *function, MachineType return_type, SaveFPRegsMode mode, std::initializer_list< CFunctionArg > args)
Node * BitcastWordToTagged(Node *a)
Node * Int32GreaterThanOrEqual(Node *a, Node *b)
Node * BitcastTaggedToWord(Node *a)
Node * Int64LessThanOrEqual(Node *a, Node *b)
Node * Word64And(Node *a, Node *b)
Node * Word64NotEqual(Node *a, Node *b)
Node * Float64RoundTruncate(Node *a)
Node * Float64Acosh(Node *a)
Node * TryTruncateFloat64ToInt32(Node *a)
CommonOperatorBuilder common_
Node * StackSlot(int size, int alignment)
Node * Float64Div(Node *a, Node *b)
Node * TruncateFloat64ToUint32(Node *a)
Node * BitcastWordToTaggedSigned(Node *a)
Node * RoundUint64ToFloat64(Node *a)
Node * TryTruncateFloat32ToInt64(Node *a)
Node * Int32Constant(int32_t value)
Node * BitcastMaybeObjectToWord(Node *a)
void OptimizedStoreField(MachineRepresentation rep, Node *object, int offset, Node *value, WriteBarrierKind write_barrier)
void OptimizedStoreMap(Node *object, Node *value, WriteBarrierKind write_barrier=kMapWriteBarrier)
Node * AtomicLoad64(AtomicLoadParameters rep, Node *base, Node *index)
Node * Word32Ror(Node *a, Node *b)
Node * Float64Tanh(Node *a)
Node * Float64InsertHighWord32(Node *a, Node *b)
Node * ChangeInt32ToInt64(Node *a)
Node * Load(MachineType type, Node *base, Node *index)
Node * AddNode(const Operator *op, Node *n1, TArgs... args)
Node * WordNotEqual(Node *a, Node *b)
Node * I8x16BitMask(Node *a)
Node * Int32AbsWithOverflow(Node *a)
Node * Word64Clz(Node *a)
Node * AtomicLoad(AtomicLoadParameters rep, Node *base, Node *index)
Node * Float32Constant(float value)
Isolate * isolate() const
Node * Word32Xor(Node *a, Node *b)
Node * Phi(MachineRepresentation rep, Node *n1, Node *n2)
Node * AtomicStore64(AtomicStoreParameters params, Node *base, Node *index, Node *value, Node *value_high)
Node * TruncateFloat64ToInt64(Node *a, TruncateKind kind)
Node * Phi(MachineRepresentation rep, Node *n1, Node *n2, Node *n3, Node *n4)
Node * Word64Ctz(Node *a)
Node * Word64Popcnt(Node *a)
Node * WordAnd(Node *a, Node *b)
Node * LoadParentFramePointer()
Node * TruncateFloat64ToFloat16RawBits(Node *a)
Node * Word64Sar(Node *a, Node *b)
Node * Word32SarShiftOutZeros(Node *a, Node *b)
SimplifiedOperatorBuilder simplified_
Node * UnalignedLoadFromPointer(void *address, MachineType type, int32_t offset=0)
Node * Float64RoundDown(Node *a)
Node * RoundUint32ToFloat32(Node *a)
Node * Word32PairShl(Node *low_word, Node *high_word, Node *shift)
Node * Float64ExtractLowWord32(Node *a)
Node * Word32Popcnt(Node *a)
MachineOperatorBuilder * machine()
Node * Int32Sub(Node *a, Node *b)
Node * Float32RoundDown(Node *a)
BasicBlock * current_block_
Node * Float64Acos(Node *a)
Node * TryTruncateFloat64ToUint32(Node *a)
Node * Word32BinaryNot(Node *a)
Node * Int32LessThanOrEqual(Node *a, Node *b)
Node * BitcastTaggedToWordForTagAndSmiBits(Node *a)
Node * IntPtrConstant(intptr_t value)
Node * Word64Select(Node *condition, Node *b, Node *c)
SimplifiedOperatorBuilder * simplified()
Node * Float64Neg(Node *a)
Node * Float64Asin(Node *a)
CommonOperatorBuilder * common()
Node * Uint64GreaterThanOrEqual(Node *a, Node *b)
Node * Word32Equal(Node *a, Node *b)
Node * Float64Add(Node *a, Node *b)
Node * Word64ReverseBytes(Node *a)
Node * Float64Cos(Node *a)
Node * Int32Div(Node *a, Node *b)
Node * Float64Tan(Node *a)
Node * Float32GreaterThanOrEqual(Node *a, Node *b)
Node * Word32PairSar(Node *low_word, Node *high_word, Node *shift)
Node * Word32ReverseBytes(Node *a)
Node * IntPtrAbsWithOverflow(Node *a)
Node * Uint64Div(Node *a, Node *b)
Node * BitcastFloat32ToInt32(Node *a)
Node * RoundInt32ToFloat32(Node *a)
Node * dynamic_js_parameter_count()
MachineOperatorBuilder machine_
CallDescriptor * call_descriptor() const
Node * Int64MulWithOverflow(Node *a, Node *b)
Node * PointerConstant(void *value)
Node * ChangeFloat64ToInt32(Node *a)
Node * Word32Shr(Node *a, Node *b)
Node * LoadRootRegister()
SourcePositionTable * source_positions_
Node * Float32RoundTiesEven(Node *a)
Node * Int32GreaterThan(Node *a, Node *b)
Node * Float32Max(Node *a, Node *b)
Node * LoadImmutable(MachineType type, Node *base)
Node * Projection(int index, Node *a)
Node * Uint32GreaterThanOrEqual(Node *a, Node *b)
size_t parameter_count() const
Node * Word32Sar(Node *a, Node *b)
Node * Float64Max(Node *a, Node *b)
Node * UnalignedStoreToPointer(void *address, MachineRepresentation rep, Node *node)
Node * WordSar(Node *a, Node *b)
Node * Float64Equal(Node *a, Node *b)
Node * Int64Mod(Node *a, Node *b)
Node * Load(MachineType type, Node *base)
Node * AddNode(const Operator *op)
Node * NumberConstant(double value)
bool IsMapOffsetConstantMinusTag(Node *node)
Node * dynamic_js_parameter_count_
Node * RelocatableInt64Constant(int64_t value, RelocInfo::Mode rmode)
Node * Int32Mul(Node *a, Node *b)
Node * Int32Mod(Node *a, Node *b)
Node * AtomicCompareExchange64(Node *base, Node *index, Node *old_value, Node *old_value_high, Node *new_value, Node *new_value_high)
Node * ChangeUint32ToUint64(Node *a)
Node * Int64AbsWithOverflow(Node *a)
Node * Float32Neg(Node *a)
Node * Int32LessThan(Node *a, Node *b)
Node * Uint32Mod(Node *a, Node *b)
Node * StringConstant(const char *string)
Node * Float32GreaterThan(Node *a, Node *b)
Node * Float64InsertLowWord32(Node *a, Node *b)
Node * WordSarShiftOutZeros(Node *a, Node *b)
Node * Int64GreaterThanOrEqual(Node *a, Node *b)
Node * ChangeFloat64ToUint64(Node *a)
Node * Float32Div(Node *a, Node *b)
Node * BitcastInt32ToFloat32(Node *a)
Node * Float64Select(Node *condition, Node *b, Node *c)
Node * BitcastInt64ToFloat64(Node *a)
Node * Float64GreaterThan(Node *a, Node *b)
Node * AtomicCompareExchange(MachineType type, Node *base, Node *index, Node *old_value, Node *new_value)
Node * Store(MachineRepresentation rep, Node *base, Node *value, WriteBarrierKind write_barrier)
Node * ChangeFloat32ToFloat64(Node *a)
Node * ExternalConstant(ExternalReference address)
Node * Int32AddWithOverflow(Node *a, Node *b)
Node * Float64Mod(Node *a, Node *b)
Node * TryTruncateFloat64ToInt64(Node *a)
Node * Int64Div(Node *a, Node *b)
Node * ChangeFloat64ToInt64(Node *a)
Node * RoundFloat64ToInt32(Node *a)
Node * Float64Log10(Node *a)
Node * Word32Or(Node *a, Node *b)
Node * RoundInt64ToFloat32(Node *a)
Node * Uint32LessThan(Node *a, Node *b)
~RawMachineAssembler()=default
Node * Int32PairAdd(Node *a_low, Node *a_high, Node *b_low, Node *b_high)
Node * Int32MulHigh(Node *a, Node *b)
Node * Retain(Node *value)
RawMachineAssembler(const RawMachineAssembler &)=delete
Node * Word64Ror(Node *a, Node *b)
Node * TruncateFloat64ToWord32(Node *a)
Node * Float32RoundTruncate(Node *a)
Node * Uint64LessThanOrEqual(Node *a, Node *b)
Node * Int64Add(Node *a, Node *b)
Node * Int64AddWithOverflow(Node *a, Node *b)
Node * Int64Mul(Node *a, Node *b)
Node * Float64GreaterThanOrEqual(Node *a, Node *b)
Node * LoadImmutable(MachineType type, Node *base, Node *index)
Node * Float64Sin(Node *a)
Node * WordOr(Node *a, Node *b)
Node * Float64SilenceNaN(Node *a)
Node * UnalignedLoad(MachineType type, Node *base)
Node * Float64Abs(Node *a)
Node * Float64Log1p(Node *a)
Node * LoadFramePointer()
Node * Word64Or(Node *a, Node *b)
RawMachineAssembler & operator=(const RawMachineAssembler &)=delete
Node * TruncateFloat32ToInt32(Node *a, TruncateKind kind)
Node * TruncateFloat32ToUint32(Node *a, TruncateKind kind)
Node * WordXor(Node *a, Node *b)
Node * Uint32GreaterThan(Node *a, Node *b)
Node * Phi(MachineRepresentation rep, Node *n1, Node *n2, Node *n3)
Node * Int32PairMul(Node *a_low, Node *a_high, Node *b_low, Node *b_high)
Node * TruncateInt64ToInt32(Node *a)
Node * Float64Cbrt(Node *a)
Node * TryTruncateFloat64ToUint64(Node *a)
Node * AtomicStore(AtomicStoreParameters params, Node *base, Node *index, Node *value)
Node * Int32PairSub(Node *a_low, Node *a_high, Node *b_low, Node *b_high)
Node * CallCFunctionWithCallerSavedRegisters(Node *function, MachineType return_type, SaveFPRegsMode mode, CArgs... cargs)
Node * Float32Min(Node *a, Node *b)
Node * Int32SubWithOverflow(Node *a, Node *b)
Node * Word64Equal(Node *a, Node *b)
Node * I8x16Splat(Node *a)
Node * StackSlot(MachineRepresentation rep, int alignment=0)
Node * Float64Cosh(Node *a)
Node * ChangeInt32ToFloat64(Node *a)
bool IsMapOffsetConstant(Node *node)
Node * WordRor(Node *a, Node *b)
Node * Word64Not(Node *a)
Node * Float32Abs(Node *a)
Node * CallCFunctionWithoutFunctionDescriptor(Node *function, MachineType return_type, std::initializer_list< CFunctionArg > args)
Node * Uint32Div(Node *a, Node *b)
Node * MemoryBarrier(AtomicMemoryOrder order)
Node * Int32Add(Node *a, Node *b)
Node * Int64LessThan(Node *a, Node *b)
Node * ChangeUint32ToFloat64(Node *a)
Node * Int64Constant(int64_t value)
Node * StackPointerGreaterThan(Node *value)
Node * RoundUint64ToFloat32(Node *a)
Node * Float32Mul(Node *a, Node *b)
Node * WordShl(Node *a, Node *b)
Node * Float64Mul(Node *a, Node *b)
Node * Word64Shr(Node *a, Node *b)
Node * TryTruncateFloat32ToUint64(Node *a)
Node * CallCFunction(Node *function, std::optional< MachineType > return_type, CArgs... cargs)
Node * UnalignedStore(MachineRepresentation rep, Node *base, Node *value)
Node * Float32LessThan(Node *a, Node *b)
Node * LoadFromObject(MachineType type, Node *base, Node *offset)
Node * Uint32LessThanOrEqual(Node *a, Node *b)
Node * Float64ExtractHighWord32(Node *a)
Node * Float64RoundTiesEven(Node *a)
Node * Float64Atan(Node *a)
Node * Word32PairShr(Node *low_word, Node *high_word, Node *shift)
Node * ChangeInt64ToFloat64(Node *a)
Node * Float64Expm1(Node *a)
Node * Float32Sqrt(Node *a)
CallDescriptor * call_descriptor_
SourcePositionTable * source_positions()
void set_dynamic_js_parameter_count(Node *parameter_count)
Node * Uint32MulHigh(Node *a, Node *b)
Node * Uint64Mod(Node *a, Node *b)
Node * Float64Constant(double value)
Node * LoadFromPointer(void *address, MachineType type, int32_t offset=0)
Node * Int64SubWithOverflow(Node *a, Node *b)
Node * ChangeInt32ToIntPtr(Node *a)
Node * RoundInt64ToFloat64(Node *a)
Node * Word64Xor(Node *a, Node *b)
Node * I8x16Eq(Node *a, Node *b)
Node * Word32Shl(Node *a, Node *b)
Node * WordShr(Node *a, Node *b)
Node * Float64Pow(Node *a, Node *b)
Node * Float32LessThanOrEqual(Node *a, Node *b)
Node * WordEqual(Node *a, Node *b)
Node * StoreToPointer(void *address, MachineRepresentation rep, Node *node)
Node * Float64NotEqual(Node *a, Node *b)
Node * Float64Exp(Node *a)
Node * LoadProtectedPointerFromObject(Node *base, Node *offset)
Node * CallCFunctionWithoutFunctionDescriptor(Node *function, MachineType return_type, CArgs... cargs)
bool IsMapOffsetConstantMinusTag(int offset)
Node * UnalignedLoad(MachineType type, Node *base, Node *index)
Node * Float64Sub(Node *a, Node *b)
BasicBlock * block() const
RawMachineLabel(Type type=kNonDeferred)
RawMachineLabel(const RawMachineLabel &)=delete
RawMachineLabel & operator=(const RawMachineLabel &)=delete
#define ATOMIC_FUNCTION(name)
#define V8_MAP_PACKING_BOOL
#define COMPRESS_POINTERS_BOOL
base::Vector< const DirectHandle< Object > > args
std::optional< TNode< JSArray > > a
Schedule const *const schedule_
NumberConstant(std::numeric_limits< double >::quiet_NaN())) DEFINE_GETTER(EmptyStateValues
TNode< Float64T > Float64Add(TNode< Float64T > a, TNode< Float64T > b)
bool Is(IndirectHandle< U > value)
constexpr bool IsAnyTagged(MachineRepresentation rep)
constexpr bool IsAnyCompressed(MachineRepresentation rep)
constexpr int kSystemPointerSize
std::pair< const char *, int > FileAndLine
i::Address Load(i::Address address)
#define UINTPTR_BINOP(prefix, name)
#define INTPTR_BINOP(prefix, name)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE