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

Side by Side Diff: runtime/vm/regexp_assembler.h

Issue 722243002: Indirectly dispatch all backtracking jumps through the same block. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: const Created 6 years, 1 month 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_REGEXP_ASSEMBLER_H_ 5 #ifndef VM_REGEXP_ASSEMBLER_H_
6 #define VM_REGEXP_ASSEMBLER_H_ 6 #define VM_REGEXP_ASSEMBLER_H_
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/intermediate_language.h" 9 #include "vm/intermediate_language.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 virtual void ReadStackPointerFromRegister(intptr_t reg); 321 virtual void ReadStackPointerFromRegister(intptr_t reg);
322 virtual void SetCurrentPositionFromEnd(intptr_t by); 322 virtual void SetCurrentPositionFromEnd(intptr_t by);
323 virtual void SetRegister(intptr_t register_index, intptr_t to); 323 virtual void SetRegister(intptr_t register_index, intptr_t to);
324 virtual bool Succeed(); 324 virtual bool Succeed();
325 virtual void WriteCurrentPositionToRegister(intptr_t reg, intptr_t cp_offset); 325 virtual void WriteCurrentPositionToRegister(intptr_t reg, intptr_t cp_offset);
326 virtual void ClearRegisters(intptr_t reg_from, intptr_t reg_to); 326 virtual void ClearRegisters(intptr_t reg_from, intptr_t reg_to);
327 virtual void WriteStackPointerToRegister(intptr_t reg); 327 virtual void WriteStackPointerToRegister(intptr_t reg);
328 328
329 virtual void PrintBlocks(); 329 virtual void PrintBlocks();
330 330
331 IndirectGotoInstr* backtrack_goto() const { return backtrack_goto_; }
331 GraphEntryInstr* graph_entry() const { return entry_block_; } 332 GraphEntryInstr* graph_entry() const { return entry_block_; }
332 333
333 intptr_t num_stack_locals() const { return local_id_.Count(); } 334 intptr_t num_stack_locals() const { return local_id_.Count(); }
334 intptr_t num_blocks() const { return block_id_.Count(); } 335 intptr_t num_blocks() const { return block_id_.Count(); }
335 336
336 // A table mapping block ids to block offsets, used to look up offsets 337 // Generate a dispatch block implementing backtracking. Must be done after
337 // for indirect goto instructions. 338 // graph construction.
338 void FinalizeBlockOffsetTable(); 339 void GenerateBacktrackBlock();
339
340 // Fill in indirect goto successors.
341 void FinalizeIndirectGotos();
342 340
343 private: 341 private:
344 // Generate the contents of preset blocks. The entry block is the entry point 342 // Generate the contents of preset blocks. The entry block is the entry point
345 // of the generated code. 343 // of the generated code.
346 void GenerateEntryBlock(); 344 void GenerateEntryBlock();
347 // Performs backtracking, i.e. popping an offset from the stack and doing
348 // an indirect goto.
349 void GenerateBacktrackBlock();
350 // Copies capture indices into the result area and returns true. 345 // Copies capture indices into the result area and returns true.
351 void GenerateSuccessBlock(); 346 void GenerateSuccessBlock();
352 // Returns false. 347 // Returns false.
353 void GenerateExitBlock(); 348 void GenerateExitBlock();
354 349
355 enum ComparisonKind { 350 enum ComparisonKind {
356 kEQ, 351 kEQ,
357 kNE, 352 kNE,
358 kLT, 353 kLT,
359 kGT, 354 kGT,
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 // Which mode to generate code for (ASCII or UC16). 555 // Which mode to generate code for (ASCII or UC16).
561 Mode mode_; 556 Mode mode_;
562 557
563 // Which specific string class to generate code for. 558 // Which specific string class to generate code for.
564 intptr_t specialization_cid_; 559 intptr_t specialization_cid_;
565 560
566 // Block entries used internally. 561 // Block entries used internally.
567 GraphEntryInstr* entry_block_; 562 GraphEntryInstr* entry_block_;
568 JoinEntryInstr* start_block_; 563 JoinEntryInstr* start_block_;
569 JoinEntryInstr* success_block_; 564 JoinEntryInstr* success_block_;
565 JoinEntryInstr* exit_block_;
566
567 // TODO(zerny): Implement IR support for "computed gotos" and replace all uses
Vyacheslav Egorov (Google) 2014/11/13 18:30:04 igoto is a computed goto - so this comment seems a
zerny-google 2014/11/14 13:29:29 Yes. I'll drop it from here and add a TODO to the
568 // of the backtracking block by direct jumps.
570 JoinEntryInstr* backtrack_block_; 569 JoinEntryInstr* backtrack_block_;
571 JoinEntryInstr* exit_block_; 570 IndirectGotoInstr* backtrack_goto_;
572 571
573 const ParsedFunction* parsed_function_; 572 const ParsedFunction* parsed_function_;
574 const ZoneGrowableArray<const ICData*>& ic_data_array_; 573 const ZoneGrowableArray<const ICData*>& ic_data_array_;
575 574
576 // All created blocks are contained within this set. Used for printing 575 // All created blocks are contained within this set. Used for printing
577 // the generated code. 576 // the generated code.
578 GrowableArray<BlockEntryInstr*> blocks_; 577 GrowableArray<BlockEntryInstr*> blocks_;
579 578
580 // The current instruction to link to when new code is emitted. 579 // The current instruction to link to when new code is emitted.
581 Instruction* current_instruction_; 580 Instruction* current_instruction_;
(...skipping 28 matching lines...) Expand all
610 609
611 LocalVariable* result_; 610 LocalVariable* result_;
612 611
613 // Stored positions containing group bounds. Generated as needed. 612 // Stored positions containing group bounds. Generated as needed.
614 const intptr_t position_registers_count_; 613 const intptr_t position_registers_count_;
615 GrowableArray<LocalVariable*> position_registers_; 614 GrowableArray<LocalVariable*> position_registers_;
616 615
617 // The actual array object used as the stack. 616 // The actual array object used as the stack.
618 GrowableObjectArray& stack_array_; 617 GrowableObjectArray& stack_array_;
619 618
620 GrowableArray<IndirectGotoInstr*> igotos_;
621
622 IdAllocator block_id_; 619 IdAllocator block_id_;
623 IdAllocator temp_id_; 620 IdAllocator temp_id_;
624 IdAllocator arg_id_; 621 IdAllocator arg_id_;
625 IdAllocator local_id_; 622 IdAllocator local_id_;
626 IdAllocator indirect_id_; 623 IdAllocator indirect_id_;
627 }; 624 };
628 625
629 626
630 } // namespace dart 627 } // namespace dart
631 628
632 #endif // VM_REGEXP_ASSEMBLER_H_ 629 #endif // VM_REGEXP_ASSEMBLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698