115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
28a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "v8.h"
29a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ast.h"
30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "assembler.h"
31911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#include "regexp-stack.h"
32a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "regexp-macro-assembler.h"
33c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "simulator.h"
34a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgRegExpMacroAssembler::RegExpMacroAssembler(Zone* zone)
3915613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org  : slow_safe_compiler_(false),
407028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    global_mode_(NOT_GLOBAL),
417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    zone_(zone) {
42a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
43a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
45a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgRegExpMacroAssembler::~RegExpMacroAssembler() {
46a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
47a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
48a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
4918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool RegExpMacroAssembler::CanReadUnaligned() {
5018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_HOST_CAN_READ_UNALIGNED
5118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return true;
5218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#else
5318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return false;
5418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif
5518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
5618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
5718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
58c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#ifndef V8_INTERPRETED_REGEXP  // Avoid unused code, e.g., on ARM.
59911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
607028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgNativeRegExpMacroAssembler::NativeRegExpMacroAssembler(Zone* zone)
617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    : RegExpMacroAssembler(zone) {
62911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}
63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
65911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgNativeRegExpMacroAssembler::~NativeRegExpMacroAssembler() {
66911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}
67a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
6818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
6918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool NativeRegExpMacroAssembler::CanReadUnaligned() {
7089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  return FLAG_enable_unaligned_accesses && !slow_safe();
7118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
7218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
73911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgconst byte* NativeRegExpMacroAssembler::StringCharacterPosition(
74911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    String* subject,
75911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    int start_index) {
76911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // Not just flat, but ultra flat.
77911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(subject->IsExternalString() || subject->IsSeqString());
78911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(start_index >= 0);
79911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(start_index <= subject->length());
808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (subject->IsOneByteRepresentation()) {
81911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    const byte* address;
82911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    if (StringShape(subject).IsExternal()) {
8359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      const uint8_t* data = ExternalAsciiString::cast(subject)->GetChars();
84911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org      address = reinterpret_cast<const byte*>(data);
85911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    } else {
86fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      ASSERT(subject->IsSeqOneByteString());
8759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      const uint8_t* data = SeqOneByteString::cast(subject)->GetChars();
88911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org      address = reinterpret_cast<const byte*>(data);
89a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    }
90911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    return address + start_index;
91911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  }
92911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  const uc16* data;
93911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  if (StringShape(subject).IsExternal()) {
940ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    data = ExternalTwoByteString::cast(subject)->GetChars();
95911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  } else {
96911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    ASSERT(subject->IsSeqTwoByteString());
97911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    data = SeqTwoByteString::cast(subject)->GetChars();
98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
99911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  return reinterpret_cast<const byte*>(data + start_index);
100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
101a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
103911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgNativeRegExpMacroAssembler::Result NativeRegExpMacroAssembler::Match(
104911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    Handle<Code> regexp_code,
105911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    Handle<String> subject,
106911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    int* offsets_vector,
107911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    int offsets_vector_length,
108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    int previous_index,
109ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Isolate* isolate) {
110911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
111911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(subject->IsFlat());
112911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(previous_index >= 0);
113911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(previous_index <= subject->length());
114911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
115911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // No allocations before calling the regexp, but we can't use
116837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  // DisallowHeapAllocation, since regexps might be preempted, and another
117837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  // thread might do allocation anyway.
118911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
119911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  String* subject_ptr = *subject;
120911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // Character offsets into string.
121911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  int start_offset = previous_index;
1224668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  int char_length = subject_ptr->length() - start_offset;
1234668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  int slice_offset = 0;
124911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
1254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // The string has been flattened, so if it is a cons string it contains the
126b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // full string in the first part.
127911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  if (StringShape(subject_ptr).IsCons()) {
128b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    ASSERT_EQ(0, ConsString::cast(subject_ptr)->second()->length());
129911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    subject_ptr = ConsString::cast(subject_ptr)->first();
1304668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  } else if (StringShape(subject_ptr).IsSliced()) {
1314668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    SlicedString* slice = SlicedString::cast(subject_ptr);
1324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    subject_ptr = slice->parent();
1334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    slice_offset = slice->offset();
134911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  }
1352efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  // Ensure that an underlying string has the same ASCII-ness.
1368e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  bool is_ascii = subject_ptr->IsOneByteRepresentation();
137911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(subject_ptr->IsExternalString() || subject_ptr->IsSeqString());
138911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // String is now either Sequential or External
139911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  int char_size_shift = is_ascii ? 0 : 1;
140911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
141911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  const byte* input_start =
1424668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      StringCharacterPosition(subject_ptr, start_offset + slice_offset);
143911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  int byte_length = char_length << char_size_shift;
144911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  const byte* input_end = input_start + byte_length;
145911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  Result res = Execute(*regexp_code,
1464668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org                       *subject,
147911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org                       start_offset,
148911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org                       input_start,
149911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org                       input_end,
150ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       offsets_vector,
15115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org                       offsets_vector_length,
152ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       isolate);
153911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  return res;
154a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
155911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
156911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
157911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgNativeRegExpMacroAssembler::Result NativeRegExpMacroAssembler::Execute(
158911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    Code* code,
1594668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    String* input,  // This needs to be the unpacked (sliced, cons) string.
160911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    int start_offset,
161911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    const byte* input_start,
162911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    const byte* input_end,
163ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    int* output,
16415613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org    int output_size,
165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Isolate* isolate) {
166911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // Ensure that the minimum stack has been allocated.
167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  RegExpStackScope stack_scope(isolate);
168ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address stack_base = stack_scope.stack()->stack_base();
169911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
1700c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  int direct_call = 0;
17149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  int result = CALL_GENERATED_REGEXP_CODE(code->entry(),
17218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org                                          input,
17318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org                                          start_offset,
17418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org                                          input_start,
17518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org                                          input_end,
17618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org                                          output,
17715613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org                                          output_size,
1780c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org                                          stack_base,
179ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                          direct_call,
180ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                          isolate);
181911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(result >= RETRY);
182911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
183ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (result == EXCEPTION && !isolate->has_pending_exception()) {
184911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    // We detected a stack overflow (on the backtrack stack) in RegExp code,
185911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    // but haven't created the exception yet.
186ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->StackOverflow();
187911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  }
188911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  return static_cast<Result>(result);
189911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}
190911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
191911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
192ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst byte NativeRegExpMacroAssembler::word_character_map[] = {
193b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
194b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
195b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
196b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
197b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
198b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
199b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
200b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // '0' - '7'
201b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,  // '8' - '9'
202b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
203b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // 'A' - 'G'
204b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // 'H' - 'O'
205b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // 'P' - 'W'
206b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, 0xffu,  // 'X' - 'Z', '_'
207b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
208b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0x00u, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // 'a' - 'g'
209b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // 'h' - 'o'
210b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu,  // 'p' - 'w'
211b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,  // 'x' - 'z'
2126bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    // Latin-1 range
2136bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2146bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2156bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2166bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2176bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org
2186bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2196bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2206bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2216bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2226bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org
2236bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2246bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2256bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2266bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2276bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org
2286bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2296bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2306bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
2316bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u,
232b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org};
233b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
234b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
235911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgint NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16(
236911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    Address byte_offset1,
237911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    Address byte_offset2,
238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    size_t byte_length,
239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Isolate* isolate) {
240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  unibrow::Mapping<unibrow::Ecma262Canonicalize>* canonicalize =
241ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      isolate->regexp_macro_assembler_canonicalize();
242911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // This function is not allowed to cause a garbage collection.
243911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // A GC might move the calling generated code and invalidate the
244911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // return address on the stack.
245911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(byte_length % 2 == 0);
246911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  uc16* substring1 = reinterpret_cast<uc16*>(byte_offset1);
247911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  uc16* substring2 = reinterpret_cast<uc16*>(byte_offset2);
248911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  size_t length = byte_length >> 1;
249911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
250911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  for (size_t i = 0; i < length; i++) {
251911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    unibrow::uchar c1 = substring1[i];
252911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    unibrow::uchar c2 = substring2[i];
253911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    if (c1 != c2) {
254911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org      unibrow::uchar s1[1] = { c1 };
255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      canonicalize->get(c1, '\0', s1);
256911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org      if (s1[0] != c2) {
257911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org        unibrow::uchar s2[1] = { c2 };
258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        canonicalize->get(c2, '\0', s2);
259911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org        if (s1[0] != s2[0]) {
260911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org          return 0;
261911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org        }
262911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org      }
263911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    }
264911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  }
265911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  return 1;
266911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}
267911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
26818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
26918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgAddress NativeRegExpMacroAssembler::GrowStack(Address stack_pointer,
270ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                              Address* stack_base,
271ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                              Isolate* isolate) {
272ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  RegExpStack* regexp_stack = isolate->regexp_stack();
273ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  size_t size = regexp_stack->stack_capacity();
274ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address old_stack_base = regexp_stack->stack_base();
27518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  ASSERT(old_stack_base == *stack_base);
27618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  ASSERT(stack_pointer <= old_stack_base);
27718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  ASSERT(static_cast<size_t>(old_stack_base - stack_pointer) <= size);
278ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address new_stack_base = regexp_stack->EnsureCapacity(size * 2);
27918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  if (new_stack_base == NULL) {
28018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    return NULL;
28118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  }
28218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  *stack_base = new_stack_base;
28318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  intptr_t stack_content_size = old_stack_base - stack_pointer;
28418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return new_stack_base - stack_content_size;
28518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org}
28618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
287c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#endif  // V8_INTERPRETED_REGEXP
288c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
2893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} }  // namespace v8::internal
290