1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_CRANKSHAFT_HYDROGEN_TYPES_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_CRANKSHAFT_HYDROGEN_TYPES_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <climits> 9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <iosfwd> 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/macros.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Forward declarations. 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename T> class Handle; 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Object; 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define HTYPE_LIST(V) \ 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Any, 0x0) /* 0000 0000 0000 0000 */ \ 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Tagged, 0x1) /* 0000 0000 0000 0001 */ \ 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(TaggedPrimitive, 0x5) /* 0000 0000 0000 0101 */ \ 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(TaggedNumber, 0xd) /* 0000 0000 0000 1101 */ \ 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Smi, 0x1d) /* 0000 0000 0001 1101 */ \ 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HeapObject, 0x21) /* 0000 0000 0010 0001 */ \ 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HeapPrimitive, 0x25) /* 0000 0000 0010 0101 */ \ 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Null, 0x27) /* 0000 0000 0010 0111 */ \ 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HeapNumber, 0x2d) /* 0000 0000 0010 1101 */ \ 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(String, 0x65) /* 0000 0000 0110 0101 */ \ 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Boolean, 0xa5) /* 0000 0000 1010 0101 */ \ 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Undefined, 0x125) /* 0000 0001 0010 0101 */ \ 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JSReceiver, 0x221) /* 0000 0010 0010 0001 */ \ 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JSObject, 0x621) /* 0000 0110 0010 0001 */ \ 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JSArray, 0xe21) /* 0000 1110 0010 0001 */ \ 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(None, 0xfff) /* 0000 1111 1111 1111 */ 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass HType final { 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #define DECLARE_CONSTRUCTOR(Name, mask) \ 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HType Name() WARN_UNUSED_RESULT { return HType(k##Name); } 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTYPE_LIST(DECLARE_CONSTRUCTOR) 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #undef DECLARE_CONSTRUCTOR 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return the weakest (least precise) common type. 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType Combine(HType other) const WARN_UNUSED_RESULT { 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType(static_cast<Kind>(kind_ & other.kind_)); 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Equals(HType other) const WARN_UNUSED_RESULT { 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kind_ == other.kind_; 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSubtypeOf(HType other) const WARN_UNUSED_RESULT { 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Combine(other).Equals(other); 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #define DECLARE_IS_TYPE(Name, mask) \ 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Is##Name() const WARN_UNUSED_RESULT { \ 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsSubtypeOf(HType::Name()); \ 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTYPE_LIST(DECLARE_IS_TYPE) 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #undef DECLARE_IS_TYPE 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HType FromType(typename T::TypeHandle type) WARN_UNUSED_RESULT; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HType FromValue(Handle<Object> value) WARN_UNUSED_RESULT; 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier friend std::ostream& operator<<(std::ostream& os, const HType& t); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Kind { 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #define DECLARE_TYPE(Name, mask) k##Name = mask, 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTYPE_LIST(DECLARE_TYPE) 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch #undef DECLARE_TYPE 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_KIND = kNone 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure type fits in int16. 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(LAST_KIND < (1 << (CHAR_BIT * sizeof(int16_t)))); 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HType(Kind kind) : kind_(kind) { } 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int16_t kind_; 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const HType& t); 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_CRANKSHAFT_HYDROGEN_TYPES_H_ 93