136
136
__ str(scratch1, FieldMemOperand(result, JSArray::kElementsOffset));
138
138
// Clear the heap tag on the elements array.
139
__ and_(scratch1, scratch1, Operand(~kHeapObjectTagMask));
139
ASSERT(kSmiTag == 0);
140
__ sub(scratch1, scratch1, Operand(kHeapObjectTag));
141
// Initialize the FixedArray and fill it with holes. FixedArray length is not
142
// Initialize the FixedArray and fill it with holes. FixedArray length is
142
143
// stored as a smi.
143
144
// result: JSObject
144
145
// scratch1: elements array (untagged)
146
147
__ LoadRoot(scratch3, Heap::kFixedArrayMapRootIndex);
147
148
ASSERT_EQ(0 * kPointerSize, FixedArray::kMapOffset);
148
149
__ str(scratch3, MemOperand(scratch1, kPointerSize, PostIndex));
149
__ mov(scratch3, Operand(initial_capacity));
150
__ mov(scratch3, Operand(Smi::FromInt(initial_capacity)));
150
151
ASSERT_EQ(1 * kPointerSize, FixedArray::kLengthOffset);
151
152
__ str(scratch3, MemOperand(scratch1, kPointerSize, PostIndex));
240
241
FieldMemOperand(result, JSArray::kElementsOffset));
242
243
// Clear the heap tag on the elements array.
243
__ and_(elements_array_storage,
244
elements_array_storage,
245
Operand(~kHeapObjectTagMask));
246
// Initialize the fixed array and fill it with holes. FixedArray length is not
244
ASSERT(kSmiTag == 0);
245
__ sub(elements_array_storage,
246
elements_array_storage,
247
Operand(kHeapObjectTag));
248
// Initialize the fixed array and fill it with holes. FixedArray length is
247
249
// stored as a smi.
248
250
// result: JSObject
249
251
// elements_array_storage: elements array (untagged)
250
252
// array_size: size of array (smi)
251
ASSERT(kSmiTag == 0);
252
253
__ LoadRoot(scratch1, Heap::kFixedArrayMapRootIndex);
253
254
ASSERT_EQ(0 * kPointerSize, FixedArray::kMapOffset);
254
255
__ str(scratch1, MemOperand(elements_array_storage, kPointerSize, PostIndex));
255
// Convert array_size from smi to value.
257
Operand(array_size, ASR, kSmiTagSize));
256
ASSERT(kSmiTag == 0);
258
257
__ tst(array_size, array_size);
259
258
// Length of the FixedArray is the number of pre-allocated elements if
260
259
// the actual JSArray has length 0 and the size of the JSArray for non-empty
261
// JSArrays. The length of a FixedArray is not stored as a smi.
262
__ mov(array_size, Operand(JSArray::kPreallocatedArrayElements), LeaveCC, eq);
260
// JSArrays. The length of a FixedArray is stored as a smi.
262
Operand(Smi::FromInt(JSArray::kPreallocatedArrayElements)),
263
265
ASSERT_EQ(1 * kPointerSize, FixedArray::kLengthOffset);
264
266
__ str(array_size,
265
267
MemOperand(elements_array_storage, kPointerSize, PostIndex));
267
269
// Calculate elements array and elements array end.
268
270
// result: JSObject
269
271
// elements_array_storage: elements array element storage
270
// array_size: size of elements array
272
// array_size: smi-tagged size of elements array
273
ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2);
271
274
__ add(elements_array_end,
272
275
elements_array_storage,
273
Operand(array_size, LSL, kPointerSizeLog2));
276
Operand(array_size, LSL, kPointerSizeLog2 - kSmiTagSize));
275
278
// Fill the allocated FixedArray with the hole value if requested.
276
279
// result: JSObject
544
547
// Load the initial map and verify that it is in fact a map.
545
548
// r1: constructor function
549
// r7: undefined value
547
550
__ ldr(r2, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
548
551
__ tst(r2, Operand(kSmiTagMask));
549
552
__ b(eq, &rt_call);
555
558
// instance type would be JS_FUNCTION_TYPE.
556
559
// r1: constructor function
557
560
// r2: initial map
561
// r7: undefined value
559
562
__ CompareInstanceType(r2, r3, JS_FUNCTION_TYPE);
560
563
__ b(eq, &rt_call);
562
565
// Now allocate the JSObject on the heap.
563
566
// r1: constructor function
564
567
// r2: initial map
568
// r7: undefined value
566
569
__ ldrb(r3, FieldMemOperand(r2, Map::kInstanceSizeOffset));
567
570
__ AllocateInNewSpace(r3, r4, r5, r6, &rt_call, SIZE_IN_WORDS);
588
591
// r3: object size (in words)
589
592
// r4: JSObject (not tagged)
590
593
// r5: First in-object property of JSObject (not tagged)
594
// r7: undefined value
592
595
__ add(r6, r4, Operand(r3, LSL, kPointerSizeLog2)); // End of object.
593
596
ASSERT_EQ(3 * kPointerSize, JSObject::kHeaderSize);
594
597
{ Label loop, entry;
611
614
// r1: constructor function
613
616
// r5: start of next object (not tagged)
617
// r7: undefined value
615
618
__ ldrb(r3, FieldMemOperand(r2, Map::kUnusedPropertyFieldsOffset));
616
619
// The field instance sizes contains both pre-allocated property fields and
617
620
// in-object properties.
618
621
__ ldr(r0, FieldMemOperand(r2, Map::kInstanceSizesOffset));
621
Operand(0x000000FF << Map::kPreAllocatedPropertyFieldsByte * 8));
622
__ add(r3, r3, Operand(r6, LSR, Map::kPreAllocatedPropertyFieldsByte * 8));
623
__ and_(r6, r0, Operand(0x000000FF << Map::kInObjectPropertiesByte * 8));
624
__ sub(r3, r3, Operand(r6, LSR, Map::kInObjectPropertiesByte * 8), SetCC);
622
__ Ubfx(r6, r0, Map::kPreAllocatedPropertyFieldsByte * 8, 8);
623
__ add(r3, r3, Operand(r6));
624
__ Ubfx(r6, r0, Map::kInObjectPropertiesByte * 8, 8);
625
__ sub(r3, r3, Operand(r6), SetCC);
626
627
// Done if no extra properties are to be allocated.
627
628
__ b(eq, &allocated);
648
649
// r3: number of elements in properties array
650
651
// r5: FixedArray (not tagged)
652
// r7: undefined value
652
653
__ LoadRoot(r6, Heap::kFixedArrayMapRootIndex);
654
655
ASSERT_EQ(0 * kPointerSize, JSObject::kMapOffset);
655
656
__ str(r6, MemOperand(r2, kPointerSize, PostIndex));
656
ASSERT_EQ(1 * kPointerSize, Array::kLengthOffset);
657
__ str(r3, MemOperand(r2, kPointerSize, PostIndex));
657
ASSERT_EQ(1 * kPointerSize, FixedArray::kLengthOffset);
658
__ mov(r0, Operand(r3, LSL, kSmiTagSize));
659
__ str(r0, MemOperand(r2, kPointerSize, PostIndex));
659
661
// Initialize the fields to undefined.
660
662
// r1: constructor function
914
void Builtins::Generate_LazyCompile(MacroAssembler* masm) {
915
// Enter an internal frame.
916
__ EnterInternalFrame();
918
// Preserve the function.
921
// Push the function on the stack as the argument to the runtime function.
923
__ CallRuntime(Runtime::kLazyCompile, 1);
924
// Calculate the entry point.
925
__ add(r2, r0, Operand(Code::kHeaderSize - kHeapObjectTag));
926
// Restore saved function.
929
// Tear down temporary frame.
930
__ LeaveInternalFrame();
932
// Do a tail-call of the compiled function.
912
937
void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
913
938
// 1. Make sure we have at least one argument.
914
939
// r0: actual number of arguments
1047
1072
__ ldr(r3, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
1049
1074
FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset));
1050
__ ldr(r3, FieldMemOperand(r3, SharedFunctionInfo::kCodeOffset));
1075
__ mov(r2, Operand(r2, ASR, kSmiTagSize));
1076
__ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeOffset));
1051
1077
__ add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag));
1052
1078
__ cmp(r2, r0); // Check formal and actual parameter counts.
1053
1079
__ Jump(Handle<Code>(builtin(ArgumentsAdaptorTrampoline)),