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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/arm/assembler-arm.cc » ('j') | src/arm/assembler-arm.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 private: 1152 private:
1153 Assembler* assem_; 1153 Assembler* assem_;
1154 1154
1155 DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstPoolScope); 1155 DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstPoolScope);
1156 }; 1156 };
1157 1157
1158 // Postpone the generation of the constant pool for the specified number of 1158 // Postpone the generation of the constant pool for the specified number of
1159 // instructions. 1159 // instructions.
1160 void BlockConstPoolFor(int instructions); 1160 void BlockConstPoolFor(int instructions);
1161 1161
1162 // This class is used to reduce the amount of code generated at deoptimization
1163 // check sites in the optimized code.
1164 // When the LCodeGen generates a deoptimization check (with
1165 // LCodeGen::DeoptimizeIf()), a DeoptJumpEntry is stored in a buffer until a
1166 // deoptimization jump table is emitted.
1167 //
1168 // deoptimization jump tables are emitted along with constant pools. (See
1169 // Assembler::CheckConstPool().)
1170 // When generating a deoptimization jump table, code will be generated for
1171 // each registered DeoptJumpEntry to jump to the code handling the
1172 // deoptimization.
1173 //
1174 // deopt check k: bcond offset_to_table_check_k // Almost never taken.
1175 // [... more code ...]
1176 //
1177 // [ Constant pool
1178 // [ Deoptimization jump table
1179 // deopt jump table + 0x0: ldr pc, relocated_entry_for_check_0
1180 // deopt jump table + 0x4: ldr pc, relocated_entry_for_check_1
1181 // [...] ldr pc, ...
1182 // deopt jump table + n * 0x4: ldr pc, relocated_entry_for_check_n
1183 // ]
1184 // [ Constant pool entries
1185 // [... standard constant pool entries ...]
1186 // [... additional constant pool entries for the deopt jump table ...]
1187 // ]
1188 // ]
1189
1190 class DeoptJumpEntry BASE_EMBEDDED {
1191 public:
1192 DeoptJumpEntry() {}
1193 DeoptJumpEntry(int pc_offset, Condition cond, Address entry)
1194 : pc_offset_(pc_offset), cond_(cond), entry_(entry) {
1195 }
1196
1197 int pc_offset() { return pc_offset_; }
1198 Condition cond() { return cond_; }
1199 Address entry() { return entry_; }
1200
1201 // The size of the code generated for each DeoptJumpEntry in the
1202 // deoptimization jump table.
1203 static const int kJumpCodeSize = kInstrSize;
1204 static const int kAdditionalRelocInfoSize = kPointerSize;
1205 static const int kTotalSize = kJumpCodeSize + kAdditionalRelocInfoSize;
1206
1207 private:
1208 int pc_offset_; // Offset from the start of the buffer.
1209 Condition cond_;
1210 Address entry_; // The address to jump to to deoptimize.
1211 };
1212
1213 // Record deoptimization entry for current pc_.
1214 void RecordDeoptJumpEntry(Address entry, Condition cond);
1215
1162 // Debugging 1216 // Debugging
1163 1217
1164 // Mark address of the ExitJSFrame code. 1218 // Mark address of the ExitJSFrame code.
1165 void RecordJSReturn(); 1219 void RecordJSReturn();
1166 1220
1167 // Mark address of a debug break slot. 1221 // Mark address of a debug break slot.
1168 void RecordDebugBreakSlot(); 1222 void RecordDebugBreakSlot();
1169 1223
1170 // Record the AST id of the CallIC being compiled, so that it can be placed 1224 // Record the AST id of the CallIC being compiled, so that it can be placed
1171 // in the relocation information. 1225 // in the relocation information.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 static bool IsLdrRegFpOffset(Instr instr); 1264 static bool IsLdrRegFpOffset(Instr instr);
1211 static bool IsStrRegFpNegOffset(Instr instr); 1265 static bool IsStrRegFpNegOffset(Instr instr);
1212 static bool IsLdrRegFpNegOffset(Instr instr); 1266 static bool IsLdrRegFpNegOffset(Instr instr);
1213 static bool IsLdrPcImmediateOffset(Instr instr); 1267 static bool IsLdrPcImmediateOffset(Instr instr);
1214 static bool IsTstImmediate(Instr instr); 1268 static bool IsTstImmediate(Instr instr);
1215 static bool IsCmpRegister(Instr instr); 1269 static bool IsCmpRegister(Instr instr);
1216 static bool IsCmpImmediate(Instr instr); 1270 static bool IsCmpImmediate(Instr instr);
1217 static Register GetCmpImmediateRegister(Instr instr); 1271 static Register GetCmpImmediateRegister(Instr instr);
1218 static int GetCmpImmediateRawImmediate(Instr instr); 1272 static int GetCmpImmediateRawImmediate(Instr instr);
1219 static bool IsNop(Instr instr, int type = NON_MARKING_NOP); 1273 static bool IsNop(Instr instr, int type = NON_MARKING_NOP);
1274 static bool IsBkpt(Instr instr, int code);
1220 1275
1221 // Check if is time to emit a constant pool for pending reloc info entries 1276 // Check if it is time to emit a constant pool for pending reloc info entries.
1277 // This will also emit the deoptimization jump table if necessary.
1222 void CheckConstPool(bool force_emit, bool require_jump); 1278 void CheckConstPool(bool force_emit, bool require_jump);
1223 1279
1224 protected: 1280 protected:
1225 // Relocation for a type-recording IC has the AST id added to it. This 1281 // Relocation for a type-recording IC has the AST id added to it. This
1226 // member variable is a way to pass the information from the call site to 1282 // member variable is a way to pass the information from the call site to
1227 // the relocation info. 1283 // the relocation info.
1228 unsigned ast_id_for_reloc_info_; 1284 unsigned ast_id_for_reloc_info_;
1229 1285
1230 bool emit_debug_code() const { return emit_debug_code_; } 1286 bool emit_debug_code() const { return emit_debug_code_; }
1231 1287
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1315 // Relocation info generation 1371 // Relocation info generation
1316 // Each relocation is encoded as a variable size value 1372 // Each relocation is encoded as a variable size value
1317 static const int kMaxRelocSize = RelocInfoWriter::kMaxSize; 1373 static const int kMaxRelocSize = RelocInfoWriter::kMaxSize;
1318 RelocInfoWriter reloc_info_writer; 1374 RelocInfoWriter reloc_info_writer;
1319 // Relocation info records are also used during code generation as temporary 1375 // Relocation info records are also used during code generation as temporary
1320 // containers for constants and code target addresses until they are emitted 1376 // containers for constants and code target addresses until they are emitted
1321 // to the constant pool. These pending relocation info records are temporarily 1377 // to the constant pool. These pending relocation info records are temporarily
1322 // stored in a separate buffer until a constant pool is emitted. 1378 // stored in a separate buffer until a constant pool is emitted.
1323 // If every instruction in a long sequence is accessing the pool, we need one 1379 // If every instruction in a long sequence is accessing the pool, we need one
1324 // pending relocation entry per instruction. 1380 // pending relocation entry per instruction.
1325 static const int kMaxNumPRInfo = kMaxDistBetweenPools/kInstrSize; 1381 static const int kMaxNumPRInfo = kMaxDistBetweenPools / kInstrSize;
1326 RelocInfo prinfo_[kMaxNumPRInfo]; // the buffer of pending relocation info 1382 RelocInfo prinfo_[kMaxNumPRInfo]; // the buffer of pending relocation info
1327 int num_prinfo_; // number of pending reloc info entries in the buffer 1383 int num_prinfo_; // number of pending reloc info entries in the buffer
1328 1384
1385 // See comments about class DeoptJumpEntry.
1386 static const int kMaxNumDeoptJumpEntries =
1387 kMaxDistBetweenPools / DeoptJumpEntry::kTotalSize;
1388 // The buffer of pending deoptimization jump entries.
1389 DeoptJumpEntry deopt_jump_entries_[kMaxNumDeoptJumpEntries];
1390 // Number of pending deoptimization jump entries.
1391 int num_deopt_jump_entries_;
1392
1329 // The bound position, before this we cannot do instruction elimination. 1393 // The bound position, before this we cannot do instruction elimination.
1330 int last_bound_pos_; 1394 int last_bound_pos_;
1331 1395
1332 // Code emission 1396 // Code emission
1333 inline void CheckBuffer(); 1397 inline void CheckBuffer();
1334 void GrowBuffer(); 1398 void GrowBuffer();
1335 inline void emit(Instr x); 1399 inline void emit(Instr x);
1336 1400
1337 // Instruction generation 1401 // Instruction generation
1338 void addrmod1(Instr instr, Register rn, Register rd, const Operand& x); 1402 void addrmod1(Instr instr, Register rn, Register rd, const Operand& x);
(...skipping 27 matching lines...) Expand all
1366 public: 1430 public:
1367 explicit EnsureSpace(Assembler* assembler) { 1431 explicit EnsureSpace(Assembler* assembler) {
1368 assembler->CheckBuffer(); 1432 assembler->CheckBuffer();
1369 } 1433 }
1370 }; 1434 };
1371 1435
1372 1436
1373 } } // namespace v8::internal 1437 } } // namespace v8::internal
1374 1438
1375 #endif // V8_ARM_ASSEMBLER_ARM_H_ 1439 #endif // V8_ARM_ASSEMBLER_ARM_H_
OLDNEW
« 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