OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 // (5) One byte sequential. Load regexp code for one byte. | 418 // (5) One byte sequential. Load regexp code for one byte. |
419 // (E) Carry on. | 419 // (E) Carry on. |
420 /// [...] | 420 /// [...] |
421 | 421 |
422 // Deferred code at the end of the stub: | 422 // Deferred code at the end of the stub: |
423 // (6) Long external string? If not, go to (10). | 423 // (6) Long external string? If not, go to (10). |
424 // (7) External string. Make it, offset-wise, look like a sequential string. | 424 // (7) External string. Make it, offset-wise, look like a sequential string. |
425 // (8) Is the external string one byte? If yes, go to (5). | 425 // (8) Is the external string one byte? If yes, go to (5). |
426 // (9) Two byte sequential. Load regexp code for two byte. Go to (E). | 426 // (9) Two byte sequential. Load regexp code for two byte. Go to (E). |
427 // (10) Short external string or not a string? If yes, bail out to runtime. | 427 // (10) Short external string or not a string? If yes, bail out to runtime. |
428 // (11) Sliced string. Replace subject with parent. Go to (1). | 428 // (11) Sliced or thin string. Replace subject with parent. Go to (1). |
429 | 429 |
430 Label seq_one_byte_string /* 5 */, seq_two_byte_string /* 9 */, | 430 Label seq_one_byte_string /* 5 */, seq_two_byte_string /* 9 */, |
431 external_string /* 7 */, check_underlying /* 1 */, | 431 external_string /* 7 */, check_underlying /* 1 */, |
432 not_seq_nor_cons /* 6 */, check_code /* E */, not_long_external /* 10 */; | 432 not_seq_nor_cons /* 6 */, check_code /* E */, not_long_external /* 10 */; |
433 | 433 |
434 __ bind(&check_underlying); | 434 __ bind(&check_underlying); |
435 // (1) Sequential two byte? If yes, go to (9). | 435 // (1) Sequential two byte? If yes, go to (9). |
436 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 436 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
437 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 437 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
438 | 438 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 __ Move(ecx, Immediate(0)); // Type is two byte. | 726 __ Move(ecx, Immediate(0)); // Type is two byte. |
727 __ jmp(&check_code); // Go to (E). | 727 __ jmp(&check_code); // Go to (E). |
728 | 728 |
729 // (10) Not a string or a short external string? If yes, bail out to runtime. | 729 // (10) Not a string or a short external string? If yes, bail out to runtime. |
730 __ bind(¬_long_external); | 730 __ bind(¬_long_external); |
731 // Catch non-string subject or short external string. | 731 // Catch non-string subject or short external string. |
732 STATIC_ASSERT(kNotStringTag != 0 && kShortExternalStringTag !=0); | 732 STATIC_ASSERT(kNotStringTag != 0 && kShortExternalStringTag !=0); |
733 __ test(ebx, Immediate(kIsNotStringMask | kShortExternalStringTag)); | 733 __ test(ebx, Immediate(kIsNotStringMask | kShortExternalStringTag)); |
734 __ j(not_zero, &runtime); | 734 __ j(not_zero, &runtime); |
735 | 735 |
736 // (11) Sliced string. Replace subject with parent. Go to (1). | 736 // (11) Sliced or thin string. Replace subject with parent. Go to (1). |
| 737 Label thin_string; |
| 738 __ cmp(ebx, Immediate(kThinStringTag)); |
| 739 __ j(equal, &thin_string, Label::kNear); |
737 // Load offset into edi and replace subject string with parent. | 740 // Load offset into edi and replace subject string with parent. |
738 __ mov(edi, FieldOperand(eax, SlicedString::kOffsetOffset)); | 741 __ mov(edi, FieldOperand(eax, SlicedString::kOffsetOffset)); |
739 __ mov(eax, FieldOperand(eax, SlicedString::kParentOffset)); | 742 __ mov(eax, FieldOperand(eax, SlicedString::kParentOffset)); |
740 __ jmp(&check_underlying); // Go to (1). | 743 __ jmp(&check_underlying); // Go to (1). |
| 744 |
| 745 __ bind(&thin_string); |
| 746 __ mov(eax, FieldOperand(eax, ThinString::kActualOffset)); |
| 747 __ jmp(&check_underlying); // Go to (1). |
741 #endif // V8_INTERPRETED_REGEXP | 748 #endif // V8_INTERPRETED_REGEXP |
742 } | 749 } |
743 | 750 |
744 | 751 |
745 static int NegativeComparisonResult(Condition cc) { | 752 static int NegativeComparisonResult(Condition cc) { |
746 DCHECK(cc != equal); | 753 DCHECK(cc != equal); |
747 DCHECK((cc == less) || (cc == less_equal) | 754 DCHECK((cc == less) || (cc == less_equal) |
748 || (cc == greater) || (cc == greater_equal)); | 755 || (cc == greater) || (cc == greater_equal)); |
749 return (cc == greater || cc == greater_equal) ? LESS : GREATER; | 756 return (cc == greater || cc == greater_equal) ? LESS : GREATER; |
750 } | 757 } |
(...skipping 3468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4219 kStackUnwindSpace, nullptr, return_value_operand, | 4226 kStackUnwindSpace, nullptr, return_value_operand, |
4220 NULL); | 4227 NULL); |
4221 } | 4228 } |
4222 | 4229 |
4223 #undef __ | 4230 #undef __ |
4224 | 4231 |
4225 } // namespace internal | 4232 } // namespace internal |
4226 } // namespace v8 | 4233 } // namespace v8 |
4227 | 4234 |
4228 #endif // V8_TARGET_ARCH_X87 | 4235 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |