blob: f878e8c4603b69ac0f81e60cf22166a376047784 [file] [log] [blame]
mstarzinger@chromium.org15613d02012-05-23 12:04:37 +00001// Copyright 2012 the V8 project authors. All rights reserved.
ager@chromium.orga74f0da2008-12-03 16:05:52 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#include "v8.h"
29#include "ast.h"
30#include "regexp-macro-assembler.h"
31#include "regexp-macro-assembler-tracer.h"
32
kasperl@chromium.org71affb52009-05-26 05:44:31 +000033namespace v8 {
34namespace internal {
ager@chromium.orga74f0da2008-12-03 16:05:52 +000035
36RegExpMacroAssemblerTracer::RegExpMacroAssemblerTracer(
37 RegExpMacroAssembler* assembler) :
mmassi@chromium.org7028c052012-06-13 11:51:58 +000038 RegExpMacroAssembler(assembler->zone()),
ager@chromium.orga74f0da2008-12-03 16:05:52 +000039 assembler_(assembler) {
40 unsigned int type = assembler->Implementation();
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000041 ASSERT(type < 5);
42 const char* impl_names[] = {"IA32", "ARM", "MIPS", "X64", "Bytecode"};
ager@chromium.orga74f0da2008-12-03 16:05:52 +000043 PrintF("RegExpMacroAssembler%s();\n", impl_names[type]);
44}
45
46
47RegExpMacroAssemblerTracer::~RegExpMacroAssemblerTracer() {
48}
49
50
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +000051// This is used for printing out debugging information. It makes an integer
52// that is closely related to the address of an object.
53static int LabelToInt(Label* label) {
54 return static_cast<int>(reinterpret_cast<intptr_t>(label));
55}
56
57
ager@chromium.orga74f0da2008-12-03 16:05:52 +000058void RegExpMacroAssemblerTracer::Bind(Label* label) {
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +000059 PrintF("label[%08x]: (Bind)\n", LabelToInt(label));
ager@chromium.orga74f0da2008-12-03 16:05:52 +000060 assembler_->Bind(label);
61}
62
63
ager@chromium.orga74f0da2008-12-03 16:05:52 +000064void RegExpMacroAssemblerTracer::AdvanceCurrentPosition(int by) {
65 PrintF(" AdvanceCurrentPosition(by=%d);\n", by);
66 assembler_->AdvanceCurrentPosition(by);
67}
68
69
ager@chromium.org8bb60582008-12-11 12:02:20 +000070void RegExpMacroAssemblerTracer::CheckGreedyLoop(Label* label) {
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +000071 PrintF(" CheckGreedyLoop(label[%08x]);\n\n", LabelToInt(label));
ager@chromium.org8bb60582008-12-11 12:02:20 +000072 assembler_->CheckGreedyLoop(label);
73}
74
75
ager@chromium.orga74f0da2008-12-03 16:05:52 +000076void RegExpMacroAssemblerTracer::PopCurrentPosition() {
77 PrintF(" PopCurrentPosition();\n");
78 assembler_->PopCurrentPosition();
79}
80
81
82void RegExpMacroAssemblerTracer::PushCurrentPosition() {
83 PrintF(" PushCurrentPosition();\n");
84 assembler_->PushCurrentPosition();
85}
86
87
88void RegExpMacroAssemblerTracer::Backtrack() {
89 PrintF(" Backtrack();\n");
90 assembler_->Backtrack();
91}
92
93
94void RegExpMacroAssemblerTracer::GoTo(Label* label) {
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +000095 PrintF(" GoTo(label[%08x]);\n\n", LabelToInt(label));
ager@chromium.orga74f0da2008-12-03 16:05:52 +000096 assembler_->GoTo(label);
97}
98
99
100void RegExpMacroAssemblerTracer::PushBacktrack(Label* label) {
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000101 PrintF(" PushBacktrack(label[%08x]);\n", LabelToInt(label));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000102 assembler_->PushBacktrack(label);
103}
104
105
mstarzinger@chromium.org15613d02012-05-23 12:04:37 +0000106bool RegExpMacroAssemblerTracer::Succeed() {
107 bool restart = assembler_->Succeed();
108 PrintF(" Succeed();%s\n", restart ? " [restart for global match]" : "");
109 return restart;
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000110}
111
112
113void RegExpMacroAssemblerTracer::Fail() {
mstarzinger@chromium.org15613d02012-05-23 12:04:37 +0000114 PrintF(" Fail();");
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000115 assembler_->Fail();
116}
117
118
119void RegExpMacroAssemblerTracer::PopRegister(int register_index) {
120 PrintF(" PopRegister(register=%d);\n", register_index);
121 assembler_->PopRegister(register_index);
122}
123
124
ager@chromium.org32912102009-01-16 10:38:43 +0000125void RegExpMacroAssemblerTracer::PushRegister(
126 int register_index,
127 StackCheckFlag check_stack_limit) {
128 PrintF(" PushRegister(register=%d, %s);\n",
129 register_index,
130 check_stack_limit ? "check stack limit" : "");
131 assembler_->PushRegister(register_index, check_stack_limit);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000132}
133
134
135void RegExpMacroAssemblerTracer::AdvanceRegister(int reg, int by) {
136 PrintF(" AdvanceRegister(register=%d, by=%d);\n", reg, by);
137 assembler_->AdvanceRegister(reg, by);
138}
139
140
whesse@chromium.org4a5224e2010-10-20 12:37:07 +0000141void RegExpMacroAssemblerTracer::SetCurrentPositionFromEnd(int by) {
142 PrintF(" SetCurrentPositionFromEnd(by=%d);\n", by);
143 assembler_->SetCurrentPositionFromEnd(by);
144}
145
146
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000147void RegExpMacroAssemblerTracer::SetRegister(int register_index, int to) {
148 PrintF(" SetRegister(register=%d, to=%d);\n", register_index, to);
149 assembler_->SetRegister(register_index, to);
150}
151
152
ager@chromium.org8bb60582008-12-11 12:02:20 +0000153void RegExpMacroAssemblerTracer::WriteCurrentPositionToRegister(int reg,
154 int cp_offset) {
155 PrintF(" WriteCurrentPositionToRegister(register=%d,cp_offset=%d);\n",
156 reg,
157 cp_offset);
158 assembler_->WriteCurrentPositionToRegister(reg, cp_offset);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000159}
160
161
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000162void RegExpMacroAssemblerTracer::ClearRegisters(int reg_from, int reg_to) {
163 PrintF(" ClearRegister(from=%d, to=%d);\n", reg_from, reg_to);
164 assembler_->ClearRegisters(reg_from, reg_to);
ager@chromium.org32912102009-01-16 10:38:43 +0000165}
166
167
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000168void RegExpMacroAssemblerTracer::ReadCurrentPositionFromRegister(int reg) {
169 PrintF(" ReadCurrentPositionFromRegister(register=%d);\n", reg);
170 assembler_->ReadCurrentPositionFromRegister(reg);
171}
172
173
174void RegExpMacroAssemblerTracer::WriteStackPointerToRegister(int reg) {
175 PrintF(" WriteStackPointerToRegister(register=%d);\n", reg);
176 assembler_->WriteStackPointerToRegister(reg);
177}
178
179
180void RegExpMacroAssemblerTracer::ReadStackPointerFromRegister(int reg) {
181 PrintF(" ReadStackPointerFromRegister(register=%d);\n", reg);
182 assembler_->ReadStackPointerFromRegister(reg);
183}
184
185
186void RegExpMacroAssemblerTracer::LoadCurrentCharacter(int cp_offset,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000187 Label* on_end_of_input,
188 bool check_bounds,
189 int characters) {
190 const char* check_msg = check_bounds ? "" : " (unchecked)";
191 PrintF(" LoadCurrentCharacter(cp_offset=%d, label[%08x]%s (%d chars));\n",
ager@chromium.org8bb60582008-12-11 12:02:20 +0000192 cp_offset,
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000193 LabelToInt(on_end_of_input),
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000194 check_msg,
195 characters);
196 assembler_->LoadCurrentCharacter(cp_offset,
197 on_end_of_input,
198 check_bounds,
199 characters);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000200}
201
202
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000203class PrintablePrinter {
204 public:
205 explicit PrintablePrinter(uc16 character) : character_(character) { }
206
207 const char* operator*() {
208 if (character_ >= ' ' && character_ <= '~') {
209 buffer_[0] = '(';
210 buffer_[1] = static_cast<char>(character_);
211 buffer_[2] = ')';
212 buffer_[3] = '\0';
213 } else {
214 buffer_[0] = '\0';
215 }
216 return &buffer_[0];
217 };
218
219 private:
220 uc16 character_;
221 char buffer_[4];
222};
223
224
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000225void RegExpMacroAssemblerTracer::CheckCharacterLT(uc16 limit, Label* on_less) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000226 PrintablePrinter printable(limit);
227 PrintF(" CheckCharacterLT(c=0x%04x%s, label[%08x]);\n",
228 limit,
229 *printable,
230 LabelToInt(on_less));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000231 assembler_->CheckCharacterLT(limit, on_less);
232}
233
234
235void RegExpMacroAssemblerTracer::CheckCharacterGT(uc16 limit,
236 Label* on_greater) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000237 PrintablePrinter printable(limit);
238 PrintF(" CheckCharacterGT(c=0x%04x%s, label[%08x]);\n",
239 limit,
240 *printable,
241 LabelToInt(on_greater));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000242 assembler_->CheckCharacterGT(limit, on_greater);
243}
244
245
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000246void RegExpMacroAssemblerTracer::CheckCharacter(unsigned c, Label* on_equal) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000247 PrintablePrinter printable(c);
248 PrintF(" CheckCharacter(c=0x%04x%s, label[%08x]);\n",
249 c,
250 *printable,
251 LabelToInt(on_equal));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000252 assembler_->CheckCharacter(c, on_equal);
253}
254
255
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000256void RegExpMacroAssemblerTracer::CheckAtStart(Label* on_at_start) {
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000257 PrintF(" CheckAtStart(label[%08x]);\n", LabelToInt(on_at_start));
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000258 assembler_->CheckAtStart(on_at_start);
259}
260
261
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000262void RegExpMacroAssemblerTracer::CheckNotAtStart(Label* on_not_at_start) {
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000263 PrintF(" CheckNotAtStart(label[%08x]);\n", LabelToInt(on_not_at_start));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000264 assembler_->CheckNotAtStart(on_not_at_start);
265}
266
267
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000268void RegExpMacroAssemblerTracer::CheckNotCharacter(unsigned c,
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000269 Label* on_not_equal) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000270 PrintablePrinter printable(c);
271 PrintF(" CheckNotCharacter(c=0x%04x%s, label[%08x]);\n",
272 c,
273 *printable,
274 LabelToInt(on_not_equal));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000275 assembler_->CheckNotCharacter(c, on_not_equal);
276}
277
278
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000279void RegExpMacroAssemblerTracer::CheckCharacterAfterAnd(
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000280 unsigned c,
281 unsigned mask,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000282 Label* on_equal) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000283 PrintablePrinter printable(c);
284 PrintF(" CheckCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000285 c,
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000286 *printable,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000287 mask,
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000288 LabelToInt(on_equal));
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000289 assembler_->CheckCharacterAfterAnd(c, mask, on_equal);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000290}
291
292
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000293void RegExpMacroAssemblerTracer::CheckNotCharacterAfterAnd(
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000294 unsigned c,
295 unsigned mask,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000296 Label* on_not_equal) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000297 PrintablePrinter printable(c);
298 PrintF(" CheckNotCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000299 c,
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000300 *printable,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000301 mask,
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000302 LabelToInt(on_not_equal));
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000303 assembler_->CheckNotCharacterAfterAnd(c, mask, on_not_equal);
304}
305
306
307void RegExpMacroAssemblerTracer::CheckNotCharacterAfterMinusAnd(
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000308 uc16 c,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000309 uc16 minus,
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000310 uc16 mask,
311 Label* on_not_equal) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000312 PrintF(" CheckNotCharacterAfterMinusAnd(c=0x%04x, minus=%04x, mask=0x%04x, "
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000313 "label[%08x]);\n",
314 c,
315 minus,
316 mask,
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000317 LabelToInt(on_not_equal));
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000318 assembler_->CheckNotCharacterAfterMinusAnd(c, minus, mask, on_not_equal);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000319}
320
321
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000322void RegExpMacroAssemblerTracer::CheckCharacterInRange(
323 uc16 from,
324 uc16 to,
325 Label* on_not_in_range) {
326 PrintablePrinter printable_from(from);
327 PrintablePrinter printable_to(to);
328 PrintF(" CheckCharacterInRange(from=0x%04x%s, to=0x%04x%s, label[%08x]);\n",
329 from,
330 *printable_from,
331 to,
332 *printable_to,
333 LabelToInt(on_not_in_range));
334 assembler_->CheckCharacterInRange(from, to, on_not_in_range);
335}
336
337
338void RegExpMacroAssemblerTracer::CheckCharacterNotInRange(
339 uc16 from,
340 uc16 to,
341 Label* on_in_range) {
342 PrintablePrinter printable_from(from);
343 PrintablePrinter printable_to(to);
344 PrintF(
345 " CheckCharacterNotInRange(from=0x%04x%s," " to=%04x%s, label[%08x]);\n",
346 from,
347 *printable_from,
348 to,
349 *printable_to,
350 LabelToInt(on_in_range));
351 assembler_->CheckCharacterNotInRange(from, to, on_in_range);
352}
353
354
355void RegExpMacroAssemblerTracer::CheckBitInTable(
356 Handle<ByteArray> table, Label* on_bit_set) {
357 PrintF(" CheckBitInTable(label[%08x] ", LabelToInt(on_bit_set));
358 for (int i = 0; i < kTableSize; i++) {
359 PrintF("%c", table->get(i) != 0 ? 'X' : '.');
360 if (i % 32 == 31 && i != kTableMask) {
361 PrintF("\n ");
362 }
363 }
364 PrintF(");\n");
365 assembler_->CheckBitInTable(table, on_bit_set);
366}
367
368
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000369void RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg,
370 Label* on_no_match) {
371 PrintF(" CheckNotBackReference(register=%d, label[%08x]);\n", start_reg,
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000372 LabelToInt(on_no_match));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000373 assembler_->CheckNotBackReference(start_reg, on_no_match);
374}
375
376
377void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase(
378 int start_reg,
379 Label* on_no_match) {
380 PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, label[%08x]);\n",
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000381 start_reg, LabelToInt(on_no_match));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000382 assembler_->CheckNotBackReferenceIgnoreCase(start_reg, on_no_match);
383}
384
385
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000386void RegExpMacroAssemblerTracer::CheckCharacters(Vector<const uc16> str,
387 int cp_offset,
ager@chromium.org8bb60582008-12-11 12:02:20 +0000388 Label* on_failure,
389 bool check_end_of_string) {
390 PrintF(" %s(str=\"",
391 check_end_of_string ? "CheckCharacters" : "CheckCharactersUnchecked");
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000392 for (int i = 0; i < str.length(); i++) {
jkummerow@chromium.org1456e702012-03-30 08:38:13 +0000393 PrintF("0x%04x", str[i]);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000394 }
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000395 PrintF("\", cp_offset=%d, label[%08x])\n",
396 cp_offset, LabelToInt(on_failure));
ager@chromium.org8bb60582008-12-11 12:02:20 +0000397 assembler_->CheckCharacters(str, cp_offset, on_failure, check_end_of_string);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000398}
399
400
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000401bool RegExpMacroAssemblerTracer::CheckSpecialCharacterClass(
402 uc16 type,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000403 Label* on_no_match) {
404 bool supported = assembler_->CheckSpecialCharacterClass(type,
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000405 on_no_match);
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000406 PrintF(" CheckSpecialCharacterClass(type='%c', label[%08x]): %s;\n",
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000407 type,
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000408 LabelToInt(on_no_match),
christian.plesner.hansen@gmail.com37abdec2009-01-06 14:43:28 +0000409 supported ? "true" : "false");
410 return supported;
411}
412
413
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000414void RegExpMacroAssemblerTracer::IfRegisterLT(int register_index,
415 int comparand, Label* if_lt) {
416 PrintF(" IfRegisterLT(register=%d, number=%d, label[%08x]);\n",
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000417 register_index, comparand, LabelToInt(if_lt));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000418 assembler_->IfRegisterLT(register_index, comparand, if_lt);
419}
420
421
ager@chromium.org32912102009-01-16 10:38:43 +0000422void RegExpMacroAssemblerTracer::IfRegisterEqPos(int register_index,
423 Label* if_eq) {
424 PrintF(" IfRegisterEqPos(register=%d, label[%08x]);\n",
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000425 register_index, LabelToInt(if_eq));
ager@chromium.org32912102009-01-16 10:38:43 +0000426 assembler_->IfRegisterEqPos(register_index, if_eq);
427}
428
429
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000430void RegExpMacroAssemblerTracer::IfRegisterGE(int register_index,
431 int comparand, Label* if_ge) {
432 PrintF(" IfRegisterGE(register=%d, number=%d, label[%08x]);\n",
kmillikin@chromium.orgf05f2912010-09-30 10:07:24 +0000433 register_index, comparand, LabelToInt(if_ge));
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000434 assembler_->IfRegisterGE(register_index, comparand, if_ge);
435}
436
437
438RegExpMacroAssembler::IrregexpImplementation
439 RegExpMacroAssemblerTracer::Implementation() {
440 return assembler_->Implementation();
441}
442
443
karlklose@chromium.org83a47282011-05-11 11:54:09 +0000444Handle<HeapObject> RegExpMacroAssemblerTracer::GetCode(Handle<String> source) {
ager@chromium.org8bb60582008-12-11 12:02:20 +0000445 PrintF(" GetCode(%s);\n", *(source->ToCString()));
446 return assembler_->GetCode(source);
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000447}
448
449}} // namespace v8::internal