5#ifndef V8_CODEGEN_CONSTANT_POOL_H_
6#define V8_CODEGEN_CONSTANT_POOL_H_
84#if defined(V8_TARGET_ARCH_PPC64)
89class ConstantPoolBuilder {
91 ConstantPoolBuilder(
int ptr_reach_bits,
int double_reach_bits);
94 ~ConstantPoolBuilder() {
96 emitted_label_.Unuse();
97 emitted_label_.UnuseNear();
102 ConstantPoolEntry::Access AddEntry(
int position, intptr_t value,
104 ConstantPoolEntry entry(
position, value, sharing_ok);
105 return AddEntry(&entry, ConstantPoolEntry::INTPTR);
109 ConstantPoolEntry::Access AddEntry(
int position, base::Double value) {
110 ConstantPoolEntry entry(
position, value);
111 return AddEntry(&entry, ConstantPoolEntry::DOUBLE);
115 ConstantPoolEntry::Access AddEntry(
int position,
double value) {
116 return AddEntry(
position, base::Double(value));
120 ConstantPoolEntry::Access NextAccess(ConstantPoolEntry::Type type)
const;
123 return info_[ConstantPoolEntry::INTPTR].entries.empty() &&
124 info_[ConstantPoolEntry::INTPTR].shared_entries.empty() &&
125 info_[ConstantPoolEntry::DOUBLE].entries.empty() &&
126 info_[ConstantPoolEntry::DOUBLE].shared_entries.empty();
132 int Emit(Assembler* assm);
138 inline Label* EmittedPosition() {
return &emitted_label_; }
141 ConstantPoolEntry::Access AddEntry(ConstantPoolEntry* entry,
142 ConstantPoolEntry::Type type);
143 void EmitSharedEntries(Assembler* assm, ConstantPoolEntry::Type type);
144 void EmitGroup(Assembler* assm, ConstantPoolEntry::Access access,
145 ConstantPoolEntry::Type type);
147 struct PerTypeEntryInfo {
148 PerTypeEntryInfo() : regular_count(0), overflow_start(-1) {}
150 return (overflow_start >= 0 &&
151 overflow_start <
static_cast<int>(
entries.size()));
153 int regular_reach_bits;
156 std::vector<ConstantPoolEntry>
entries;
157 std::vector<ConstantPoolEntry> shared_entries;
160 Label emitted_label_;
161 PerTypeEntryInfo
info_[ConstantPoolEntry::NUMBER_OF_TYPES];
166#if defined(V8_TARGET_ARCH_ARM64) || defined(V8_TARGET_ARCH_RISCV64) || \
167 defined(V8_TARGET_ARCH_RISCV32)
169class ConstantPoolKey {
171 explicit ConstantPoolKey(uint64_t value,
172 RelocInfo::Mode rmode = RelocInfo::NO_INFO)
173 : is_value32_(false), value64_(value), rmode_(rmode) {}
175 explicit ConstantPoolKey(uint32_t value,
176 RelocInfo::Mode rmode = RelocInfo::NO_INFO)
177 : is_value32_(true), value32_(value), rmode_(rmode) {}
179 uint64_t value64()
const {
183 uint32_t value32()
const {
188 bool is_value32()
const {
return is_value32_; }
189 RelocInfo::Mode rmode()
const {
return rmode_; }
191 bool AllowsDeduplication()
const {
192 DCHECK(rmode_ != RelocInfo::CONST_POOL &&
193 rmode_ != RelocInfo::VENEER_POOL &&
194 rmode_ != RelocInfo::DEOPT_SCRIPT_OFFSET &&
195 rmode_ != RelocInfo::DEOPT_INLINING_ID &&
196 rmode_ != RelocInfo::DEOPT_REASON && rmode_ != RelocInfo::DEOPT_ID &&
197 rmode_ != RelocInfo::DEOPT_NODE_ID);
202 bool is_sharable_code_target =
203 rmode_ == RelocInfo::CODE_TARGET &&
204 (is_value32() ? (value32() != 0) : (value64() != 0));
205 bool is_sharable_embedded_object = RelocInfo::IsEmbeddedObjectMode(rmode_);
206 return RelocInfo::IsShareableRelocMode(rmode_) || is_sharable_code_target ||
207 is_sharable_embedded_object;
216 RelocInfo::Mode rmode_;
220inline bool operator<(
const ConstantPoolKey& a,
const ConstantPoolKey& b) {
221 if (a.is_value32() < b.is_value32())
return true;
222 if (a.is_value32() > b.is_value32())
return false;
223 if (a.rmode() < b.rmode())
return true;
224 if (a.rmode() > b.rmode())
return false;
225 if (a.is_value32())
return a.value32() < b.value32();
226 return a.value64() < b.value64();
229inline bool operator==(
const ConstantPoolKey& a,
const ConstantPoolKey& b) {
230 if (a.rmode() != b.rmode() || a.is_value32() != b.is_value32()) {
233 if (a.is_value32())
return a.value32() == b.value32();
234 return a.value64() == b.value64();
239enum class Emission { kIfNeeded,
kForced };
240enum class Alignment { kOmitted,
kRequired };
241enum class RelocInfoStatus { kMustRecord, kMustOmitForDuplicate };
242enum class PoolEmissionCheck {
kSkip };
254 explicit ConstantPool(Assembler* assm);
258 RelocInfoStatus RecordEntry(uint32_t data, RelocInfo::Mode rmode);
259 RelocInfoStatus RecordEntry(uint64_t data, RelocInfo::Mode rmode);
261 size_t Entry32Count()
const {
return entry32_count_; }
262 size_t Entry64Count()
const {
return entry64_count_; }
263 bool IsEmpty()
const {
return entries_.empty(); }
265 bool IsInImmRangeIfEmittedAt(
int pc_offset);
268 int ComputeSize(Jump require_jump, Alignment require_alignment)
const;
271 void EmitAndClear(Jump require);
272 bool ShouldEmitNow(Jump require_jump,
size_t margin = 0)
const;
280 bool IsBlocked()
const;
284 void SetNextCheckIn(
size_t instructions);
292 explicit BlockScope(Assembler* pool,
size_t margin = 0);
293 BlockScope(Assembler* pool, PoolEmissionCheck);
302 static const size_t kMaxDistToPool32;
303 static const size_t kMaxDistToPool64;
305 static const size_t kApproxDistToPool32;
309 static const size_t kOpportunityDistToPool32;
310 static const size_t kOpportunityDistToPool64;
314 static const size_t kApproxMaxEntryCount;
321 void EmitPrologue(Alignment require_alignment);
322 int PrologueSize(Jump require_jump)
const;
323 RelocInfoStatus RecordKey(ConstantPoolKey
key,
int offset);
324 RelocInfoStatus GetRelocInfoStatusFor(
const ConstantPoolKey&
key);
325 void Emit(
const ConstantPoolKey&
key);
326 void SetLoadOffsetToConstPoolEntry(
int load_offset, Instruction* entry_offset,
327 const ConstantPoolKey&
key);
328 Alignment IsAlignmentRequiredIfEmittedAt(Jump require_jump,
334 int first_use_32_ = -1;
335 int first_use_64_ = -1;
342 std::multimap<ConstantPoolKey, int>
entries_;
343 size_t entry32_count_ = 0;
344 size_t entry64_count_ = 0;
346 int old_next_check_ = 0;
347 int blocked_nesting_ = 0;
static int size(Type type)
ConstantPoolEntry(int position, intptr_t value, bool sharing_ok, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
void set_merged_index(int index)
void set_offset(int offset)
ConstantPoolEntry()=default
RelocInfo::Mode rmode() const
ConstantPoolEntry(int position, base::Double value, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
std::vector< EntryBuilder > entries_
ZoneVector< Entry > entries
constexpr int kSystemPointerSize
V8_INLINE constexpr bool operator<(Builtin a, Builtin b)
bool operator==(ExternalReference lhs, ExternalReference rhs)
constexpr int kDoubleSize
OptimizedCompilationInfo * info_
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName)
std::unique_ptr< ValueMirror > key