Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index e5471fd540b2272f5c99209c5edbf9b8b7f39a11..7474e4aa79537b6b9a81d922c23e6b6813a3f9a3 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -134,6 +134,17 @@ void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor( |
} |
+void RegExpConstructResultStub::InitializeInterfaceDescriptor( |
+ Isolate* isolate, |
+ CodeStubInterfaceDescriptor* descriptor) { |
+ static Register registers[] = { r2, r1, r0 }; |
+ descriptor->register_param_count_ = 3; |
+ descriptor->register_params_ = registers; |
+ descriptor->deoptimization_handler_ = |
+ Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry; |
+} |
+ |
+ |
void LoadFieldStub::InitializeInterfaceDescriptor( |
Isolate* isolate, |
CodeStubInterfaceDescriptor* descriptor) { |
@@ -2984,96 +2995,6 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { |
} |
-void RegExpConstructResultStub::Generate(MacroAssembler* masm) { |
- const int kMaxInlineLength = 100; |
- Label slowcase; |
- Label done; |
- Factory* factory = masm->isolate()->factory(); |
- |
- __ ldr(r1, MemOperand(sp, kPointerSize * 2)); |
- STATIC_ASSERT(kSmiTag == 0); |
- STATIC_ASSERT(kSmiTagSize == 1); |
- __ JumpIfNotSmi(r1, &slowcase); |
- __ cmp(r1, Operand(Smi::FromInt(kMaxInlineLength))); |
- __ b(hi, &slowcase); |
- // Smi-tagging is equivalent to multiplying by 2. |
- // Allocate RegExpResult followed by FixedArray with size in ebx. |
- // JSArray: [Map][empty properties][Elements][Length-smi][index][input] |
- // Elements: [Map][Length][..elements..] |
- // Size of JSArray with two in-object properties and the header of a |
- // FixedArray. |
- int objects_size = |
- (JSRegExpResult::kSize + FixedArray::kHeaderSize) / kPointerSize; |
- __ SmiUntag(r5, r1); |
- __ add(r2, r5, Operand(objects_size)); |
- __ Allocate( |
- r2, // In: Size, in words. |
- r0, // Out: Start of allocation (tagged). |
- r3, // Scratch register. |
- r4, // Scratch register. |
- &slowcase, |
- static_cast<AllocationFlags>(TAG_OBJECT | SIZE_IN_WORDS)); |
- // r0: Start of allocated area, object-tagged. |
- // r1: Number of elements in array, as smi. |
- // r5: Number of elements, untagged. |
- |
- // 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. |
- __ ldr(r2, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); |
- __ add(r3, r0, Operand(JSRegExpResult::kSize)); |
- __ mov(r4, Operand(factory->empty_fixed_array())); |
- __ ldr(r2, FieldMemOperand(r2, GlobalObject::kNativeContextOffset)); |
- __ str(r3, FieldMemOperand(r0, JSObject::kElementsOffset)); |
- __ ldr(r2, ContextOperand(r2, Context::REGEXP_RESULT_MAP_INDEX)); |
- __ str(r4, FieldMemOperand(r0, JSObject::kPropertiesOffset)); |
- __ str(r2, FieldMemOperand(r0, HeapObject::kMapOffset)); |
- |
- // Set input, index and length fields from arguments. |
- __ ldr(r1, MemOperand(sp, kPointerSize * 0)); |
- __ ldr(r2, MemOperand(sp, kPointerSize * 1)); |
- __ ldr(r6, MemOperand(sp, kPointerSize * 2)); |
- __ str(r1, FieldMemOperand(r0, JSRegExpResult::kInputOffset)); |
- __ str(r2, FieldMemOperand(r0, JSRegExpResult::kIndexOffset)); |
- __ str(r6, FieldMemOperand(r0, JSArray::kLengthOffset)); |
- |
- // Fill out the elements FixedArray. |
- // r0: JSArray, tagged. |
- // r3: FixedArray, tagged. |
- // r5: Number of elements in array, untagged. |
- |
- // Set map. |
- __ mov(r2, Operand(factory->fixed_array_map())); |
- __ str(r2, FieldMemOperand(r3, HeapObject::kMapOffset)); |
- // Set FixedArray length. |
- __ SmiTag(r6, r5); |
- __ str(r6, FieldMemOperand(r3, FixedArray::kLengthOffset)); |
- // Fill contents of fixed-array with undefined. |
- __ LoadRoot(r2, Heap::kUndefinedValueRootIndex); |
- __ add(r3, r3, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
- // Fill fixed array elements with undefined. |
- // r0: JSArray, tagged. |
- // r2: undefined. |
- // r3: Start of elements in FixedArray. |
- // r5: Number of elements to fill. |
- Label loop; |
- __ cmp(r5, Operand::Zero()); |
- __ bind(&loop); |
- __ b(le, &done); // Jump if r5 is negative or zero. |
- __ sub(r5, r5, Operand(1), SetCC); |
- __ str(r2, MemOperand(r3, r5, LSL, kPointerSizeLog2)); |
- __ jmp(&loop); |
- |
- __ bind(&done); |
- __ add(sp, sp, Operand(3 * kPointerSize)); |
- __ Ret(); |
- |
- __ bind(&slowcase); |
- __ TailCallRuntime(Runtime::kRegExpConstructResult, 3, 1); |
-} |
- |
- |
static void GenerateRecordCallTarget(MacroAssembler* masm) { |
// Cache the called function in a global property cell. Cache states |
// are uninitialized, monomorphic (indicated by a JSFunction), and |