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