| 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_
|
|
|