Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/ia32/codegen-ia32.cc

Issue 2772004: Change tests for string type in RegExpExecStub on all platforms. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/codegen-arm.cc ('k') | src/x64/codegen-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 11287 matching lines...) Expand 10 before | Expand all | Expand 10 after
11298 // Check that the last match info has space for the capture registers and the 11298 // Check that the last match info has space for the capture registers and the
11299 // additional information. 11299 // additional information.
11300 __ mov(eax, FieldOperand(ebx, FixedArray::kLengthOffset)); 11300 __ mov(eax, FieldOperand(ebx, FixedArray::kLengthOffset));
11301 __ SmiUntag(eax); 11301 __ SmiUntag(eax);
11302 __ add(Operand(edx), Immediate(RegExpImpl::kLastMatchOverhead)); 11302 __ add(Operand(edx), Immediate(RegExpImpl::kLastMatchOverhead));
11303 __ cmp(edx, Operand(eax)); 11303 __ cmp(edx, Operand(eax));
11304 __ j(greater, &runtime); 11304 __ j(greater, &runtime);
11305 11305
11306 // ecx: RegExp data (FixedArray) 11306 // ecx: RegExp data (FixedArray)
11307 // Check the representation and encoding of the subject string. 11307 // Check the representation and encoding of the subject string.
11308 Label seq_string, seq_two_byte_string, check_code; 11308 Label seq_ascii_string, seq_two_byte_string, check_code;
11309 const int kStringRepresentationEncodingMask =
11310 kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
11311 __ mov(eax, Operand(esp, kSubjectOffset)); 11309 __ mov(eax, Operand(esp, kSubjectOffset));
11312 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); 11310 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
11313 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); 11311 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset));
11314 __ and_(ebx, kStringRepresentationEncodingMask); 11312 // First check for flat two byte string.
11315 // First check for sequential string. 11313 __ and_(ebx,
11316 ASSERT_EQ(0, kStringTag); 11314 kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask);
11317 ASSERT_EQ(0, kSeqStringTag); 11315 ASSERT_EQ(0, kStringTag | kSeqStringTag | kTwoByteStringTag);
11316 __ j(zero, &seq_two_byte_string);
11317 // Any other flat string must be a flat ascii string.
11318 __ test(Operand(ebx), 11318 __ test(Operand(ebx),
11319 Immediate(kIsNotStringMask | kStringRepresentationMask)); 11319 Immediate(kIsNotStringMask | kStringRepresentationMask));
11320 __ j(zero, &seq_string); 11320 __ j(zero, &seq_ascii_string);
11321 11321
11322 // Check for flat cons string. 11322 // Check for flat cons string.
11323 // A flat cons string is a cons string where the second part is the empty 11323 // A flat cons string is a cons string where the second part is the empty
11324 // string. In that case the subject string is just the first part of the cons 11324 // string. In that case the subject string is just the first part of the cons
11325 // string. Also in this case the first part of the cons string is known to be 11325 // string. Also in this case the first part of the cons string is known to be
11326 // a sequential string or an external string. 11326 // a sequential string or an external string.
11327 __ and_(ebx, kStringRepresentationMask); 11327 ASSERT(kExternalStringTag !=0);
11328 __ cmp(ebx, kConsStringTag); 11328 ASSERT_EQ(0, kConsStringTag & kExternalStringTag);
11329 __ j(not_equal, &runtime); 11329 __ test(Operand(ebx),
11330 Immediate(kIsNotStringMask | kExternalStringTag));
11331 __ j(not_zero, &runtime);
11332 // String is a cons string.
11330 __ mov(edx, FieldOperand(eax, ConsString::kSecondOffset)); 11333 __ mov(edx, FieldOperand(eax, ConsString::kSecondOffset));
11331 __ cmp(Operand(edx), Factory::empty_string()); 11334 __ cmp(Operand(edx), Factory::empty_string());
11332 __ j(not_equal, &runtime); 11335 __ j(not_equal, &runtime);
11333 __ mov(eax, FieldOperand(eax, ConsString::kFirstOffset)); 11336 __ mov(eax, FieldOperand(eax, ConsString::kFirstOffset));
11334 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); 11337 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
11335 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); 11338 // String is a cons string with empty second part.
11336 ASSERT_EQ(0, kSeqStringTag); 11339 // eax: first part of cons string.
11337 __ test(ebx, Immediate(kStringRepresentationMask)); 11340 // ebx: map of first part of cons string.
11341 // Is first part a flat two byte string?
11342 __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset),
11343 kStringRepresentationMask | kStringEncodingMask);
11344 ASSERT_EQ(0, kSeqStringTag | kTwoByteStringTag);
11345 __ j(zero, &seq_two_byte_string);
11346 // Any other flat string must be ascii.
11347 __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset),
11348 kStringRepresentationMask);
11338 __ j(not_zero, &runtime); 11349 __ j(not_zero, &runtime);
11339 __ and_(ebx, kStringRepresentationEncodingMask);
11340 11350
11341 __ bind(&seq_string); 11351 __ bind(&seq_ascii_string);
11342 // eax: subject string (sequential either ascii to two byte) 11352 // eax: subject string (flat ascii)
11343 // ebx: suject string type & kStringRepresentationEncodingMask
11344 // ecx: RegExp data (FixedArray) 11353 // ecx: RegExp data (FixedArray)
11345 // Check that the irregexp code has been generated for an ascii string. If
11346 // it has, the field contains a code object otherwise it contains the hole.
11347 const int kSeqTwoByteString = kStringTag | kSeqStringTag | kTwoByteStringTag;
11348 __ cmp(ebx, kSeqTwoByteString);
11349 __ j(equal, &seq_two_byte_string);
11350 if (FLAG_debug_code) {
11351 __ cmp(ebx, kStringTag | kSeqStringTag | kAsciiStringTag);
11352 __ Check(equal, "Expected sequential ascii string");
11353 }
11354 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); 11354 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset));
11355 __ Set(edi, Immediate(1)); // Type is ascii. 11355 __ Set(edi, Immediate(1)); // Type is ascii.
11356 __ jmp(&check_code); 11356 __ jmp(&check_code);
11357 11357
11358 __ bind(&seq_two_byte_string); 11358 __ bind(&seq_two_byte_string);
11359 // eax: subject string 11359 // eax: subject string (flat two byte)
11360 // ecx: RegExp data (FixedArray) 11360 // ecx: RegExp data (FixedArray)
11361 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataUC16CodeOffset)); 11361 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataUC16CodeOffset));
11362 __ Set(edi, Immediate(0)); // Type is two byte. 11362 __ Set(edi, Immediate(0)); // Type is two byte.
11363 11363
11364 __ bind(&check_code); 11364 __ bind(&check_code);
11365 // Check that the irregexp code has been generated for the actual string 11365 // Check that the irregexp code has been generated for the actual string
11366 // encoding. If it has, the field contains a code object otherwise it contains 11366 // encoding. If it has, the field contains a code object otherwise it contains
11367 // the hole. 11367 // the hole.
11368 __ CmpObjectType(edx, CODE_TYPE, ebx); 11368 __ CmpObjectType(edx, CODE_TYPE, ebx);
11369 __ j(not_equal, &runtime); 11369 __ j(not_equal, &runtime);
(...skipping 1520 matching lines...) Expand 10 before | Expand all | Expand 10 after
12890 Label non_ascii_string_add_flat_result; 12890 Label non_ascii_string_add_flat_result;
12891 ASSERT(kStringEncodingMask == kAsciiStringTag); 12891 ASSERT(kStringEncodingMask == kAsciiStringTag);
12892 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); 12892 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset));
12893 __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag); 12893 __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag);
12894 __ j(zero, &non_ascii_string_add_flat_result); 12894 __ j(zero, &non_ascii_string_add_flat_result);
12895 __ mov(ecx, FieldOperand(edx, HeapObject::kMapOffset)); 12895 __ mov(ecx, FieldOperand(edx, HeapObject::kMapOffset));
12896 __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag); 12896 __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag);
12897 __ j(zero, &string_add_runtime); 12897 __ j(zero, &string_add_runtime);
12898 12898
12899 __ bind(&make_flat_ascii_string); 12899 __ bind(&make_flat_ascii_string);
12900 // Both strings are ascii strings. As they are short they are both flat. 12900 // Both strings are ascii strings. As they are short they are both flat.
12901 // ebx: length of resulting flat string as a smi 12901 // ebx: length of resulting flat string as a smi
12902 __ SmiUntag(ebx); 12902 __ SmiUntag(ebx);
12903 __ AllocateAsciiString(eax, ebx, ecx, edx, edi, &string_add_runtime); 12903 __ AllocateAsciiString(eax, ebx, ecx, edx, edi, &string_add_runtime);
12904 // eax: result string 12904 // eax: result string
12905 __ mov(ecx, eax); 12905 __ mov(ecx, eax);
12906 // Locate first character of result. 12906 // Locate first character of result.
12907 __ add(Operand(ecx), Immediate(SeqAsciiString::kHeaderSize - kHeapObjectTag)); 12907 __ add(Operand(ecx), Immediate(SeqAsciiString::kHeaderSize - kHeapObjectTag));
12908 // Load first argument and locate first character. 12908 // Load first argument and locate first character.
12909 __ mov(edx, Operand(esp, 2 * kPointerSize)); 12909 __ mov(edx, Operand(esp, 2 * kPointerSize));
12910 __ mov(edi, FieldOperand(edx, String::kLengthOffset)); 12910 __ mov(edi, FieldOperand(edx, String::kLengthOffset));
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
13701 masm.GetCode(&desc); 13701 masm.GetCode(&desc);
13702 // Call the function from C++. 13702 // Call the function from C++.
13703 return FUNCTION_CAST<MemCopyFunction>(buffer); 13703 return FUNCTION_CAST<MemCopyFunction>(buffer);
13704 } 13704 }
13705 13705
13706 #undef __ 13706 #undef __
13707 13707
13708 } } // namespace v8::internal 13708 } } // namespace v8::internal
13709 13709
13710 #endif // V8_TARGET_ARCH_IA32 13710 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/arm/codegen-arm.cc ('k') | src/x64/codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698