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:
parent
9c608b2c5a
commit
b1fbed8cca
@ -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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// 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_AT_START, 44, 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) \
|
||||
static const int BC_##name = code;
|
||||
|
@ -238,6 +238,10 @@ static bool RawMatch(const byte* code_base,
|
||||
BYTECODE(GOTO)
|
||||
pc = code_base + Load32Aligned(pc + 4);
|
||||
break;
|
||||
BYTECODE(ADVANCE_CP_AND_GOTO)
|
||||
current += insn >> BYTECODE_SHIFT;
|
||||
pc = code_base + Load32Aligned(pc + 4);
|
||||
break;
|
||||
BYTECODE(CHECK_GREEDY)
|
||||
if (current == backtrack_sp[-1]) {
|
||||
backtrack_sp--;
|
||||
|
@ -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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
|
@ -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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
|
@ -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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -39,7 +39,8 @@ namespace v8 { namespace internal {
|
||||
RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer)
|
||||
: buffer_(buffer),
|
||||
pc_(0),
|
||||
own_buffer_(false) {
|
||||
own_buffer_(false),
|
||||
advance_current_end_(kInvalidPC) {
|
||||
}
|
||||
|
||||
|
||||
@ -55,6 +56,7 @@ RegExpMacroAssemblerIrregexp::Implementation() {
|
||||
|
||||
|
||||
void RegExpMacroAssemblerIrregexp::Bind(Label* l) {
|
||||
advance_current_end_ = kInvalidPC;
|
||||
ASSERT(!l->is_bound());
|
||||
if (l->is_linked()) {
|
||||
int pos = l->pos();
|
||||
@ -172,8 +174,17 @@ void RegExpMacroAssemblerIrregexp::Backtrack() {
|
||||
|
||||
|
||||
void RegExpMacroAssemblerIrregexp::GoTo(Label* l) {
|
||||
Emit(BC_GOTO, 0);
|
||||
EmitOrLink(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);
|
||||
EmitOrLink(l);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -196,7 +207,10 @@ void RegExpMacroAssemblerIrregexp::Fail() {
|
||||
void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) {
|
||||
ASSERT(by >= kMinCPOffset);
|
||||
ASSERT(by <= kMaxCPOffset);
|
||||
advance_current_start_ = pc_;
|
||||
advance_current_offset_ = by;
|
||||
Emit(BC_ADVANCE_CP, by);
|
||||
advance_current_end_ = pc_;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -133,6 +133,12 @@ class RegExpMacroAssemblerIrregexp: public RegExpMacroAssembler {
|
||||
bool own_buffer_;
|
||||
Label backtrack_;
|
||||
|
||||
int advance_current_start_;
|
||||
int advance_current_offset_;
|
||||
int advance_current_end_;
|
||||
|
||||
static const int kInvalidPC = -1;
|
||||
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(RegExpMacroAssemblerIrregexp);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user