summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/code-assembler.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/code-assembler.h')
-rw-r--r--deps/v8/src/compiler/code-assembler.h106
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.