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

Unified Diff: src/ppc/assembler-ppc.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/ppc/assembler-ppc.h ('k') | src/ppc/assembler-ppc-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ppc/assembler-ppc.cc
diff --git a/src/ppc/assembler-ppc.cc b/src/ppc/assembler-ppc.cc
index cce578e9f6cde0c2519afdf5d72311a2b64668ce..f5929ec58c73fad95852aecec2e5e4c4f83cadf0 100644
--- a/src/ppc/assembler-ppc.cc
+++ b/src/ppc/assembler-ppc.cc
@@ -148,17 +148,13 @@
bool RelocInfo::IsCodedSpecially() {
// The deserializer needs to know whether a pointer is specially
// coded. Being specially coded on PPC means that it is a lis/ori
- // instruction sequence or is a constant pool entry, and these are
- // always the case inside code objects.
+ // instruction sequence, and these are always the case inside code
+ // objects.
return true;
}
bool RelocInfo::IsInConstantPool() {
- if (FLAG_enable_embedded_constant_pool) {
- Address constant_pool = host_->constant_pool();
- return (constant_pool && Assembler::IsConstantPoolLoadStart(pc_));
- }
return false;
}
@@ -205,13 +201,11 @@
Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size)
: AssemblerBase(isolate, buffer, buffer_size),
recorded_ast_id_(TypeFeedbackId::None()),
- constant_pool_builder_(kLoadPtrMaxReachBits, kLoadDoubleMaxReachBits),
positions_recorder_(this) {
reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
no_trampoline_pool_before_ = 0;
trampoline_pool_blocked_nesting_ = 0;
- constant_pool_entry_sharing_blocked_nesting_ = 0;
// We leave space (kMaxBlockTrampolineSectionSize)
// for BlockTrampolinePoolScope buffer.
next_buffer_check_ =
@@ -227,9 +221,6 @@
void Assembler::GetCode(CodeDesc* desc) {
- // Emit constant pool if necessary.
- int constant_pool_offset = EmitConstantPool();
-
EmitRelocations();
// Set up code descriptor.
@@ -237,8 +228,6 @@
desc->buffer_size = buffer_size_;
desc->instr_size = pc_offset();
desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
- desc->constant_pool_size =
- (constant_pool_offset ? desc->instr_size - constant_pool_offset : 0);
desc->origin = this;
}
@@ -249,12 +238,7 @@
#else
DCHECK(m >= 4 && base::bits::IsPowerOfTwo32(m));
#endif
- // First ensure instruction alignment
- while (pc_offset() & (kInstrSize - 1)) {
- db(0);
- }
- // Then pad to requested alignedment with nops
- while (pc_offset() & (m - 1)) {
+ while ((pc_offset() & (m - 1)) != 0) {
nop();
}
}
@@ -487,8 +471,7 @@
// Load the address of the label in a register.
Register dst = Register::from_code(instr_at(pos + kInstrSize));
CodePatcher patcher(reinterpret_cast<byte*>(buffer_ + pos),
- kMovInstructionsNoConstantPool,
- CodePatcher::DONT_FLUSH);
+ kMovInstructions, CodePatcher::DONT_FLUSH);
// Keep internal references relative until EmitRelocations.
patcher.masm()->bitwise_mov(dst, target_pos);
break;
@@ -497,7 +480,7 @@
CodePatcher patcher(reinterpret_cast<byte*>(buffer_ + pos),
kPointerSize / kInstrSize, CodePatcher::DONT_FLUSH);
// Keep internal references relative until EmitRelocations.
- patcher.masm()->dp(target_pos);
+ patcher.masm()->emit_ptr(target_pos);
break;
}
default:
@@ -1509,53 +1492,10 @@
Label instructions;
DCHECK(pc_offset() == 0);
emit_label_addr(&instructions);
- dp(0);
- dp(0);
+ emit_ptr(0);
+ emit_ptr(0);
bind(&instructions);
#endif
-}
-
-
-int Assembler::instructions_required_for_mov(Register dst,
- const Operand& src) const {
- bool canOptimize =
- !(src.must_output_reloc_info(this) || is_trampoline_pool_blocked());
- if (use_constant_pool_for_mov(dst, src, canOptimize)) {
- if (ConstantPoolAccessIsInOverflow()) {
- return kMovInstructionsConstantPool + 1;
- }
- return kMovInstructionsConstantPool;
- }
- DCHECK(!canOptimize);
- return kMovInstructionsNoConstantPool;
-}
-
-
-bool Assembler::use_constant_pool_for_mov(Register dst, const Operand& src,
- bool canOptimize) const {
- if (!FLAG_enable_embedded_constant_pool || !is_constant_pool_available()) {
- // If there is no constant pool available, we must use a mov
- // immediate sequence.
- return false;
- }
-
- intptr_t value = src.immediate();
-#if V8_TARGET_ARCH_PPC64
- bool allowOverflow = !((canOptimize && is_int32(value)) || dst.is(r0));
-#else
- bool allowOverflow = !(canOptimize || dst.is(r0));
-#endif
- if (canOptimize && is_int16(value)) {
- // Prefer a single-instruction load-immediate.
- return false;
- }
- if (!allowOverflow && ConstantPoolAccessIsInOverflow()) {
- // Prefer non-relocatable two-instruction bitwise-mov32 over
- // overflow sequence.
- return false;
- }
-
- return true;
}
@@ -1590,30 +1530,6 @@
canOptimize =
!(relocatable || (is_trampoline_pool_blocked() && !is_int16(value)));
-
- if (use_constant_pool_for_mov(dst, src, canOptimize)) {
- DCHECK(is_constant_pool_available());
- if (relocatable) {
- RecordRelocInfo(src.rmode_);
- }
- ConstantPoolEntry::Access access = ConstantPoolAddEntry(src.rmode_, value);
-#if V8_TARGET_ARCH_PPC64
- if (access == ConstantPoolEntry::OVERFLOWED) {
- addis(dst, kConstantPoolRegister, Operand::Zero());
- ld(dst, MemOperand(dst, 0));
- } else {
- ld(dst, MemOperand(kConstantPoolRegister, 0));
- }
-#else
- if (access == ConstantPoolEntry::OVERFLOWED) {
- addis(dst, kConstantPoolRegister, Operand::Zero());
- lwz(dst, MemOperand(dst, 0));
- } else {
- lwz(dst, MemOperand(kConstantPoolRegister, 0));
- }
-#endif
- return;
- }
if (canOptimize) {
if (is_int16(value)) {
@@ -1780,8 +1696,8 @@
BlockTrampolinePoolScope block_trampoline_pool(this);
emit(kUnboundMovLabelAddrOpcode | (link & kImm26Mask));
emit(dst.code());
- DCHECK(kMovInstructionsNoConstantPool >= 2);
- for (int i = 0; i < kMovInstructionsNoConstantPool - 2; i++) nop();
+ DCHECK(kMovInstructions >= 2);
+ for (int i = 0; i < kMovInstructions - 2; i++) nop();
}
}
@@ -1792,7 +1708,7 @@
int position = link(label);
if (label->is_bound()) {
// Keep internal references relative until EmitRelocations.
- dp(position);
+ emit_ptr(position);
} else {
// Encode internal reference to unbound label. We use a dummy opcode
// such that it won't collide with any opcode that might appear in the
@@ -1923,7 +1839,6 @@
void Assembler::lfd(const DoubleRegister frt, const MemOperand& src) {
int offset = src.offset();
Register ra = src.ra();
- DCHECK(!ra.is(r0));
DCHECK(is_int16(offset));
int imm16 = offset & kImm16Mask;
// could be x_form instruction with some casting magic
@@ -1934,7 +1849,6 @@
void Assembler::lfdu(const DoubleRegister frt, const MemOperand& src) {
int offset = src.offset();
Register ra = src.ra();
- DCHECK(!ra.is(r0));
DCHECK(is_int16(offset));
int imm16 = offset & kImm16Mask;
// could be x_form instruction with some casting magic
@@ -2334,33 +2248,51 @@
}
-void Assembler::dq(uint64_t value) {
+void Assembler::emit_ptr(intptr_t data) {
CheckBuffer();
- *reinterpret_cast<uint64_t*>(pc_) = value;
- pc_ += sizeof(uint64_t);
-}
-
-
-void Assembler::dp(uintptr_t data) {
+ *reinterpret_cast<intptr_t*>(pc_) = data;
+ pc_ += sizeof(intptr_t);
+}
+
+
+void Assembler::emit_double(double value) {
CheckBuffer();
- *reinterpret_cast<uintptr_t*>(pc_) = data;
- pc_ += sizeof(uintptr_t);
+ *reinterpret_cast<double*>(pc_) = value;
+ pc_ += sizeof(double);
}
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
- if (RelocInfo::IsNone(rmode) ||
- // Don't record external references unless the heap will be serialized.
- (rmode == RelocInfo::EXTERNAL_REFERENCE && !serializer_enabled() &&
- !emit_debug_code())) {
- return;
- }
- if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
- data = RecordedAstId().ToInt();
- ClearRecordedAstId();
- }
DeferredRelocInfo rinfo(pc_offset(), rmode, data);
- relocations_.push_back(rinfo);
+ RecordRelocInfo(rinfo);
+}
+
+
+void Assembler::RecordRelocInfo(const DeferredRelocInfo& rinfo) {
+ if (rinfo.rmode() >= RelocInfo::JS_RETURN &&
+ rinfo.rmode() <= RelocInfo::DEBUG_BREAK_SLOT) {
+ // Adjust code for new modes.
+ DCHECK(RelocInfo::IsDebugBreakSlot(rinfo.rmode()) ||
+ RelocInfo::IsJSReturn(rinfo.rmode()) ||
+ RelocInfo::IsComment(rinfo.rmode()) ||
+ RelocInfo::IsPosition(rinfo.rmode()));
+ }
+ if (!RelocInfo::IsNone(rinfo.rmode())) {
+ // Don't record external references unless the heap will be serialized.
+ if (rinfo.rmode() == RelocInfo::EXTERNAL_REFERENCE) {
+ if (!serializer_enabled() && !emit_debug_code()) {
+ return;
+ }
+ }
+ if (rinfo.rmode() == RelocInfo::CODE_TARGET_WITH_ID) {
+ DeferredRelocInfo reloc_info_with_ast_id(rinfo.position(), rinfo.rmode(),
+ RecordedAstId().ToInt());
+ ClearRecordedAstId();
+ relocations_.push_back(reloc_info_with_ast_id);
+ } else {
+ relocations_.push_back(rinfo);
+ }
+ }
}
@@ -2446,6 +2378,15 @@
}
+Handle<ConstantPoolArray> Assembler::NewConstantPool(Isolate* isolate) {
+ DCHECK(!FLAG_enable_ool_constant_pool);
+ return isolate->factory()->empty_constant_pool_array();
+}
+
+
+void Assembler::PopulateConstantPool(ConstantPoolArray* constant_pool) {
+ DCHECK(!FLAG_enable_ool_constant_pool);
+}
} // namespace internal
} // namespace v8
« no previous file with comments | « src/ppc/assembler-ppc.h ('k') | src/ppc/assembler-ppc-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698