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
|
// 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;
|
||||||
|
@ -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--;
|
||||||
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -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_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user