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 |