summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/turboshaft/representations.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/turboshaft/representations.h')
-rw-r--r--deps/v8/src/compiler/turboshaft/representations.h604
1 files changed, 604 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/turboshaft/representations.h b/deps/v8/src/compiler/turboshaft/representations.h
new file mode 100644
index 0000000000..b99ffeec7c
--- /dev/null
+++ b/deps/v8/src/compiler/turboshaft/representations.h
@@ -0,0 +1,604 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef V8_COMPILER_TURBOSHAFT_REPRESENTATIONS_H_
+#define V8_COMPILER_TURBOSHAFT_REPRESENTATIONS_H_
+
+#include <cstdint>
+
+#include "src/base/functional.h"
+#include "src/base/logging.h"
+#include "src/codegen/machine-type.h"
+#include "src/compiler/turboshaft/utils.h"
+
+namespace v8::internal::compiler::turboshaft {
+
+class WordRepresentation;
+class FloatRepresentation;
+
+class RegisterRepresentation {
+ public:
+ enum class Enum : uint8_t {
+ kWord32,
+ kWord64,
+ kFloat32,
+ kFloat64,
+ kTagged,
+ kCompressed
+ };
+
+ explicit constexpr RegisterRepresentation(Enum value) : value_(value) {}
+ RegisterRepresentation() : value_(kInvalid) {}
+
+ constexpr Enum value() const {
+ DCHECK_NE(value_, kInvalid);
+ return value_;
+ }
+ constexpr operator Enum() const { return value(); }
+
+ static constexpr RegisterRepresentation Word32() {
+ return RegisterRepresentation(Enum::kWord32);
+ }
+ static constexpr RegisterRepresentation Word64() {
+ return RegisterRepresentation(Enum::kWord64);
+ }
+ static constexpr RegisterRepresentation Float32() {
+ return RegisterRepresentation(Enum::kFloat32);
+ }
+ static constexpr RegisterRepresentation Float64() {
+ return RegisterRepresentation(Enum::kFloat64);
+ }
+ // A tagged pointer stored in a register, in the case of pointer compression
+ // it is an uncompressed pointer or a Smi.
+ static constexpr RegisterRepresentation Tagged() {
+ return RegisterRepresentation(Enum::kTagged);
+ }
+ // A compressed tagged pointer stored in a register, the upper 32bit are
+ // unspecified.
+ static constexpr RegisterRepresentation Compressed() {
+ return RegisterRepresentation(Enum::kCompressed);
+ }
+ // The equivalent of intptr_t/uintptr_t: An integral type with the same size
+ // as machine pointers.
+ static constexpr RegisterRepresentation PointerSized() {
+ if constexpr (kSystemPointerSize == 4) {
+ return Word32();
+ } else {
+ DCHECK_EQ(kSystemPointerSize, 8);
+ return Word64();
+ }
+ }
+
+ constexpr bool IsWord() {
+ switch (*this) {
+ case Enum::kWord32:
+ case Enum::kWord64:
+ return true;
+ case Enum::kFloat32:
+ case Enum::kFloat64:
+ case Enum::kTagged:
+ case Enum::kCompressed:
+ return false;
+ }
+ }
+
+ bool IsFloat() {
+ switch (*this) {
+ case Enum::kFloat32:
+ case Enum::kFloat64:
+ return true;
+ case Enum::kWord32:
+ case Enum::kWord64:
+ case Enum::kTagged:
+ case Enum::kCompressed:
+ return false;
+ }
+ }
+
+ uint64_t MaxUnsignedValue() const {
+ switch (this->value()) {
+ case Word32():
+ return std::numeric_limits<uint32_t>::max();
+ case Word64():
+ return std::numeric_limits<uint64_t>::max();
+ case Enum::kFloat32:
+ case Enum::kFloat64:
+ case Enum::kTagged:
+ case Enum::kCompressed:
+ UNREACHABLE();
+ }
+ }
+
+ MachineRepresentation machine_representation() const {
+ switch (*this) {
+ case Word32():
+ return MachineRepresentation::kWord32;
+ case Word64():
+ return MachineRepresentation::kWord64;
+ case Float32():
+ return MachineRepresentation::kFloat32;
+ case Float64():
+ return MachineRepresentation::kFloat64;
+ case Tagged():
+ return MachineRepresentation::kTagged;
+ case Compressed():
+ return MachineRepresentation::kCompressed;
+ }
+ }
+
+ constexpr uint16_t bit_width() const {
+ switch (*this) {
+ case Word32():
+ return 32;
+ case Word64():
+ return 64;
+ case Float32():
+ return 32;
+ case Float64():
+ return 64;
+ case Tagged():
+ return kSystemPointerSize;
+ case Compressed():
+ return kSystemPointerSize;
+ }
+ }
+
+ static RegisterRepresentation FromMachineRepresentation(
+ MachineRepresentation rep) {
+ switch (rep) {
+ case MachineRepresentation::kBit:
+ case MachineRepresentation::kWord8:
+ case MachineRepresentation::kWord16:
+ case MachineRepresentation::kWord32:
+ return Word32();
+ case MachineRepresentation::kWord64:
+ return Word64();
+ case MachineRepresentation::kTaggedSigned:
+ case MachineRepresentation::kTaggedPointer:
+ case MachineRepresentation::kTagged:
+ return Tagged();
+ case MachineRepresentation::kCompressedPointer:
+ case MachineRepresentation::kCompressed:
+ return Compressed();
+ case MachineRepresentation::kFloat32:
+ return Float32();
+ case MachineRepresentation::kFloat64:
+ return Float64();
+ case MachineRepresentation::kMapWord:
+ case MachineRepresentation::kSandboxedPointer:
+ case MachineRepresentation::kNone:
+ case MachineRepresentation::kSimd128:
+ case MachineRepresentation::kSimd256:
+ UNREACHABLE();
+ }
+ }
+
+ private:
+ Enum value_;
+
+ static constexpr Enum kInvalid = static_cast<Enum>(-1);
+};
+
+V8_INLINE bool operator==(RegisterRepresentation a, RegisterRepresentation b) {
+ return a.value() == b.value();
+}
+V8_INLINE bool operator!=(RegisterRepresentation a, RegisterRepresentation b) {
+ return a.value() != b.value();
+}
+
+V8_INLINE size_t hash_value(RegisterRepresentation rep) {
+ return static_cast<size_t>(rep.value());
+}
+
+std::ostream& operator<<(std::ostream& os, RegisterRepresentation rep);
+
+class WordRepresentation : public RegisterRepresentation {
+ public:
+ enum class Enum : uint8_t {
+ kWord32 = static_cast<int>(RegisterRepresentation::Enum::kWord32),
+ kWord64 = static_cast<int>(RegisterRepresentation::Enum::kWord64)
+ };
+ explicit constexpr WordRepresentation(Enum value)
+ : RegisterRepresentation(
+ static_cast<RegisterRepresentation::Enum>(value)) {}
+ WordRepresentation() = default;
+ explicit constexpr WordRepresentation(RegisterRepresentation rep)
+ : WordRepresentation(static_cast<Enum>(rep.value())) {
+ DCHECK(rep.IsWord());
+ }
+
+ static constexpr WordRepresentation Word32() {
+ return WordRepresentation(Enum::kWord32);
+ }
+ static constexpr WordRepresentation Word64() {
+ return WordRepresentation(Enum::kWord64);
+ }
+
+ static constexpr WordRepresentation PointerSized() {
+ return WordRepresentation(RegisterRepresentation::PointerSized());
+ }
+
+ constexpr Enum value() const {
+ return static_cast<Enum>(RegisterRepresentation::value());
+ }
+ constexpr operator Enum() const { return value(); }
+
+ constexpr uint64_t MaxUnsignedValue() const {
+ switch (this->value()) {
+ case Word32():
+ return std::numeric_limits<uint32_t>::max();
+ case Word64():
+ return std::numeric_limits<uint64_t>::max();
+ }
+ }
+ constexpr int64_t MinSignedValue() const {
+ switch (this->value()) {
+ case Word32():
+ return std::numeric_limits<int32_t>::min();
+ case Word64():
+ return std::numeric_limits<int64_t>::min();
+ }
+ }
+ constexpr int64_t MaxSignedValue() const {
+ switch (this->value()) {
+ case Word32():
+ return std::numeric_limits<int32_t>::max();
+ case Word64():
+ return std::numeric_limits<int64_t>::max();
+ }
+ }
+};
+
+class FloatRepresentation : public RegisterRepresentation {
+ public:
+ enum class Enum : uint8_t {
+ kFloat32 = static_cast<int>(RegisterRepresentation::Enum::kFloat32),
+ kFloat64 = static_cast<int>(RegisterRepresentation::Enum::kFloat64)
+ };
+
+ static constexpr FloatRepresentation Float32() {
+ return FloatRepresentation(Enum::kFloat32);
+ }
+ static constexpr FloatRepresentation Float64() {
+ return FloatRepresentation(Enum::kFloat64);
+ }
+
+ explicit constexpr FloatRepresentation(Enum value)
+ : RegisterRepresentation(
+ static_cast<RegisterRepresentation::Enum>(value)) {}
+ FloatRepresentation() = default;
+
+ constexpr Enum value() const {
+ return static_cast<Enum>(RegisterRepresentation::value());
+ }
+ constexpr operator Enum() const { return value(); }
+};
+
+class MemoryRepresentation {
+ public:
+ enum class Enum : uint8_t {
+ kInt8,
+ kUint8,
+ kInt16,
+ kUint16,
+ kInt32,
+ kUint32,
+ kInt64,
+ kUint64,
+ kFloat32,
+ kFloat64,
+ kAnyTagged,
+ kTaggedPointer,
+ kTaggedSigned,
+ kSandboxedPointer,
+ };
+
+ explicit constexpr MemoryRepresentation(Enum value) : value_(value) {}
+ MemoryRepresentation() : value_(kInvalid) {}
+ constexpr Enum value() const {
+ DCHECK_NE(value_, kInvalid);
+ return value_;
+ }
+ constexpr operator Enum() const { return value(); }
+
+ static constexpr MemoryRepresentation Int8() {
+ return MemoryRepresentation(Enum::kInt8);
+ }
+ static constexpr MemoryRepresentation Uint8() {
+ return MemoryRepresentation(Enum::kUint8);
+ }
+ static constexpr MemoryRepresentation Int16() {
+ return MemoryRepresentation(Enum::kInt16);
+ }
+ static constexpr MemoryRepresentation Uint16() {
+ return MemoryRepresentation(Enum::kUint16);
+ }
+ static constexpr MemoryRepresentation Int32() {
+ return MemoryRepresentation(Enum::kInt32);
+ }
+ static constexpr MemoryRepresentation Uint32() {
+ return MemoryRepresentation(Enum::kUint32);
+ }
+ static constexpr MemoryRepresentation Int64() {
+ return MemoryRepresentation(Enum::kInt64);
+ }
+ static constexpr MemoryRepresentation Uint64() {
+ return MemoryRepresentation(Enum::kUint64);
+ }
+ static constexpr MemoryRepresentation Float32() {
+ return MemoryRepresentation(Enum::kFloat32);
+ }
+ static constexpr MemoryRepresentation Float64() {
+ return MemoryRepresentation(Enum::kFloat64);
+ }
+ static constexpr MemoryRepresentation AnyTagged() {
+ return MemoryRepresentation(Enum::kAnyTagged);
+ }
+ static constexpr MemoryRepresentation TaggedPointer() {
+ return MemoryRepresentation(Enum::kTaggedPointer);
+ }
+ static constexpr MemoryRepresentation TaggedSigned() {
+ return MemoryRepresentation(Enum::kTaggedSigned);
+ }
+ static constexpr MemoryRepresentation SandboxedPointer() {
+ return MemoryRepresentation(Enum::kSandboxedPointer);
+ }
+
+ bool IsWord() const {
+ switch (*this) {
+ case Int8():
+ case Uint8():
+ case Int16():
+ case Uint16():
+ case Int32():
+ case Uint32():
+ case Int64():
+ case Uint64():
+ return true;
+ case Float32():
+ case Float64():
+ case AnyTagged():
+ case TaggedPointer():
+ case TaggedSigned():
+ case SandboxedPointer():
+ return false;
+ }
+ }
+
+ bool IsSigned() const {
+ switch (*this) {
+ case Int8():
+ case Int16():
+ case Int32():
+ case Int64():
+ return true;
+ case Uint8():
+ case Uint16():
+ case Uint32():
+ case Uint64():
+ return false;
+ case Float32():
+ case Float64():
+ case AnyTagged():
+ case TaggedPointer():
+ case TaggedSigned():
+ case SandboxedPointer():
+ DCHECK(false);
+ return false;
+ }
+ }
+
+ bool IsTagged() const {
+ switch (*this) {
+ case AnyTagged():
+ case TaggedPointer():
+ case TaggedSigned():
+ return true;
+ case Int8():
+ case Int16():
+ case Int32():
+ case Int64():
+ case Uint8():
+ case Uint16():
+ case Uint32():
+ case Uint64():
+ case Float32():
+ case Float64():
+ case SandboxedPointer():
+ return false;
+ }
+ }
+
+ bool CanBeTaggedPointer() const {
+ switch (*this) {
+ case AnyTagged():
+ case TaggedPointer():
+ return true;
+ case TaggedSigned():
+ case Int8():
+ case Int16():
+ case Int32():
+ case Int64():
+ case Uint8():
+ case Uint16():
+ case Uint32():
+ case Uint64():
+ case Float32():
+ case Float64():
+ case SandboxedPointer():
+ return false;
+ }
+ }
+
+ RegisterRepresentation ToRegisterRepresentation() const {
+ switch (*this) {
+ case Int8():
+ case Uint8():
+ case Int16():
+ case Uint16():
+ case Int32():
+ case Uint32():
+ return RegisterRepresentation::Word32();
+ case Int64():
+ case Uint64():
+ return RegisterRepresentation::Word64();
+ case Float32():
+ return RegisterRepresentation::Float32();
+ case Float64():
+ return RegisterRepresentation::Float64();
+ case AnyTagged():
+ case TaggedPointer():
+ case TaggedSigned():
+ return RegisterRepresentation::Tagged();
+ case SandboxedPointer():
+ return RegisterRepresentation::Word64();
+ }
+ }
+
+ MachineType ToMachineType() const {
+ switch (*this) {
+ case Int8():
+ return MachineType::Int8();
+ case Uint8():
+ return MachineType::Uint8();
+ case Int16():
+ return MachineType::Int16();
+ case Uint16():
+ return MachineType::Uint16();
+ case Int32():
+ return MachineType::Int32();
+ case Uint32():
+ return MachineType::Uint32();
+ case Int64():
+ return MachineType::Int64();
+ case Uint64():
+ return MachineType::Uint64();
+ case Float32():
+ return MachineType::Float32();
+ case Float64():
+ return MachineType::Float64();
+ case AnyTagged():
+ return MachineType::AnyTagged();
+ case TaggedPointer():
+ return MachineType::TaggedPointer();
+ case TaggedSigned():
+ return MachineType::TaggedSigned();
+ case SandboxedPointer():
+ return MachineType::SandboxedPointer();
+ }
+ }
+
+ static MemoryRepresentation FromMachineType(MachineType type) {
+ switch (type.representation()) {
+ case MachineRepresentation::kWord8:
+ return type.IsSigned() ? Int8() : Uint8();
+ case MachineRepresentation::kWord16:
+ return type.IsSigned() ? Int16() : Uint16();
+ case MachineRepresentation::kWord32:
+ return type.IsSigned() ? Int32() : Uint32();
+ case MachineRepresentation::kWord64:
+ return type.IsSigned() ? Int64() : Uint64();
+ case MachineRepresentation::kTaggedSigned:
+ return TaggedSigned();
+ case MachineRepresentation::kTaggedPointer:
+ return TaggedPointer();
+ case MachineRepresentation::kTagged:
+ return AnyTagged();
+ case MachineRepresentation::kFloat32:
+ return Float32();
+ case MachineRepresentation::kFloat64:
+ return Float64();
+ case MachineRepresentation::kSandboxedPointer:
+ return SandboxedPointer();
+ case MachineRepresentation::kNone:
+ case MachineRepresentation::kMapWord:
+ case MachineRepresentation::kBit:
+ case MachineRepresentation::kSimd128:
+ case MachineRepresentation::kSimd256:
+ case MachineRepresentation::kCompressedPointer:
+ case MachineRepresentation::kCompressed:
+ UNREACHABLE();
+ }
+ }
+
+ static MemoryRepresentation FromMachineRepresentation(
+ MachineRepresentation rep) {
+ switch (rep) {
+ case MachineRepresentation::kWord8:
+ return Uint8();
+ case MachineRepresentation::kWord16:
+ return Uint16();
+ case MachineRepresentation::kWord32:
+ return Uint32();
+ case MachineRepresentation::kWord64:
+ return Uint64();
+ case MachineRepresentation::kTaggedSigned:
+ return TaggedSigned();
+ case MachineRepresentation::kTaggedPointer:
+ return TaggedPointer();
+ case MachineRepresentation::kTagged:
+ return AnyTagged();
+ case MachineRepresentation::kFloat32:
+ return Float32();
+ case MachineRepresentation::kFloat64:
+ return Float64();
+ case MachineRepresentation::kSandboxedPointer:
+ return SandboxedPointer();
+ case MachineRepresentation::kNone:
+ case MachineRepresentation::kMapWord:
+ case MachineRepresentation::kBit:
+ case MachineRepresentation::kSimd128:
+ case MachineRepresentation::kSimd256:
+ case MachineRepresentation::kCompressedPointer:
+ case MachineRepresentation::kCompressed:
+ UNREACHABLE();
+ }
+ }
+
+ uint8_t SizeInBytes() const {
+ switch (*this) {
+ case Int8():
+ case Uint8():
+ return 1;
+ case Int16():
+ case Uint16():
+ return 2;
+ case Int32():
+ case Uint32():
+ case Float32():
+ return 4;
+ case Int64():
+ case Uint64():
+ case Float64():
+ case SandboxedPointer():
+ return 8;
+ case AnyTagged():
+ case TaggedPointer():
+ case TaggedSigned():
+ return kTaggedSize;
+ }
+ }
+
+ private:
+ Enum value_;
+
+ static constexpr Enum kInvalid = static_cast<Enum>(-1);
+};
+
+V8_INLINE bool operator==(MemoryRepresentation a, MemoryRepresentation b) {
+ return a.value() == b.value();
+}
+V8_INLINE bool operator!=(MemoryRepresentation a, MemoryRepresentation b) {
+ return a.value() != b.value();
+}
+
+V8_INLINE size_t hash_value(MemoryRepresentation rep) {
+ return static_cast<size_t>(rep.value());
+}
+
+std::ostream& operator<<(std::ostream& os, MemoryRepresentation rep);
+
+} // namespace v8::internal::compiler::turboshaft
+
+#endif // V8_COMPILER_TURBOSHAFT_REPRESENTATIONS_H_