Index: src/assembler.h |
diff --git a/src/assembler.h b/src/assembler.h |
index 2bad1eb7492f84b6287777aa729f68439f896803..d5822395b954acf34144d43c8128e16c926f7d45 100644 |
--- a/src/assembler.h |
+++ b/src/assembler.h |
@@ -79,11 +79,11 @@ |
return (enabled_cpu_features_ & (static_cast<uint64_t>(1) << f)) != 0; |
} |
- bool is_constant_pool_available() const { |
- if (FLAG_enable_embedded_constant_pool) { |
- return constant_pool_available_; |
+ bool is_ool_constant_pool_available() const { |
+ if (FLAG_enable_ool_constant_pool) { |
+ return ool_constant_pool_available_; |
} else { |
- // Embedded constant pool not supported on this architecture. |
+ // Out-of-line constant pool not supported on this architecture. |
UNREACHABLE(); |
return false; |
} |
@@ -108,11 +108,11 @@ |
int buffer_size_; |
bool own_buffer_; |
- void set_constant_pool_available(bool available) { |
- if (FLAG_enable_embedded_constant_pool) { |
- constant_pool_available_ = available; |
+ void set_ool_constant_pool_available(bool available) { |
+ if (FLAG_enable_ool_constant_pool) { |
+ ool_constant_pool_available_ = available; |
} else { |
- // Embedded constant pool not supported on this architecture. |
+ // Out-of-line constant pool not supported on this architecture. |
UNREACHABLE(); |
} |
} |
@@ -130,7 +130,7 @@ |
// Indicates whether the constant pool can be accessed, which is only possible |
// if the pp register points to the current code object's constant pool. |
- bool constant_pool_available_; |
+ bool ool_constant_pool_available_; |
// Constant pool. |
friend class FrameAndConstantPoolScope; |
@@ -413,6 +413,9 @@ |
RelocInfo(byte* pc, Mode rmode, intptr_t data, Code* host) |
: pc_(pc), rmode_(rmode), data_(data), host_(host) { |
} |
+ RelocInfo(byte* pc, double data64) |
+ : pc_(pc), rmode_(NONE64), data64_(data64), host_(NULL) { |
+ } |
static inline bool IsRealRelocMode(Mode mode) { |
return mode >= FIRST_REAL_RELOC_MODE && |
@@ -483,12 +486,23 @@ |
return mode == CODE_AGE_SEQUENCE; |
} |
static inline int ModeMask(Mode mode) { return 1 << mode; } |
+ |
+ // Returns true if the first RelocInfo has the same mode and raw data as the |
+ // second one. |
+ static inline bool IsEqual(RelocInfo first, RelocInfo second) { |
+ return first.rmode() == second.rmode() && |
+ (first.rmode() == RelocInfo::NONE64 ? |
+ first.raw_data64() == second.raw_data64() : |
+ first.data() == second.data()); |
+ } |
// Accessors |
byte* pc() const { return pc_; } |
void set_pc(byte* pc) { pc_ = pc; } |
Mode rmode() const { return rmode_; } |
intptr_t data() const { return data_; } |
+ double data64() const { return data64_; } |
+ uint64_t raw_data64() { return bit_cast<uint64_t>(data64_); } |
Code* host() const { return host_; } |
void set_host(Code* host) { host_ = host; } |
@@ -631,7 +645,10 @@ |
// comment). |
byte* pc_; |
Mode rmode_; |
- intptr_t data_; |
+ union { |
+ intptr_t data_; |
+ double data64_; |
+ }; |
Code* host_; |
// External-reference pointers are also split across instruction-pairs |
// on some platforms, but are accessed via indirect pointers. This location |
@@ -1154,126 +1171,6 @@ |
}; |
-// ----------------------------------------------------------------------------- |
-// Constant pool support |
- |
-class ConstantPoolEntry { |
- public: |
- ConstantPoolEntry() {} |
- ConstantPoolEntry(int position, intptr_t value, bool sharing_ok) |
- : position_(position), |
- merged_index_(sharing_ok ? SHARING_ALLOWED : SHARING_PROHIBITED), |
- value_(value) {} |
- ConstantPoolEntry(int position, double value) |
- : position_(position), merged_index_(SHARING_ALLOWED), value64_(value) {} |
- |
- int position() const { return position_; } |
- bool sharing_ok() const { return merged_index_ != SHARING_PROHIBITED; } |
- bool is_merged() const { return merged_index_ >= 0; } |
- int merged_index(void) const { |
- DCHECK(is_merged()); |
- return merged_index_; |
- } |
- void set_merged_index(int index) { |
- merged_index_ = index; |
- DCHECK(is_merged()); |
- } |
- int offset(void) const { |
- DCHECK(merged_index_ >= 0); |
- return merged_index_; |
- } |
- void set_offset(int offset) { |
- DCHECK(offset >= 0); |
- merged_index_ = offset; |
- } |
- intptr_t value() const { return value_; } |
- uint64_t value64() const { return bit_cast<uint64_t>(value64_); } |
- |
- enum Type { INTPTR, DOUBLE, NUMBER_OF_TYPES }; |
- |
- static int size(Type type) { |
- return (type == INTPTR) ? kPointerSize : kDoubleSize; |
- } |
- |
- enum Access { REGULAR, OVERFLOWED }; |
- |
- private: |
- int position_; |
- int merged_index_; |
- union { |
- intptr_t value_; |
- double value64_; |
- }; |
- enum { SHARING_PROHIBITED = -2, SHARING_ALLOWED = -1 }; |
-}; |
- |
- |
-// ----------------------------------------------------------------------------- |
-// Embedded constant pool support |
- |
-class ConstantPoolBuilder BASE_EMBEDDED { |
- public: |
- ConstantPoolBuilder(int ptr_reach_bits, int double_reach_bits); |
- |
- // Add pointer-sized constant to the embedded constant pool |
- ConstantPoolEntry::Access AddEntry(int position, intptr_t value, |
- bool sharing_ok) { |
- ConstantPoolEntry entry(position, value, sharing_ok); |
- return AddEntry(entry, ConstantPoolEntry::INTPTR); |
- } |
- |
- // Add double constant to the embedded constant pool |
- ConstantPoolEntry::Access AddEntry(int position, double value) { |
- ConstantPoolEntry entry(position, value); |
- return AddEntry(entry, ConstantPoolEntry::DOUBLE); |
- } |
- |
- // Previews the access type required for the next new entry to be added. |
- ConstantPoolEntry::Access NextAccess(ConstantPoolEntry::Type type) const; |
- |
- bool IsEmpty() { |
- return info_[ConstantPoolEntry::INTPTR].entries.empty() && |
- info_[ConstantPoolEntry::INTPTR].shared_entries.empty() && |
- info_[ConstantPoolEntry::DOUBLE].entries.empty() && |
- info_[ConstantPoolEntry::DOUBLE].shared_entries.empty(); |
- } |
- |
- // Emit the constant pool. Invoke only after all entries have been |
- // added and all instructions have been emitted. |
- // Returns position of the emitted pool (zero implies no constant pool). |
- int Emit(Assembler* assm); |
- |
- // Returns the label associated with the start of the constant pool. |
- // Linking to this label in the function prologue may provide an |
- // efficient means of constant pool pointer register initialization |
- // on some architectures. |
- inline Label* EmittedPosition() { return &emitted_label_; } |
- |
- private: |
- ConstantPoolEntry::Access AddEntry(ConstantPoolEntry& entry, |
- ConstantPoolEntry::Type type); |
- void EmitSharedEntries(Assembler* assm, ConstantPoolEntry::Type type); |
- void EmitGroup(Assembler* assm, ConstantPoolEntry::Access access, |
- ConstantPoolEntry::Type type); |
- |
- struct PerTypeEntryInfo { |
- PerTypeEntryInfo() : regular_count(0), overflow_start(-1) {} |
- bool overflow() const { |
- return (overflow_start >= 0 && |
- overflow_start < static_cast<int>(entries.size())); |
- } |
- int regular_reach_bits; |
- int regular_count; |
- int overflow_start; |
- std::vector<ConstantPoolEntry> entries; |
- std::vector<ConstantPoolEntry> shared_entries; |
- }; |
- |
- Label emitted_label_; // Records pc_offset of emitted pool |
- PerTypeEntryInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES]; |
-}; |
- |
- |
} } // namespace v8::internal |
#endif // V8_ASSEMBLER_H_ |