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

Unified Diff: src/arm/assembler-arm.h

Issue 7021007: Optimise the deoptimisation check to improve performance on modern ARM cores.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 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 | « no previous file | src/arm/assembler-arm.cc » ('j') | src/arm/assembler-arm.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm/assembler-arm.h
===================================================================
--- src/arm/assembler-arm.h (revision 7890)
+++ src/arm/assembler-arm.h (working copy)
@@ -1159,6 +1159,60 @@
// instructions.
void BlockConstPoolFor(int instructions);
+ // This class is used to reduce the amount of code generated at deoptimization
+ // check sites in the optimized code.
+ // When the LCodeGen generates a deoptimization check (with
+ // LCodeGen::DeoptimizeIf()), a DeoptJumpEntry is stored in a buffer until a
+ // deoptimization jump table is emitted.
+ //
+ // deoptimization jump tables are emitted along with constant pools. (See
+ // Assembler::CheckConstPool().)
+ // When generating a deoptimization jump table, code will be generated for
+ // each registered DeoptJumpEntry to jump to the code handling the
+ // deoptimization.
+ //
+ // deopt check k: bcond offset_to_table_check_k // Almost never taken.
+ // [... more code ...]
+ //
+ // [ Constant pool
+ // [ Deoptimization jump table
+ // deopt jump table + 0x0: ldr pc, relocated_entry_for_check_0
+ // deopt jump table + 0x4: ldr pc, relocated_entry_for_check_1
+ // [...] ldr pc, ...
+ // deopt jump table + n * 0x4: ldr pc, relocated_entry_for_check_n
+ // ]
+ // [ Constant pool entries
+ // [... standard constant pool entries ...]
+ // [... additional constant pool entries for the deopt jump table ...]
+ // ]
+ // ]
+
+ class DeoptJumpEntry BASE_EMBEDDED {
+ public:
+ DeoptJumpEntry() {}
+ DeoptJumpEntry(int pc_offset, Condition cond, Address entry)
+ : pc_offset_(pc_offset), cond_(cond), entry_(entry) {
+ }
+
+ int pc_offset() { return pc_offset_; }
+ Condition cond() { return cond_; }
+ Address entry() { return entry_; }
+
+ // The size of the code generated for each DeoptJumpEntry in the
+ // deoptimization jump table.
+ static const int kJumpCodeSize = kInstrSize;
+ static const int kAdditionalRelocInfoSize = kPointerSize;
+ static const int kTotalSize = kJumpCodeSize + kAdditionalRelocInfoSize;
+
+ private:
+ int pc_offset_; // Offset from the start of the buffer.
+ Condition cond_;
+ Address entry_; // The address to jump to to deoptimize.
+ };
+
+ // Record deoptimization entry for current pc_.
+ void RecordDeoptJumpEntry(Address entry, Condition cond);
+
// Debugging
// Mark address of the ExitJSFrame code.
@@ -1217,8 +1271,10 @@
static Register GetCmpImmediateRegister(Instr instr);
static int GetCmpImmediateRawImmediate(Instr instr);
static bool IsNop(Instr instr, int type = NON_MARKING_NOP);
+ static bool IsBkpt(Instr instr, int code);
- // Check if is time to emit a constant pool for pending reloc info entries
+ // Check if it is time to emit a constant pool for pending reloc info entries.
+ // This will also emit the deoptimization jump table if necessary.
void CheckConstPool(bool force_emit, bool require_jump);
protected:
@@ -1322,10 +1378,18 @@
// stored in a separate buffer until a constant pool is emitted.
// If every instruction in a long sequence is accessing the pool, we need one
// pending relocation entry per instruction.
- static const int kMaxNumPRInfo = kMaxDistBetweenPools/kInstrSize;
+ static const int kMaxNumPRInfo = kMaxDistBetweenPools / kInstrSize;
RelocInfo prinfo_[kMaxNumPRInfo]; // the buffer of pending relocation info
int num_prinfo_; // number of pending reloc info entries in the buffer
+ // See comments about class DeoptJumpEntry.
+ static const int kMaxNumDeoptJumpEntries =
+ kMaxDistBetweenPools / DeoptJumpEntry::kTotalSize;
+ // The buffer of pending deoptimization jump entries.
+ DeoptJumpEntry deopt_jump_entries_[kMaxNumDeoptJumpEntries];
+ // Number of pending deoptimization jump entries.
+ int num_deopt_jump_entries_;
+
// The bound position, before this we cannot do instruction elimination.
int last_bound_pos_;
« no previous file with comments | « no previous file | src/arm/assembler-arm.cc » ('j') | src/arm/assembler-arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698