Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index f81d237e030f5858ec2ab92524aaecc1ac9c6ac3..0bd39308abc1abbd3e80f81e0db3ca8fa8f62a31 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -139,6 +139,17 @@ void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor( |
} |
+void RegExpConstructResultStub::InitializeInterfaceDescriptor( |
+ Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ static Register registers[] = { ecx, ebx, eax }; |
+ descriptor->register_param_count_ = 3; |
+ descriptor->register_params_ = registers; |
+ descriptor->deoptimization_handler_ = |
+ Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry; |
+} |
+ |
+ |
void LoadFieldStub::InitializeInterfaceDescriptor( |
Isolate* isolate, |
CodeStubInterfaceDescriptor* descriptor) { |
@@ -1970,88 +1981,6 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
} |
-void RegExpConstructResultStub::Generate(MacroAssembler* masm) { |
- const int kMaxInlineLength = 100; |
- Label slowcase; |
- Label done; |
- __ mov(ebx, Operand(esp, kPointerSize * 3)); |
- __ JumpIfNotSmi(ebx, &slowcase); |
- __ cmp(ebx, Immediate(Smi::FromInt(kMaxInlineLength))); |
- __ j(above, &slowcase); |
- // Smi-tagging is equivalent to multiplying by 2. |
- STATIC_ASSERT(kSmiTag == 0); |
- STATIC_ASSERT(kSmiTagSize == 1); |
- // Allocate RegExpResult followed by FixedArray with size in ebx. |
- // JSArray: [Map][empty properties][Elements][Length-smi][index][input] |
- // Elements: [Map][Length][..elements..] |
- __ Allocate(JSRegExpResult::kSize + FixedArray::kHeaderSize, |
- times_pointer_size, |
- ebx, // In: Number of elements as a smi |
- REGISTER_VALUE_IS_SMI, |
- eax, // Out: Start of allocation (tagged). |
- ecx, // Out: End of allocation. |
- edx, // Scratch register |
- &slowcase, |
- TAG_OBJECT); |
- // eax: Start of allocated area, object-tagged. |
- |
- // Set JSArray map to global.regexp_result_map(). |
- // Set empty properties FixedArray. |
- // Set elements to point to FixedArray allocated right after the JSArray. |
- // Interleave operations for better latency. |
- __ mov(edx, ContextOperand(esi, Context::GLOBAL_OBJECT_INDEX)); |
- Factory* factory = masm->isolate()->factory(); |
- __ mov(ecx, Immediate(factory->empty_fixed_array())); |
- __ lea(ebx, Operand(eax, JSRegExpResult::kSize)); |
- __ mov(edx, FieldOperand(edx, GlobalObject::kNativeContextOffset)); |
- __ mov(FieldOperand(eax, JSObject::kElementsOffset), ebx); |
- __ mov(FieldOperand(eax, JSObject::kPropertiesOffset), ecx); |
- __ mov(edx, ContextOperand(edx, Context::REGEXP_RESULT_MAP_INDEX)); |
- __ mov(FieldOperand(eax, HeapObject::kMapOffset), edx); |
- |
- // Set input, index and length fields from arguments. |
- __ mov(ecx, Operand(esp, kPointerSize * 1)); |
- __ mov(FieldOperand(eax, JSRegExpResult::kInputOffset), ecx); |
- __ mov(ecx, Operand(esp, kPointerSize * 2)); |
- __ mov(FieldOperand(eax, JSRegExpResult::kIndexOffset), ecx); |
- __ mov(ecx, Operand(esp, kPointerSize * 3)); |
- __ mov(FieldOperand(eax, JSArray::kLengthOffset), ecx); |
- |
- // Fill out the elements FixedArray. |
- // eax: JSArray. |
- // ebx: FixedArray. |
- // ecx: Number of elements in array, as smi. |
- |
- // Set map. |
- __ mov(FieldOperand(ebx, HeapObject::kMapOffset), |
- Immediate(factory->fixed_array_map())); |
- // Set length. |
- __ mov(FieldOperand(ebx, FixedArray::kLengthOffset), ecx); |
- // Fill contents of fixed-array with undefined. |
- __ SmiUntag(ecx); |
- __ mov(edx, Immediate(factory->undefined_value())); |
- __ lea(ebx, FieldOperand(ebx, FixedArray::kHeaderSize)); |
- // Fill fixed array elements with undefined. |
- // eax: JSArray. |
- // ecx: Number of elements to fill. |
- // ebx: Start of elements in FixedArray. |
- // edx: undefined. |
- Label loop; |
- __ test(ecx, ecx); |
- __ bind(&loop); |
- __ j(less_equal, &done, Label::kNear); // Jump if ecx is negative or zero. |
- __ sub(ecx, Immediate(1)); |
- __ mov(Operand(ebx, ecx, times_pointer_size, 0), edx); |
- __ jmp(&loop); |
- |
- __ bind(&done); |
- __ ret(3 * kPointerSize); |
- |
- __ bind(&slowcase); |
- __ TailCallRuntime(Runtime::kRegExpConstructResult, 3, 1); |
-} |
- |
- |
static int NegativeComparisonResult(Condition cc) { |
ASSERT(cc != equal); |
ASSERT((cc == less) || (cc == less_equal) |