1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "ast.h"
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "regexp-macro-assembler.h"
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "regexp-macro-assembler-tracer.h"
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockRegExpMacroAssemblerTracer::RegExpMacroAssemblerTracer(
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    RegExpMacroAssembler* assembler) :
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_(assembler) {
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  unsigned int type = assembler->Implementation();
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(type < 5);
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const char* impl_names[] = {"IA32", "ARM", "MIPS", "X64", "Bytecode"};
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("RegExpMacroAssembler%s();\n", impl_names[type]);
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockRegExpMacroAssemblerTracer::~RegExpMacroAssemblerTracer() {
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch// This is used for printing out debugging information.  It makes an integer
51f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch// that is closely related to the address of an object.
52f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochstatic int LabelToInt(Label* label) {
53f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  return static_cast<int>(reinterpret_cast<intptr_t>(label));
54f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch}
55f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
56f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::Bind(Label* label) {
58f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF("label[%08x]: (Bind)\n", LabelToInt(label));
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->Bind(label);
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::AdvanceCurrentPosition(int by) {
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" AdvanceCurrentPosition(by=%d);\n", by);
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->AdvanceCurrentPosition(by);
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckGreedyLoop(Label* label) {
70f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckGreedyLoop(label[%08x]);\n\n", LabelToInt(label));
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckGreedyLoop(label);
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::PopCurrentPosition() {
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" PopCurrentPosition();\n");
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->PopCurrentPosition();
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::PushCurrentPosition() {
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" PushCurrentPosition();\n");
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->PushCurrentPosition();
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::Backtrack() {
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" Backtrack();\n");
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->Backtrack();
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::GoTo(Label* label) {
94f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" GoTo(label[%08x]);\n\n", LabelToInt(label));
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->GoTo(label);
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::PushBacktrack(Label* label) {
100f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" PushBacktrack(label[%08x]);\n", LabelToInt(label));
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->PushBacktrack(label);
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::Succeed() {
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" Succeed();\n");
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->Succeed();
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::Fail() {
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" Fail();\n");
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->Fail();
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::PopRegister(int register_index) {
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" PopRegister(register=%d);\n", register_index);
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->PopRegister(register_index);
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::PushRegister(
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int register_index,
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    StackCheckFlag check_stack_limit) {
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" PushRegister(register=%d, %s);\n",
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         register_index,
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         check_stack_limit ? "check stack limit" : "");
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->PushRegister(register_index, check_stack_limit);
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::AdvanceRegister(int reg, int by) {
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" AdvanceRegister(register=%d, by=%d);\n", reg, by);
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->AdvanceRegister(reg, by);
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
139f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochvoid RegExpMacroAssemblerTracer::SetCurrentPositionFromEnd(int by) {
140f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" SetCurrentPositionFromEnd(by=%d);\n", by);
141f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  assembler_->SetCurrentPositionFromEnd(by);
142f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch}
143f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
144f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::SetRegister(int register_index, int to) {
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" SetRegister(register=%d, to=%d);\n", register_index, to);
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->SetRegister(register_index, to);
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::WriteCurrentPositionToRegister(int reg,
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                                int cp_offset) {
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" WriteCurrentPositionToRegister(register=%d,cp_offset=%d);\n",
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         reg,
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         cp_offset);
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->WriteCurrentPositionToRegister(reg, cp_offset);
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::ClearRegisters(int reg_from, int reg_to) {
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" ClearRegister(from=%d, to=%d);\n", reg_from, reg_to);
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->ClearRegisters(reg_from, reg_to);
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::ReadCurrentPositionFromRegister(int reg) {
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" ReadCurrentPositionFromRegister(register=%d);\n", reg);
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->ReadCurrentPositionFromRegister(reg);
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::WriteStackPointerToRegister(int reg) {
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" WriteStackPointerToRegister(register=%d);\n", reg);
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->WriteStackPointerToRegister(reg);
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::ReadStackPointerFromRegister(int reg) {
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" ReadStackPointerFromRegister(register=%d);\n", reg);
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->ReadStackPointerFromRegister(reg);
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::LoadCurrentCharacter(int cp_offset,
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                      Label* on_end_of_input,
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                      bool check_bounds,
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                      int characters) {
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const char* check_msg = check_bounds ? "" : " (unchecked)";
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" LoadCurrentCharacter(cp_offset=%d, label[%08x]%s (%d chars));\n",
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         cp_offset,
191f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_end_of_input),
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         check_msg,
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         characters);
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->LoadCurrentCharacter(cp_offset,
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                   on_end_of_input,
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                   check_bounds,
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                   characters);
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckCharacterLT(uc16 limit, Label* on_less) {
202f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckCharacterLT(c='u%04x', label[%08x]);\n",
203f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         limit, LabelToInt(on_less));
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckCharacterLT(limit, on_less);
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckCharacterGT(uc16 limit,
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                  Label* on_greater) {
210f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckCharacterGT(c='u%04x', label[%08x]);\n",
211f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         limit, LabelToInt(on_greater));
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckCharacterGT(limit, on_greater);
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid RegExpMacroAssemblerTracer::CheckCharacter(unsigned c, Label* on_equal) {
217f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckCharacter(c='u%04x', label[%08x]);\n",
218f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         c, LabelToInt(on_equal));
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckCharacter(c, on_equal);
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckAtStart(Label* on_at_start) {
224f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckAtStart(label[%08x]);\n", LabelToInt(on_at_start));
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckAtStart(on_at_start);
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckNotAtStart(Label* on_not_at_start) {
230f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckNotAtStart(label[%08x]);\n", LabelToInt(on_not_at_start));
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotAtStart(on_not_at_start);
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid RegExpMacroAssemblerTracer::CheckNotCharacter(unsigned c,
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                   Label* on_not_equal) {
237f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF(" CheckNotCharacter(c='u%04x', label[%08x]);\n",
238f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         c, LabelToInt(on_not_equal));
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotCharacter(c, on_not_equal);
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckCharacterAfterAnd(
244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    unsigned c,
245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    unsigned mask,
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label* on_equal) {
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" CheckCharacterAfterAnd(c='u%04x', mask=0x%04x, label[%08x]);\n",
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         c,
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         mask,
250f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_equal));
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckCharacterAfterAnd(c, mask, on_equal);
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckNotCharacterAfterAnd(
256b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    unsigned c,
257b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    unsigned mask,
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label* on_not_equal) {
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" CheckNotCharacterAfterAnd(c='u%04x', mask=0x%04x, label[%08x]);\n",
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         c,
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         mask,
262f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_not_equal));
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotCharacterAfterAnd(c, mask, on_not_equal);
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckNotCharacterAfterMinusAnd(
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uc16 c,
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uc16 minus,
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uc16 mask,
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label* on_not_equal) {
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" CheckNotCharacterAfterMinusAnd(c='u%04x', minus=%04x, mask=0x%04x, "
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             "label[%08x]);\n",
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         c,
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         minus,
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         mask,
277f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_not_equal));
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotCharacterAfterMinusAnd(c, minus, mask, on_not_equal);
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg,
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                       Label* on_no_match) {
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" CheckNotBackReference(register=%d, label[%08x]);\n", start_reg,
285f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_no_match));
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotBackReference(start_reg, on_no_match);
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase(
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int start_reg,
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label* on_no_match) {
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, label[%08x]);\n",
294f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         start_reg, LabelToInt(on_no_match));
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotBackReferenceIgnoreCase(start_reg, on_no_match);
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckNotRegistersEqual(int reg1,
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                        int reg2,
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                        Label* on_not_equal) {
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" CheckNotRegistersEqual(reg1=%d, reg2=%d, label[%08x]);\n",
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         reg1,
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         reg2,
305f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_not_equal));
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckNotRegistersEqual(reg1, reg2, on_not_equal);
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::CheckCharacters(Vector<const uc16> str,
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                 int cp_offset,
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                 Label* on_failure,
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                 bool check_end_of_string) {
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" %s(str=\"",
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         check_end_of_string ? "CheckCharacters" : "CheckCharactersUnchecked");
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < str.length(); i++) {
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintF("u%04x", str[i]);
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
319f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  PrintF("\", cp_offset=%d, label[%08x])\n",
320f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         cp_offset, LabelToInt(on_failure));
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->CheckCharacters(str, cp_offset, on_failure, check_end_of_string);
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool RegExpMacroAssemblerTracer::CheckSpecialCharacterClass(
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uc16 type,
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Label* on_no_match) {
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool supported = assembler_->CheckSpecialCharacterClass(type,
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                          on_no_match);
330e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  PrintF(" CheckSpecialCharacterClass(type='%c', label[%08x]): %s;\n",
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         type,
332f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         LabelToInt(on_no_match),
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         supported ? "true" : "false");
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return supported;
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::IfRegisterLT(int register_index,
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              int comparand, Label* if_lt) {
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" IfRegisterLT(register=%d, number=%d, label[%08x]);\n",
341f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         register_index, comparand, LabelToInt(if_lt));
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->IfRegisterLT(register_index, comparand, if_lt);
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::IfRegisterEqPos(int register_index,
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                 Label* if_eq) {
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" IfRegisterEqPos(register=%d, label[%08x]);\n",
349f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         register_index, LabelToInt(if_eq));
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->IfRegisterEqPos(register_index, if_eq);
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid RegExpMacroAssemblerTracer::IfRegisterGE(int register_index,
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              int comparand, Label* if_ge) {
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" IfRegisterGE(register=%d, number=%d, label[%08x]);\n",
357f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch         register_index, comparand, LabelToInt(if_ge));
358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  assembler_->IfRegisterGE(register_index, comparand, if_ge);
359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockRegExpMacroAssembler::IrregexpImplementation
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    RegExpMacroAssemblerTracer::Implementation() {
364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return assembler_->Implementation();
365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
368053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve BlockHandle<HeapObject> RegExpMacroAssemblerTracer::GetCode(Handle<String> source) {
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF(" GetCode(%s);\n", *(source->ToCString()));
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return assembler_->GetCode(source);
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}}  // namespace v8::internal
374