diff options
Diffstat (limited to 'deps/v8/src/compiler/code-assembler.h')
-rw-r--r-- | deps/v8/src/compiler/code-assembler.h | 106 |
1 files changed, 38 insertions, 68 deletions
diff --git a/deps/v8/src/compiler/code-assembler.h b/deps/v8/src/compiler/code-assembler.h index cc432214aa..c9adb1601d 100644 --- a/deps/v8/src/compiler/code-assembler.h +++ b/deps/v8/src/compiler/code-assembler.h @@ -5,9 +5,9 @@ #ifndef V8_COMPILER_CODE_ASSEMBLER_H_ #define V8_COMPILER_CODE_ASSEMBLER_H_ +#include <initializer_list> #include <map> #include <memory> -#include <initializer_list> // Clients of this interface shouldn't depend on lots of compiler internals. // Do not include anything from src/compiler here! @@ -43,7 +43,6 @@ class BigInt; class CallInterfaceDescriptor; class Callable; class Factory; -class FinalizationGroupCleanupJobTask; class InterpreterData; class Isolate; class JSAsyncFunctionObject; @@ -317,6 +316,7 @@ class CompilationCacheTable; class Constructor; class Filler; class FunctionTemplateRareData; +class HeapNumber; class InternalizedString; class JSArgumentsObject; class JSArrayBufferView; @@ -324,7 +324,6 @@ class JSContextExtensionObject; class JSError; class JSSloppyArgumentsObject; class MapCache; -class MutableHeapNumber; class NativeContext; class NumberWrapper; class ScriptWrapper; @@ -645,7 +644,7 @@ TNode<Float64T> Float64Add(TNode<Float64T> a, TNode<Float64T> b); V(BitcastInt32ToFloat32, Float32T, Word32T) \ V(BitcastFloat32ToInt32, Uint32T, Float32T) \ V(RoundFloat64ToInt32, Int32T, Float64T) \ - V(RoundInt32ToFloat32, Int32T, Float32T) \ + V(RoundInt32ToFloat32, Float32T, Int32T) \ V(Float64SilenceNaN, Float64T, Float64T) \ V(Float64RoundDown, Float64T, Float64T) \ V(Float64RoundUp, Float64T, Float64T) \ @@ -657,7 +656,8 @@ TNode<Float64T> Float64Add(TNode<Float64T> a, TNode<Float64T> b); V(Int32AbsWithOverflow, PAIR_TYPE(Int32T, BoolT), Int32T) \ V(Int64AbsWithOverflow, PAIR_TYPE(Int64T, BoolT), Int64T) \ V(IntPtrAbsWithOverflow, PAIR_TYPE(IntPtrT, BoolT), IntPtrT) \ - V(Word32BinaryNot, BoolT, Word32T) + V(Word32BinaryNot, BoolT, Word32T) \ + V(StackPointerGreaterThan, BoolT, WordT) // A "public" interface used by components outside of compiler directory to // create code objects with TurboFan's backend. This class is mostly a thin @@ -688,6 +688,7 @@ class V8_EXPORT_PRIVATE CodeAssembler { const AssemblerOptions& options); bool Is64() const; + bool Is32() const; bool IsFloat64RoundUpSupported() const; bool IsFloat64RoundDownSupported() const; bool IsFloat64RoundTiesEvenSupported() const; @@ -738,7 +739,7 @@ class V8_EXPORT_PRIVATE CodeAssembler { if (std::is_same<PreviousType, MaybeObject>::value) { code_assembler_->GenerateCheckMaybeObjectIsObject(node_, location_); } - Node* function = code_assembler_->ExternalConstant( + TNode<ExternalReference> function = code_assembler_->ExternalConstant( ExternalReference::check_object_type()); code_assembler_->CallCFunction( function, MachineType::AnyTagged(), @@ -842,7 +843,6 @@ class V8_EXPORT_PRIVATE CodeAssembler { TNode<Oddball> BooleanConstant(bool value); TNode<ExternalReference> ExternalConstant(ExternalReference address); TNode<Float64T> Float64Constant(double value); - TNode<HeapNumber> NaNConstant(); TNode<BoolT> Int32TrueConstant() { return ReinterpretCast<BoolT>(Int32Constant(1)); } @@ -853,15 +853,10 @@ class V8_EXPORT_PRIVATE CodeAssembler { return value ? Int32TrueConstant() : Int32FalseConstant(); } - // TODO(jkummerow): The style guide wants pointers for output parameters. - // https://google.github.io/styleguide/cppguide.html#Output_Parameters - bool ToInt32Constant(Node* node, - int32_t& out_value); // NOLINT(runtime/references) - bool ToInt64Constant(Node* node, - int64_t& out_value); // NOLINT(runtime/references) + bool ToInt32Constant(Node* node, int32_t* out_value); + bool ToInt64Constant(Node* node, int64_t* out_value); + bool ToIntPtrConstant(Node* node, intptr_t* out_value); bool ToSmiConstant(Node* node, Smi* out_value); - bool ToIntPtrConstant(Node* node, - intptr_t& out_value); // NOLINT(runtime/references) bool IsUndefinedConstant(TNode<Object> node); bool IsNullConstant(TNode<Object> node); @@ -959,9 +954,6 @@ class V8_EXPORT_PRIVATE CodeAssembler { TNode<RawPtrT> LoadFramePointer(); TNode<RawPtrT> LoadParentFramePointer(); - // Access to the stack pointer - TNode<RawPtrT> LoadStackPointer(); - // Poison |value| on speculative paths. TNode<Object> TaggedPoisonOnSpeculation(SloppyTNode<Object> value); TNode<WordT> WordPoisonOnSpeculation(SloppyTNode<WordT> value); @@ -977,12 +969,24 @@ class V8_EXPORT_PRIVATE CodeAssembler { } Node* Load(MachineType type, Node* base, Node* offset, LoadSensitivity needs_poisoning = LoadSensitivity::kSafe); + template <class Type> + TNode<Type> Load(Node* base, + LoadSensitivity needs_poisoning = LoadSensitivity::kSafe) { + return UncheckedCast<Type>( + Load(MachineTypeOf<Type>::value, base, needs_poisoning)); + } + template <class Type> + TNode<Type> Load(Node* base, SloppyTNode<WordT> offset, + LoadSensitivity needs_poisoning = LoadSensitivity::kSafe) { + return UncheckedCast<Type>( + Load(MachineTypeOf<Type>::value, base, offset, needs_poisoning)); + } Node* AtomicLoad(MachineType type, Node* base, Node* offset); // Load uncompressed tagged value from (most likely off JS heap) memory // location. - Node* LoadFullTagged( + TNode<Object> LoadFullTagged( Node* base, LoadSensitivity needs_poisoning = LoadSensitivity::kSafe); - Node* LoadFullTagged( + TNode<Object> LoadFullTagged( Node* base, Node* offset, LoadSensitivity needs_poisoning = LoadSensitivity::kSafe); @@ -1119,50 +1123,13 @@ class V8_EXPORT_PRIVATE CodeAssembler { Word32Or(static_cast<Node*>(left), static_cast<Node*>(right))); } - template <class Left, class Right, - class = typename std::enable_if< - std::is_base_of<Object, Left>::value && - std::is_base_of<Object, Right>::value>::type> - TNode<BoolT> WordEqual(TNode<Left> left, TNode<Right> right) { - return WordEqual(ReinterpretCast<WordT>(left), - ReinterpretCast<WordT>(right)); - } - TNode<BoolT> WordEqual(TNode<Object> left, Node* right) { - return WordEqual(ReinterpretCast<WordT>(left), - ReinterpretCast<WordT>(right)); - } - TNode<BoolT> WordEqual(Node* left, TNode<Object> right) { - return WordEqual(ReinterpretCast<WordT>(left), - ReinterpretCast<WordT>(right)); - } - template <class Left, class Right, - class = typename std::enable_if< - std::is_base_of<Object, Left>::value && - std::is_base_of<Object, Right>::value>::type> - TNode<BoolT> WordNotEqual(TNode<Left> left, TNode<Right> right) { - return WordNotEqual(ReinterpretCast<WordT>(left), - ReinterpretCast<WordT>(right)); - } - TNode<BoolT> WordNotEqual(TNode<Object> left, Node* right) { - return WordNotEqual(ReinterpretCast<WordT>(left), - ReinterpretCast<WordT>(right)); - } - TNode<BoolT> WordNotEqual(Node* left, TNode<Object> right) { - return WordNotEqual(ReinterpretCast<WordT>(left), - ReinterpretCast<WordT>(right)); - } - - TNode<BoolT> IntPtrEqual(SloppyTNode<WordT> left, SloppyTNode<WordT> right); - TNode<BoolT> WordEqual(SloppyTNode<WordT> left, SloppyTNode<WordT> right); - TNode<BoolT> WordNotEqual(SloppyTNode<WordT> left, SloppyTNode<WordT> right); - TNode<BoolT> Word32Equal(SloppyTNode<Word32T> left, - SloppyTNode<Word32T> right); - TNode<BoolT> Word32NotEqual(SloppyTNode<Word32T> left, - SloppyTNode<Word32T> right); - TNode<BoolT> Word64Equal(SloppyTNode<Word64T> left, - SloppyTNode<Word64T> right); - TNode<BoolT> Word64NotEqual(SloppyTNode<Word64T> left, - SloppyTNode<Word64T> right); + TNode<BoolT> IntPtrEqual(TNode<WordT> left, TNode<WordT> right); + TNode<BoolT> WordEqual(TNode<WordT> left, TNode<WordT> right); + TNode<BoolT> WordNotEqual(TNode<WordT> left, TNode<WordT> right); + TNode<BoolT> Word32Equal(TNode<Word32T> left, TNode<Word32T> right); + TNode<BoolT> Word32NotEqual(TNode<Word32T> left, TNode<Word32T> right); + TNode<BoolT> Word64Equal(TNode<Word64T> left, TNode<Word64T> right); + TNode<BoolT> Word64NotEqual(TNode<Word64T> left, TNode<Word64T> right); TNode<BoolT> Word32Or(TNode<BoolT> left, TNode<BoolT> right) { return UncheckedCast<BoolT>( @@ -1234,6 +1201,7 @@ class V8_EXPORT_PRIVATE CodeAssembler { return UncheckedCast<IntPtrT>(WordSar(static_cast<Node*>(value), shift)); } TNode<Word32T> Word32Shr(SloppyTNode<Word32T> value, int shift); + TNode<Word32T> Word32Sar(SloppyTNode<Word32T> value, int shift); TNode<WordT> WordOr(SloppyTNode<WordT> left, SloppyTNode<WordT> right); TNode<WordT> WordAnd(SloppyTNode<WordT> left, SloppyTNode<WordT> right); @@ -1433,7 +1401,7 @@ class V8_EXPORT_PRIVATE CodeAssembler { Node* CallJS(Callable const& callable, Node* context, Node* function, Node* receiver, TArgs... args) { int argc = static_cast<int>(sizeof...(args)); - Node* arity = Int32Constant(argc); + TNode<Int32T> arity = Int32Constant(argc); return CallStub(callable, context, function, arity, receiver, args...); } @@ -1441,8 +1409,8 @@ class V8_EXPORT_PRIVATE CodeAssembler { Node* ConstructJSWithTarget(Callable const& callable, Node* context, Node* target, Node* new_target, TArgs... args) { int argc = static_cast<int>(sizeof...(args)); - Node* arity = Int32Constant(argc); - Node* receiver = LoadRoot(RootIndex::kUndefinedValue); + TNode<Int32T> arity = Int32Constant(argc); + TNode<Object> receiver = LoadRoot(RootIndex::kUndefinedValue); // Construct(target, new_target, arity, receiver, arguments...) return CallStub(callable, context, target, new_target, arity, receiver, @@ -1842,9 +1810,11 @@ class V8_EXPORT_PRIVATE CodeAssemblerScopedExceptionHandler { } // namespace compiler -#if defined(V8_HOST_ARCH_32_BIT) +#if defined(V8_HOST_ARCH_32_BIT) || defined(V8_COMPRESS_POINTERS) +#define BINT_IS_SMI using BInt = Smi; #elif defined(V8_HOST_ARCH_64_BIT) +#define BINT_IS_INTPTR using BInt = IntPtrT; #else #error Unknown architecture. |