Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1662)

Unified Diff: src/assembler.h

Issue 1131783003: Embedded constant pools. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/assembler.h
diff --git a/src/assembler.h b/src/assembler.h
index fd66e0bfdb111b22c74f562cae1640c191481c2f..258547ffde36343c260693cf9861a92d0bcff97c 100644
--- a/src/assembler.h
+++ b/src/assembler.h
@@ -79,11 +79,11 @@ class AssemblerBase: public Malloced {
return (enabled_cpu_features_ & (static_cast<uint64_t>(1) << f)) != 0;
}
- bool is_ool_constant_pool_available() const {
- if (FLAG_enable_ool_constant_pool) {
- return ool_constant_pool_available_;
+ bool is_constant_pool_available() const {
+ if (FLAG_enable_embedded_constant_pool) {
+ return constant_pool_available_;
} else {
- // Out-of-line constant pool not supported on this architecture.
+ // Constant pool not supported on this architecture.
rmcilroy 2015/05/20 14:32:11 Embedded constant... (and below)
MTBrandyberry 2015/05/20 22:28:22 Done.
UNREACHABLE();
return false;
}
@@ -108,11 +108,11 @@ class AssemblerBase: public Malloced {
int buffer_size_;
bool own_buffer_;
- void set_ool_constant_pool_available(bool available) {
- if (FLAG_enable_ool_constant_pool) {
- ool_constant_pool_available_ = available;
+ void set_constant_pool_available(bool available) {
+ if (FLAG_enable_embedded_constant_pool) {
+ constant_pool_available_ = available;
} else {
- // Out-of-line constant pool not supported on this architecture.
+ // Constant pool not supported on this architecture.
UNREACHABLE();
}
}
@@ -130,7 +130,7 @@ class AssemblerBase: public Malloced {
// 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 ool_constant_pool_available_;
+ bool constant_pool_available_;
// Constant pool.
friend class FrameAndConstantPoolScope;
@@ -413,9 +413,6 @@ class RelocInfo {
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 &&
@@ -487,22 +484,11 @@ class RelocInfo {
}
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; }
@@ -645,10 +631,7 @@ class RelocInfo {
// comment).
byte* pc_;
Mode rmode_;
- union {
- intptr_t data_;
- double data64_;
- };
+ intptr_t data_;
Code* host_;
// External-reference pointers are also split across instruction-pairs
// on some platforms, but are accessed via indirect pointers. This location
@@ -1167,6 +1150,83 @@ class NullCallWrapper : public CallWrapper {
};
+// -----------------------------------------------------------------------------
+// Embedded constant pool support
+
+class ConstantPoolEntry {
+ public:
+ ConstantPoolEntry() {}
+ ConstantPoolEntry(int position, intptr_t value, bool sharing_ok)
+ : position_(position),
+ merged_index_(sharing_ok ? -1 : -2),
rmcilroy 2015/05/20 14:32:11 Define and use constants for '-1' and '-2' to clar
MTBrandyberry 2015/05/20 22:28:22 Done.
+ value_(value) {}
+ ConstantPoolEntry(int position, double value)
+ : position_(position), merged_index_(-1), value64_(value) {}
+
+ int position() const { return position_; }
+ bool sharing_ok() const { return merged_index_ != -2; }
+ 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 ((kPointerSize == kDoubleSize || type == INTPTR) ? kPointerSize
rmcilroy 2015/05/20 14:32:11 I think all you need here is: return (type == IN
MTBrandyberry 2015/05/20 22:28:22 My thinking was that the compiler could eliminate
rmcilroy 2015/05/22 12:21:22 If the compiler is smart enough to do that, then i
MTBrandyberry 2015/05/26 19:19:05 Acknowledged.
+ : kDoubleSize);
+ }
+
+ enum Access { REGULAR, OVERFLOWED };
+
+ private:
+ int position_;
+ int merged_index_;
+ union {
+ intptr_t value_;
+ double value64_;
+ };
+
+ friend class ConstantPoolBuilder;
+};
+
+
+class ConstantPoolBuilder BASE_EMBEDDED {
rmcilroy 2015/05/20 14:32:11 Thanks for factoring this out into common code. C
MTBrandyberry 2015/05/20 22:28:22 I will resolve the other comments here in the next
+ public:
+ ConstantPoolBuilder(int ptr_reach, int double_reach);
rmcilroy 2015/05/20 14:32:11 ptr_reach_bits and double_reach_bits
MTBrandyberry 2015/05/20 22:28:22 Done.
+ ConstantPoolEntry::Access AddEntry(int position, intptr_t value,
+ bool sharing_ok) {
+ ConstantPoolEntry entry(position, value, sharing_ok);
+ return AddEntry(entry, ConstantPoolEntry::INTPTR);
+ }
+ ConstantPoolEntry::Access AddEntry(int position, double value) {
+ ConstantPoolEntry entry(position, value);
+ return AddEntry(entry, ConstantPoolEntry::DOUBLE);
+ }
+ ConstantPoolEntry::Access NextAccess(ConstantPoolEntry::Type type) const;
+ int Emit(Assembler* assm);
+ inline Label* Position() { return &label_; }
rmcilroy 2015/05/20 14:32:11 /s/Position/EmittedPosition. Also some comments f
MTBrandyberry 2015/05/20 22:28:22 Done.
+
+ private:
+ ConstantPoolEntry::Access AddEntry(ConstantPoolEntry& entry,
+ ConstantPoolEntry::Type type);
+ void EmitGroup(Assembler* assm, ConstantPoolEntry::Access access,
+ ConstantPoolEntry::Type type);
+
+ struct TypeInfo {
rmcilroy 2015/05/20 14:32:11 nit - TypeInfo seems a bit confusingly named. How
MTBrandyberry 2015/05/20 22:28:22 Done. PerTypeEntryInfo?
rmcilroy 2015/05/22 12:21:22 SGTM
+ TypeInfo() : regular_count(0), overflow_start(-1) {}
+ bool overflow() const {
+ return (overflow_start >= 0 &&
+ overflow_start < static_cast<int>(entries.size()));
+ }
+ int regular_reach;
+ int regular_count;
+ int overflow_start;
+ std::vector<ConstantPoolEntry> entries;
+ std::vector<ConstantPoolEntry> shared_entries;
+ };
+
+ Label label_;
rmcilroy 2015/05/20 14:32:11 /s/label_/emitted_label_ (and a comment describing
MTBrandyberry 2015/05/20 22:28:22 Done.
+ TypeInfo info_[ConstantPoolEntry::NUMBER_OF_TYPES];
+};
rmcilroy 2015/05/20 14:32:11 two newlines here
MTBrandyberry 2015/05/20 22:28:22 Done.
} } // namespace v8::internal
#endif // V8_ASSEMBLER_H_

Powered by Google App Engine
This is Rietveld 408576698