OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 4729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4740 | 4740 |
4741 // Reset offset for possibly sliced string. | 4741 // Reset offset for possibly sliced string. |
4742 __ mov(t0, zero_reg); | 4742 __ mov(t0, zero_reg); |
4743 // subject: Subject string | 4743 // subject: Subject string |
4744 // regexp_data: RegExp data (FixedArray) | 4744 // regexp_data: RegExp data (FixedArray) |
4745 // Check the representation and encoding of the subject string. | 4745 // Check the representation and encoding of the subject string. |
4746 Label seq_string; | 4746 Label seq_string; |
4747 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); | 4747 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); |
4748 __ lbu(a0, FieldMemOperand(a0, Map::kInstanceTypeOffset)); | 4748 __ lbu(a0, FieldMemOperand(a0, Map::kInstanceTypeOffset)); |
4749 // First check for flat string. None of the following string type tests will | 4749 // First check for flat string. None of the following string type tests will |
4750 // succeed if kIsNotStringTag is set. | 4750 // succeed if subject is not a string or a short external string. |
4751 __ And(a1, a0, Operand(kIsNotStringMask | kStringRepresentationMask)); | 4751 __ And(a1, |
| 4752 a0, |
| 4753 Operand(kIsNotStringMask | |
| 4754 kStringRepresentationMask | |
| 4755 kShortExternalStringMask)); |
4752 STATIC_ASSERT((kStringTag | kSeqStringTag) == 0); | 4756 STATIC_ASSERT((kStringTag | kSeqStringTag) == 0); |
4753 __ Branch(&seq_string, eq, a1, Operand(zero_reg)); | 4757 __ Branch(&seq_string, eq, a1, Operand(zero_reg)); |
4754 | 4758 |
4755 // subject: Subject string | 4759 // subject: Subject string |
4756 // a0: instance type if Subject string | 4760 // a0: instance type if Subject string |
4757 // regexp_data: RegExp data (FixedArray) | 4761 // regexp_data: RegExp data (FixedArray) |
4758 // a1: whether subject is a string and if yes, its string representation | 4762 // a1: whether subject is a string and if yes, its string representation |
4759 // Check for flat cons string or sliced string. | 4763 // Check for flat cons string or sliced string. |
4760 // A flat cons string is a cons string where the second part is the empty | 4764 // A flat cons string is a cons string where the second part is the empty |
4761 // string. In that case the subject string is just the first part of the cons | 4765 // string. In that case the subject string is just the first part of the cons |
4762 // string. Also in this case the first part of the cons string is known to be | 4766 // string. Also in this case the first part of the cons string is known to be |
4763 // a sequential string or an external string. | 4767 // a sequential string or an external string. |
4764 // In the case of a sliced string its offset has to be taken into account. | 4768 // In the case of a sliced string its offset has to be taken into account. |
4765 Label cons_string, check_encoding; | 4769 Label cons_string, external_string, check_encoding; |
4766 STATIC_ASSERT(kConsStringTag < kExternalStringTag); | 4770 STATIC_ASSERT(kConsStringTag < kExternalStringTag); |
4767 STATIC_ASSERT(kSlicedStringTag > kExternalStringTag); | 4771 STATIC_ASSERT(kSlicedStringTag > kExternalStringTag); |
4768 STATIC_ASSERT(kIsNotStringMask > kExternalStringTag); | 4772 STATIC_ASSERT(kIsNotStringMask > kExternalStringTag); |
| 4773 STATIC_ASSERT(kShortExternalStringTag > kExternalStringTag); |
4769 __ Branch(&cons_string, lt, a1, Operand(kExternalStringTag)); | 4774 __ Branch(&cons_string, lt, a1, Operand(kExternalStringTag)); |
4770 __ Branch(&runtime, eq, a1, Operand(kExternalStringTag)); | 4775 __ Branch(&external_string, eq, a1, Operand(kExternalStringTag)); |
4771 | 4776 |
4772 // Catch non-string subject (should already have been guarded against). | 4777 // Catch non-string subject or short external string. |
4773 STATIC_ASSERT(kNotStringTag != 0); | 4778 STATIC_ASSERT(kNotStringTag != 0 && kShortExternalStringTag !=0); |
4774 __ And(at, a1, Operand(kIsNotStringMask)); | 4779 __ And(at, a1, Operand(kIsNotStringMask | kShortExternalStringMask)); |
4775 __ Branch(&runtime, ne, at, Operand(zero_reg)); | 4780 __ Branch(&runtime, ne, at, Operand(zero_reg)); |
4776 | 4781 |
4777 // String is sliced. | 4782 // String is sliced. |
4778 __ lw(t0, FieldMemOperand(subject, SlicedString::kOffsetOffset)); | 4783 __ lw(t0, FieldMemOperand(subject, SlicedString::kOffsetOffset)); |
4779 __ sra(t0, t0, kSmiTagSize); | 4784 __ sra(t0, t0, kSmiTagSize); |
4780 __ lw(subject, FieldMemOperand(subject, SlicedString::kParentOffset)); | 4785 __ lw(subject, FieldMemOperand(subject, SlicedString::kParentOffset)); |
4781 // t5: offset of sliced string, smi-tagged. | 4786 // t5: offset of sliced string, smi-tagged. |
4782 __ jmp(&check_encoding); | 4787 __ jmp(&check_encoding); |
4783 // String is a cons string, check whether it is flat. | 4788 // String is a cons string, check whether it is flat. |
4784 __ bind(&cons_string); | 4789 __ bind(&cons_string); |
4785 __ lw(a0, FieldMemOperand(subject, ConsString::kSecondOffset)); | 4790 __ lw(a0, FieldMemOperand(subject, ConsString::kSecondOffset)); |
4786 __ LoadRoot(a1, Heap::kEmptyStringRootIndex); | 4791 __ LoadRoot(a1, Heap::kEmptyStringRootIndex); |
4787 __ Branch(&runtime, ne, a0, Operand(a1)); | 4792 __ Branch(&runtime, ne, a0, Operand(a1)); |
4788 __ lw(subject, FieldMemOperand(subject, ConsString::kFirstOffset)); | 4793 __ lw(subject, FieldMemOperand(subject, ConsString::kFirstOffset)); |
4789 // Is first part of cons or parent of slice a flat string? | 4794 // Is first part of cons or parent of slice a flat string? |
4790 __ bind(&check_encoding); | 4795 __ bind(&check_encoding); |
4791 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); | 4796 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); |
4792 __ lbu(a0, FieldMemOperand(a0, Map::kInstanceTypeOffset)); | 4797 __ lbu(a0, FieldMemOperand(a0, Map::kInstanceTypeOffset)); |
4793 STATIC_ASSERT(kSeqStringTag == 0); | 4798 STATIC_ASSERT(kSeqStringTag == 0); |
4794 __ And(at, a0, Operand(kStringRepresentationMask)); | 4799 __ And(at, a0, Operand(kStringRepresentationMask)); |
4795 __ Branch(&runtime, ne, at, Operand(zero_reg)); | 4800 __ Branch(&external_string, ne, at, Operand(zero_reg)); |
4796 | 4801 |
4797 __ bind(&seq_string); | 4802 __ bind(&seq_string); |
4798 // subject: Subject string | 4803 // subject: Subject string |
4799 // regexp_data: RegExp data (FixedArray) | 4804 // regexp_data: RegExp data (FixedArray) |
4800 // a0: Instance type of subject string | 4805 // a0: Instance type of subject string |
4801 STATIC_ASSERT(kStringEncodingMask == 4); | 4806 STATIC_ASSERT(kStringEncodingMask == 4); |
4802 STATIC_ASSERT(kAsciiStringTag == 4); | 4807 STATIC_ASSERT(kAsciiStringTag == 4); |
4803 STATIC_ASSERT(kTwoByteStringTag == 0); | 4808 STATIC_ASSERT(kTwoByteStringTag == 0); |
4804 // Find the code object based on the assumptions above. | 4809 // Find the code object based on the assumptions above. |
4805 __ And(a0, a0, Operand(kStringEncodingMask)); // Non-zero for ascii. | 4810 __ And(a0, a0, Operand(kStringEncodingMask)); // Non-zero for ascii. |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5011 __ Branch(&next_capture, USE_DELAY_SLOT); | 5016 __ Branch(&next_capture, USE_DELAY_SLOT); |
5012 __ addiu(a0, a0, kPointerSize); // In branch delay slot. | 5017 __ addiu(a0, a0, kPointerSize); // In branch delay slot. |
5013 | 5018 |
5014 __ bind(&done); | 5019 __ bind(&done); |
5015 | 5020 |
5016 // Return last match info. | 5021 // Return last match info. |
5017 __ lw(v0, MemOperand(sp, kLastMatchInfoOffset)); | 5022 __ lw(v0, MemOperand(sp, kLastMatchInfoOffset)); |
5018 __ Addu(sp, sp, Operand(4 * kPointerSize)); | 5023 __ Addu(sp, sp, Operand(4 * kPointerSize)); |
5019 __ Ret(); | 5024 __ Ret(); |
5020 | 5025 |
| 5026 // External string. Short external strings have already been ruled out. |
| 5027 // a0: scratch |
| 5028 __ bind(&external_string); |
| 5029 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); |
| 5030 __ lbu(a0, FieldMemOperand(a0, Map::kInstanceTypeOffset)); |
| 5031 if (FLAG_debug_code) { |
| 5032 // Assert that we do not have a cons or slice (indirect strings) here. |
| 5033 // Sequential strings have already been ruled out. |
| 5034 __ And(at, a0, Operand(kIsIndirectStringMask)); |
| 5035 __ Assert(eq, "external string expected, but not found", |
| 5036 at, Operand(zero_reg)); |
| 5037 } |
| 5038 __ lw(subject, |
| 5039 FieldMemOperand(subject, ExternalString::kResourceDataOffset)); |
| 5040 // Move the pointer so that offset-wise, it looks like a sequential string. |
| 5041 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqAsciiString::kHeaderSize); |
| 5042 __ Subu(subject, |
| 5043 subject, |
| 5044 SeqTwoByteString::kHeaderSize - kHeapObjectTag); |
| 5045 __ jmp(&seq_string); |
| 5046 |
5021 // Do the runtime call to execute the regexp. | 5047 // Do the runtime call to execute the regexp. |
5022 __ bind(&runtime); | 5048 __ bind(&runtime); |
5023 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); | 5049 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
5024 #endif // V8_INTERPRETED_REGEXP | 5050 #endif // V8_INTERPRETED_REGEXP |
5025 } | 5051 } |
5026 | 5052 |
5027 | 5053 |
5028 void RegExpConstructResultStub::Generate(MacroAssembler* masm) { | 5054 void RegExpConstructResultStub::Generate(MacroAssembler* masm) { |
5029 const int kMaxInlineLength = 100; | 5055 const int kMaxInlineLength = 100; |
5030 Label slowcase; | 5056 Label slowcase; |
(...skipping 2438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7469 &slow_elements); | 7495 &slow_elements); |
7470 __ Ret(); | 7496 __ Ret(); |
7471 } | 7497 } |
7472 | 7498 |
7473 | 7499 |
7474 #undef __ | 7500 #undef __ |
7475 | 7501 |
7476 } } // namespace v8::internal | 7502 } } // namespace v8::internal |
7477 | 7503 |
7478 #endif // V8_TARGET_ARCH_MIPS | 7504 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |