Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index 4ad0d706ebff29a3706a34e605ad732e9b128ed9..a511db6f2cfcd850434544a62f5c39689750d96f 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -483,17 +483,16 @@ const Instr kStrRegFpNegOffsetPattern = |
al | B26 | NegOffset | Register::kCode_fp * B16; |
const Instr kLdrStrInstrTypeMask = 0xffff0000; |
- |
Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) |
: AssemblerBase(isolate, buffer, buffer_size), |
recorded_ast_id_(TypeFeedbackId::None()), |
- pending_32_bit_constants_(&pending_32_bit_constants_buffer_[0]), |
- pending_64_bit_constants_(&pending_64_bit_constants_buffer_[0]), |
+ pending_32_bit_constants_(), |
+ pending_64_bit_constants_(), |
constant_pool_builder_(kLdrMaxReachBits, kVldrMaxReachBits), |
positions_recorder_(this) { |
+ pending_32_bit_constants_.reserve(kMinNumPendingConstants); |
+ pending_64_bit_constants_.reserve(kMinNumPendingConstants); |
reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); |
- num_pending_32_bit_constants_ = 0; |
- num_pending_64_bit_constants_ = 0; |
next_buffer_check_ = 0; |
const_pool_blocked_nesting_ = 0; |
no_const_pool_before_ = 0; |
@@ -506,12 +505,6 @@ Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) |
Assembler::~Assembler() { |
DCHECK(const_pool_blocked_nesting_ == 0); |
- if (pending_32_bit_constants_ != &pending_32_bit_constants_buffer_[0]) { |
- delete[] pending_32_bit_constants_; |
- } |
- if (pending_64_bit_constants_ != &pending_64_bit_constants_buffer_[0]) { |
- delete[] pending_64_bit_constants_; |
- } |
} |
@@ -524,8 +517,8 @@ void Assembler::GetCode(CodeDesc* desc) { |
constant_pool_offset = EmitEmbeddedConstantPool(); |
} else { |
CheckConstPool(true, false); |
- DCHECK(num_pending_32_bit_constants_ == 0); |
- DCHECK(num_pending_64_bit_constants_ == 0); |
+ DCHECK(pending_32_bit_constants_.empty()); |
+ DCHECK(pending_64_bit_constants_.empty()); |
} |
// Set up code descriptor. |
desc->buffer = buffer_; |
@@ -3880,8 +3873,8 @@ void Assembler::GrowBuffer() { |
void Assembler::db(uint8_t data) { |
// db is used to write raw data. The constant pool should be emitted or |
// blocked before using db. |
- DCHECK(is_const_pool_blocked() || (num_pending_32_bit_constants_ == 0)); |
- DCHECK(is_const_pool_blocked() || (num_pending_64_bit_constants_ == 0)); |
+ DCHECK(is_const_pool_blocked() || pending_32_bit_constants_.empty()); |
+ DCHECK(is_const_pool_blocked() || pending_64_bit_constants_.empty()); |
CheckBuffer(); |
*reinterpret_cast<uint8_t*>(pc_) = data; |
pc_ += sizeof(uint8_t); |
@@ -3891,8 +3884,8 @@ void Assembler::db(uint8_t data) { |
void Assembler::dd(uint32_t data) { |
// dd is used to write raw data. The constant pool should be emitted or |
// blocked before using dd. |
- DCHECK(is_const_pool_blocked() || (num_pending_32_bit_constants_ == 0)); |
- DCHECK(is_const_pool_blocked() || (num_pending_64_bit_constants_ == 0)); |
+ DCHECK(is_const_pool_blocked() || pending_32_bit_constants_.empty()); |
+ DCHECK(is_const_pool_blocked() || pending_64_bit_constants_.empty()); |
CheckBuffer(); |
*reinterpret_cast<uint32_t*>(pc_) = data; |
pc_ += sizeof(uint32_t); |
@@ -3902,8 +3895,8 @@ void Assembler::dd(uint32_t data) { |
void Assembler::dq(uint64_t value) { |
// dq is used to write raw data. The constant pool should be emitted or |
// blocked before using dq. |
- DCHECK(is_const_pool_blocked() || (num_pending_32_bit_constants_ == 0)); |
- DCHECK(is_const_pool_blocked() || (num_pending_64_bit_constants_ == 0)); |
+ DCHECK(is_const_pool_blocked() || pending_32_bit_constants_.empty()); |
+ DCHECK(is_const_pool_blocked() || pending_64_bit_constants_.empty()); |
CheckBuffer(); |
*reinterpret_cast<uint64_t*>(pc_) = value; |
pc_ += sizeof(uint64_t); |
@@ -3946,21 +3939,12 @@ ConstantPoolEntry::Access Assembler::ConstantPoolAddEntry(int position, |
if (FLAG_enable_embedded_constant_pool) { |
return constant_pool_builder_.AddEntry(position, value, sharing_ok); |
} else { |
- DCHECK(num_pending_32_bit_constants_ < kMaxNumPending32Constants); |
- if (num_pending_32_bit_constants_ == 0) { |
+ DCHECK(pending_32_bit_constants_.size() < kMaxNumPending32Constants); |
+ if (pending_32_bit_constants_.empty()) { |
first_const_pool_32_use_ = position; |
- } else if (num_pending_32_bit_constants_ == kMinNumPendingConstants && |
- pending_32_bit_constants_ == |
- &pending_32_bit_constants_buffer_[0]) { |
- // Inline buffer is full, switch to dynamically allocated buffer. |
- pending_32_bit_constants_ = |
- new ConstantPoolEntry[kMaxNumPending32Constants]; |
- std::copy(&pending_32_bit_constants_buffer_[0], |
- &pending_32_bit_constants_buffer_[kMinNumPendingConstants], |
- &pending_32_bit_constants_[0]); |
} |
ConstantPoolEntry entry(position, value, sharing_ok); |
- pending_32_bit_constants_[num_pending_32_bit_constants_++] = entry; |
+ pending_32_bit_constants_.push_back(entry); |
// Make sure the constant pool is not emitted in place of the next |
// instruction for which we just recorded relocation info. |
@@ -3975,21 +3959,12 @@ ConstantPoolEntry::Access Assembler::ConstantPoolAddEntry(int position, |
if (FLAG_enable_embedded_constant_pool) { |
return constant_pool_builder_.AddEntry(position, value); |
} else { |
- DCHECK(num_pending_64_bit_constants_ < kMaxNumPending64Constants); |
- if (num_pending_64_bit_constants_ == 0) { |
+ DCHECK(pending_64_bit_constants_.size() < kMaxNumPending64Constants); |
+ if (pending_64_bit_constants_.empty()) { |
first_const_pool_64_use_ = position; |
- } else if (num_pending_64_bit_constants_ == kMinNumPendingConstants && |
- pending_64_bit_constants_ == |
- &pending_64_bit_constants_buffer_[0]) { |
- // Inline buffer is full, switch to dynamically allocated buffer. |
- pending_64_bit_constants_ = |
- new ConstantPoolEntry[kMaxNumPending64Constants]; |
- std::copy(&pending_64_bit_constants_buffer_[0], |
- &pending_64_bit_constants_buffer_[kMinNumPendingConstants], |
- &pending_64_bit_constants_[0]); |
} |
ConstantPoolEntry entry(position, value); |
- pending_64_bit_constants_[num_pending_64_bit_constants_++] = entry; |
+ pending_64_bit_constants_.push_back(entry); |
// Make sure the constant pool is not emitted in place of the next |
// instruction for which we just recorded relocation info. |
@@ -4002,8 +3977,8 @@ ConstantPoolEntry::Access Assembler::ConstantPoolAddEntry(int position, |
void Assembler::BlockConstPoolFor(int instructions) { |
if (FLAG_enable_embedded_constant_pool) { |
// Should be a no-op if using an embedded constant pool. |
- DCHECK(num_pending_32_bit_constants_ == 0); |
- DCHECK(num_pending_64_bit_constants_ == 0); |
+ DCHECK(pending_32_bit_constants_.empty()); |
+ DCHECK(pending_64_bit_constants_.empty()); |
return; |
} |
@@ -4012,11 +3987,11 @@ void Assembler::BlockConstPoolFor(int instructions) { |
// Max pool start (if we need a jump and an alignment). |
#ifdef DEBUG |
int start = pc_limit + kInstrSize + 2 * kPointerSize; |
- DCHECK((num_pending_32_bit_constants_ == 0) || |
+ DCHECK(pending_32_bit_constants_.empty() || |
(start - first_const_pool_32_use_ + |
- num_pending_64_bit_constants_ * kDoubleSize < |
+ pending_64_bit_constants_.size() * kDoubleSize < |
kMaxDistToIntPool)); |
- DCHECK((num_pending_64_bit_constants_ == 0) || |
+ DCHECK(pending_64_bit_constants_.empty() || |
(start - first_const_pool_64_use_ < kMaxDistToFPPool)); |
#endif |
no_const_pool_before_ = pc_limit; |
@@ -4031,8 +4006,8 @@ void Assembler::BlockConstPoolFor(int instructions) { |
void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
if (FLAG_enable_embedded_constant_pool) { |
// Should be a no-op if using an embedded constant pool. |
- DCHECK(num_pending_32_bit_constants_ == 0); |
- DCHECK(num_pending_64_bit_constants_ == 0); |
+ DCHECK(pending_32_bit_constants_.empty()); |
+ DCHECK(pending_64_bit_constants_.empty()); |
return; |
} |
@@ -4046,8 +4021,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
} |
// There is nothing to do if there are no pending constant pool entries. |
- if ((num_pending_32_bit_constants_ == 0) && |
- (num_pending_64_bit_constants_ == 0)) { |
+ if (pending_32_bit_constants_.empty() && pending_64_bit_constants_.empty()) { |
// Calculate the offset of the next check. |
next_buffer_check_ = pc_offset() + kCheckPoolInterval; |
return; |
@@ -4059,9 +4033,9 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
int jump_instr = require_jump ? kInstrSize : 0; |
int size_up_to_marker = jump_instr + kInstrSize; |
int estimated_size_after_marker = |
- num_pending_32_bit_constants_ * kPointerSize; |
- bool has_int_values = (num_pending_32_bit_constants_ > 0); |
- bool has_fp_values = (num_pending_64_bit_constants_ > 0); |
+ pending_32_bit_constants_.size() * kPointerSize; |
+ bool has_int_values = !pending_32_bit_constants_.empty(); |
+ bool has_fp_values = !pending_64_bit_constants_.empty(); |
bool require_64_bit_align = false; |
if (has_fp_values) { |
require_64_bit_align = |
@@ -4070,7 +4044,8 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
if (require_64_bit_align) { |
estimated_size_after_marker += kInstrSize; |
} |
- estimated_size_after_marker += num_pending_64_bit_constants_ * kDoubleSize; |
+ estimated_size_after_marker += |
+ pending_64_bit_constants_.size() * kDoubleSize; |
} |
int estimated_size = size_up_to_marker + estimated_size_after_marker; |
@@ -4089,7 +4064,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
// The 64-bit constants are always emitted before the 32-bit constants, so |
// we can ignore the effect of the 32-bit constants on estimated_size. |
int dist64 = pc_offset() + estimated_size - |
- num_pending_32_bit_constants_ * kPointerSize - |
+ pending_32_bit_constants_.size() * kPointerSize - |
first_const_pool_64_use_; |
if ((dist64 >= kMaxDistToFPPool - kCheckPoolInterval) || |
(!require_jump && (dist64 >= kMaxDistToFPPool / 2))) { |
@@ -4108,7 +4083,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
// Deduplicate constants. |
int size_after_marker = estimated_size_after_marker; |
- for (int i = 0; i < num_pending_64_bit_constants_; i++) { |
+ for (int i = 0; i < pending_64_bit_constants_.size(); i++) { |
ConstantPoolEntry& entry = pending_64_bit_constants_[i]; |
DCHECK(!entry.is_merged()); |
for (int j = 0; j < i; j++) { |
@@ -4121,7 +4096,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
} |
} |
- for (int i = 0; i < num_pending_32_bit_constants_; i++) { |
+ for (int i = 0; i < pending_32_bit_constants_.size(); i++) { |
ConstantPoolEntry& entry = pending_32_bit_constants_[i]; |
DCHECK(!entry.is_merged()); |
if (!entry.sharing_ok()) continue; |
@@ -4166,7 +4141,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
// Emit 64-bit constant pool entries first: their range is smaller than |
// 32-bit entries. |
- for (int i = 0; i < num_pending_64_bit_constants_; i++) { |
+ for (int i = 0; i < pending_64_bit_constants_.size(); i++) { |
ConstantPoolEntry& entry = pending_64_bit_constants_[i]; |
Instr instr = instr_at(entry.position()); |
@@ -4195,7 +4170,7 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
} |
// Emit 32-bit constant pool entries. |
- for (int i = 0; i < num_pending_32_bit_constants_; i++) { |
+ for (int i = 0; i < pending_32_bit_constants_.size(); i++) { |
ConstantPoolEntry& entry = pending_32_bit_constants_[i]; |
Instr instr = instr_at(entry.position()); |
@@ -4229,8 +4204,8 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
} |
} |
- num_pending_32_bit_constants_ = 0; |
- num_pending_64_bit_constants_ = 0; |
+ pending_32_bit_constants_.clear(); |
+ pending_64_bit_constants_.clear(); |
first_const_pool_32_use_ = -1; |
first_const_pool_64_use_ = -1; |