A little peephole optimization for the Irregexp bytecode interpreter.

Review URL: http://codereview.chromium.org/21481

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1311 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
erik.corry@gmail.com 2009-02-19 10:03:27 +00:00
parent 9c608b2c5a
commit b1fbed8cca
6 changed files with 34 additions and 9 deletions

View File

@ -1,4 +1,4 @@
// Copyright 2008 the V8 project authors. All rights reserved. // Copyright 2008-2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
@ -86,7 +86,8 @@ V(CHECK_REGISTER_GE, 42, 12) /* bc8 reg_idx24 value32 addr32 */ \
V(CHECK_REGISTER_EQ_POS, 43, 8) /* bc8 reg_idx24 addr32 */ \ V(CHECK_REGISTER_EQ_POS, 43, 8) /* bc8 reg_idx24 addr32 */ \
V(CHECK_AT_START, 44, 8) /* bc8 pad24 addr32 */ \ V(CHECK_AT_START, 44, 8) /* bc8 pad24 addr32 */ \
V(CHECK_NOT_AT_START, 45, 8) /* bc8 pad24 addr32 */ \ V(CHECK_NOT_AT_START, 45, 8) /* bc8 pad24 addr32 */ \
V(CHECK_GREEDY, 46, 8) /* bc8 pad24 addr32 */ V(CHECK_GREEDY, 46, 8) /* bc8 pad24 addr32 */ \
V(ADVANCE_CP_AND_GOTO, 47, 8) /* bc8 offset24 addr32 */
#define DECLARE_BYTECODES(name, code, length) \ #define DECLARE_BYTECODES(name, code, length) \
static const int BC_##name = code; static const int BC_##name = code;

View File

@ -238,6 +238,10 @@ static bool RawMatch(const byte* code_base,
BYTECODE(GOTO) BYTECODE(GOTO)
pc = code_base + Load32Aligned(pc + 4); pc = code_base + Load32Aligned(pc + 4);
break; break;
BYTECODE(ADVANCE_CP_AND_GOTO)
current += insn >> BYTECODE_SHIFT;
pc = code_base + Load32Aligned(pc + 4);
break;
BYTECODE(CHECK_GREEDY) BYTECODE(CHECK_GREEDY)
if (current == backtrack_sp[-1]) { if (current == backtrack_sp[-1]) {
backtrack_sp--; backtrack_sp--;

View File

@ -1,4 +1,4 @@
// Copyright 2006-2008 the V8 project authors. All rights reserved. // Copyright 2006-2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:

View File

@ -1,4 +1,4 @@
// Copyright 2008 the V8 project authors. All rights reserved. // Copyright 2008-2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:

View File

@ -1,4 +1,4 @@
// Copyright 2008 the V8 project authors. All rights reserved. // Copyright 2008-2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
@ -39,7 +39,8 @@ namespace v8 { namespace internal {
RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer) RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer)
: buffer_(buffer), : buffer_(buffer),
pc_(0), pc_(0),
own_buffer_(false) { own_buffer_(false),
advance_current_end_(kInvalidPC) {
} }
@ -55,6 +56,7 @@ RegExpMacroAssemblerIrregexp::Implementation() {
void RegExpMacroAssemblerIrregexp::Bind(Label* l) { void RegExpMacroAssemblerIrregexp::Bind(Label* l) {
advance_current_end_ = kInvalidPC;
ASSERT(!l->is_bound()); ASSERT(!l->is_bound());
if (l->is_linked()) { if (l->is_linked()) {
int pos = l->pos(); int pos = l->pos();
@ -172,9 +174,18 @@ void RegExpMacroAssemblerIrregexp::Backtrack() {
void RegExpMacroAssemblerIrregexp::GoTo(Label* l) { void RegExpMacroAssemblerIrregexp::GoTo(Label* l) {
if (advance_current_end_ == pc_) {
// Combine advance current and goto.
pc_ = advance_current_start_;
Emit(BC_ADVANCE_CP_AND_GOTO, advance_current_offset_);
EmitOrLink(l);
advance_current_end_ = kInvalidPC;
} else {
// Regular goto.
Emit(BC_GOTO, 0); Emit(BC_GOTO, 0);
EmitOrLink(l); EmitOrLink(l);
} }
}
void RegExpMacroAssemblerIrregexp::PushBacktrack(Label* l) { void RegExpMacroAssemblerIrregexp::PushBacktrack(Label* l) {
@ -196,7 +207,10 @@ void RegExpMacroAssemblerIrregexp::Fail() {
void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) { void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) {
ASSERT(by >= kMinCPOffset); ASSERT(by >= kMinCPOffset);
ASSERT(by <= kMaxCPOffset); ASSERT(by <= kMaxCPOffset);
advance_current_start_ = pc_;
advance_current_offset_ = by;
Emit(BC_ADVANCE_CP, by); Emit(BC_ADVANCE_CP, by);
advance_current_end_ = pc_;
} }

View File

@ -1,4 +1,4 @@
// Copyright 2008 the V8 project authors. All rights reserved. // Copyright 2008-2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
@ -133,6 +133,12 @@ class RegExpMacroAssemblerIrregexp: public RegExpMacroAssembler {
bool own_buffer_; bool own_buffer_;
Label backtrack_; Label backtrack_;
int advance_current_start_;
int advance_current_offset_;
int advance_current_end_;
static const int kInvalidPC = -1;
DISALLOW_IMPLICIT_CONSTRUCTORS(RegExpMacroAssemblerIrregexp); DISALLOW_IMPLICIT_CONSTRUCTORS(RegExpMacroAssemblerIrregexp);
}; };