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

Unified Diff: src/assembler.cc

Issue 1155703006: Revert of 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
« no previous file with comments | « src/assembler.h ('k') | src/compiler/arm/code-generator-arm.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index 90d08bb6821177d179fbc0c161c5e7eae448a698..2555bbbfaa6620187e7e3ca56345ac7ceb1f49a0 100644
--- a/src/assembler.cc
+++ b/src/assembler.cc
@@ -135,7 +135,7 @@
predictable_code_size_(false),
// We may use the assembler without an isolate.
serializer_enabled_(isolate && isolate->serializer_enabled()),
- constant_pool_available_(false) {
+ ool_constant_pool_available_(false) {
if (FLAG_mask_constants_with_cookie && isolate != NULL) {
jit_cookie_ = isolate->random_number_generator()->NextInt();
}
@@ -1635,208 +1635,6 @@
}
-ConstantPoolBuilder::ConstantPoolBuilder(int ptr_reach_bits,
- int double_reach_bits) {
- info_[ConstantPoolEntry::INTPTR].entries.reserve(64);
- info_[ConstantPoolEntry::INTPTR].regular_reach_bits = ptr_reach_bits;
- info_[ConstantPoolEntry::DOUBLE].regular_reach_bits = double_reach_bits;
-}
-
-
-ConstantPoolEntry::Access ConstantPoolBuilder::NextAccess(
- ConstantPoolEntry::Type type) const {
- const PerTypeEntryInfo& info = info_[type];
-
- if (info.overflow()) return ConstantPoolEntry::OVERFLOWED;
-
- int dbl_count = info_[ConstantPoolEntry::DOUBLE].regular_count;
- int dbl_offset = dbl_count * kDoubleSize;
- int ptr_count = info_[ConstantPoolEntry::INTPTR].regular_count;
- int ptr_offset = ptr_count * kPointerSize + dbl_offset;
-
- if (type == ConstantPoolEntry::DOUBLE) {
- // Double overflow detection must take into account the reach for both types
- int ptr_reach_bits = info_[ConstantPoolEntry::INTPTR].regular_reach_bits;
- if (!is_uintn(dbl_offset, info.regular_reach_bits) ||
- (ptr_count > 0 &&
- !is_uintn(ptr_offset + kDoubleSize - kPointerSize, ptr_reach_bits))) {
- return ConstantPoolEntry::OVERFLOWED;
- }
- } else {
- DCHECK(type == ConstantPoolEntry::INTPTR);
- if (!is_uintn(ptr_offset, info.regular_reach_bits)) {
- return ConstantPoolEntry::OVERFLOWED;
- }
- }
-
- return ConstantPoolEntry::REGULAR;
-}
-
-
-ConstantPoolEntry::Access ConstantPoolBuilder::AddEntry(
- ConstantPoolEntry& entry, ConstantPoolEntry::Type type) {
- DCHECK(!emitted_label_.is_bound());
- PerTypeEntryInfo& info = info_[type];
- const int entry_size = ConstantPoolEntry::size(type);
- bool merged = false;
-
- if (entry.sharing_ok()) {
- // Try to merge entries
- std::vector<ConstantPoolEntry>::iterator it = info.shared_entries.begin();
- int end = static_cast<int>(info.shared_entries.size());
- for (int i = 0; i < end; i++, it++) {
- if ((entry_size == kPointerSize) ? entry.value() == it->value()
- : entry.value64() == it->value64()) {
- // Merge with found entry.
- entry.set_merged_index(i);
- merged = true;
- break;
- }
- }
- }
-
- // By definition, merged entries have regular access.
- DCHECK(!merged || entry.merged_index() < info.regular_count);
- ConstantPoolEntry::Access access =
- (merged ? ConstantPoolEntry::REGULAR : NextAccess(type));
-
- // Enforce an upper bound on search time by limiting the search to
- // unique sharable entries which fit in the regular section.
- if (entry.sharing_ok() && !merged && access == ConstantPoolEntry::REGULAR) {
- info.shared_entries.push_back(entry);
- } else {
- info.entries.push_back(entry);
- }
-
- // We're done if we found a match or have already triggered the
- // overflow state.
- if (merged || info.overflow()) return access;
-
- if (access == ConstantPoolEntry::REGULAR) {
- info.regular_count++;
- } else {
- info.overflow_start = static_cast<int>(info.entries.size()) - 1;
- }
-
- return access;
-}
-
-
-void ConstantPoolBuilder::EmitSharedEntries(Assembler* assm,
- ConstantPoolEntry::Type type) {
- PerTypeEntryInfo& info = info_[type];
- std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries;
- const int entry_size = ConstantPoolEntry::size(type);
- int base = emitted_label_.pos();
- DCHECK(base > 0);
- int shared_end = static_cast<int>(shared_entries.size());
- std::vector<ConstantPoolEntry>::iterator shared_it = shared_entries.begin();
- for (int i = 0; i < shared_end; i++, shared_it++) {
- int offset = assm->pc_offset() - base;
- shared_it->set_offset(offset); // Save offset for merged entries.
- if (entry_size == kPointerSize) {
- assm->dp(shared_it->value());
- } else {
- assm->dq(shared_it->value64());
- }
- DCHECK(is_uintn(offset, info.regular_reach_bits));
-
- // Patch load sequence with correct offset.
- assm->PatchConstantPoolAccessInstruction(shared_it->position(), offset,
- ConstantPoolEntry::REGULAR, type);
- }
-}
-
-
-void ConstantPoolBuilder::EmitGroup(Assembler* assm,
- ConstantPoolEntry::Access access,
- ConstantPoolEntry::Type type) {
- PerTypeEntryInfo& info = info_[type];
- const bool overflow = info.overflow();
- std::vector<ConstantPoolEntry>& entries = info.entries;
- std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries;
- const int entry_size = ConstantPoolEntry::size(type);
- int base = emitted_label_.pos();
- DCHECK(base > 0);
- int begin;
- int end;
-
- if (access == ConstantPoolEntry::REGULAR) {
- // Emit any shared entries first
- EmitSharedEntries(assm, type);
- }
-
- if (access == ConstantPoolEntry::REGULAR) {
- begin = 0;
- end = overflow ? info.overflow_start : static_cast<int>(entries.size());
- } else {
- DCHECK(access == ConstantPoolEntry::OVERFLOWED);
- if (!overflow) return;
- begin = info.overflow_start;
- end = static_cast<int>(entries.size());
- }
-
- std::vector<ConstantPoolEntry>::iterator it = entries.begin();
- if (begin > 0) std::advance(it, begin);
- for (int i = begin; i < end; i++, it++) {
- // Update constant pool if necessary and get the entry's offset.
- int offset;
- ConstantPoolEntry::Access entry_access;
- if (!it->is_merged()) {
- // Emit new entry
- offset = assm->pc_offset() - base;
- entry_access = access;
- if (entry_size == kPointerSize) {
- assm->dp(it->value());
- } else {
- assm->dq(it->value64());
- }
- } else {
- // Retrieve offset from shared entry.
- offset = shared_entries[it->merged_index()].offset();
- entry_access = ConstantPoolEntry::REGULAR;
- }
-
- DCHECK(entry_access == ConstantPoolEntry::OVERFLOWED ||
- is_uintn(offset, info.regular_reach_bits));
-
- // Patch load sequence with correct offset.
- assm->PatchConstantPoolAccessInstruction(it->position(), offset,
- entry_access, type);
- }
-}
-
-
-// Emit and return position of pool. Zero implies no constant pool.
-int ConstantPoolBuilder::Emit(Assembler* assm) {
- bool emitted = emitted_label_.is_bound();
- bool empty = IsEmpty();
-
- if (!emitted) {
- // Mark start of constant pool. Align if necessary.
- if (!empty) assm->Align(kDoubleSize);
- assm->bind(&emitted_label_);
- if (!empty) {
- // Emit in groups based on access and type.
- // Emit doubles first for alignment purposes.
- EmitGroup(assm, ConstantPoolEntry::REGULAR, ConstantPoolEntry::DOUBLE);
- EmitGroup(assm, ConstantPoolEntry::REGULAR, ConstantPoolEntry::INTPTR);
- if (info_[ConstantPoolEntry::DOUBLE].overflow()) {
- assm->Align(kDoubleSize);
- EmitGroup(assm, ConstantPoolEntry::OVERFLOWED,
- ConstantPoolEntry::DOUBLE);
- }
- if (info_[ConstantPoolEntry::INTPTR].overflow()) {
- EmitGroup(assm, ConstantPoolEntry::OVERFLOWED,
- ConstantPoolEntry::INTPTR);
- }
- }
- }
-
- return !empty ? emitted_label_.pos() : 0;
-}
-
-
// Platform specific but identical code for all the platforms.
« no previous file with comments | « src/assembler.h ('k') | src/compiler/arm/code-generator-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698