OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 4493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4504 } | 4504 } |
4505 } | 4505 } |
4506 | 4506 |
4507 // Return result. The argument boilerplate has been popped already. | 4507 // Return result. The argument boilerplate has been popped already. |
4508 __ Ret(); | 4508 __ Ret(); |
4509 | 4509 |
4510 // Create a new closure through the slower runtime call. | 4510 // Create a new closure through the slower runtime call. |
4511 __ bind(&gc); | 4511 __ bind(&gc); |
4512 __ push(cp); | 4512 __ push(cp); |
4513 __ push(r3); | 4513 __ push(r3); |
4514 __ TailCallRuntime(ExternalReference(Runtime::kNewClosure), 2, 1); | 4514 __ TailCallRuntime(Runtime::kNewClosure, 2, 1); |
4515 } | 4515 } |
4516 | 4516 |
4517 | 4517 |
4518 void FastNewContextStub::Generate(MacroAssembler* masm) { | 4518 void FastNewContextStub::Generate(MacroAssembler* masm) { |
4519 // Try to allocate the context in new space. | 4519 // Try to allocate the context in new space. |
4520 Label gc; | 4520 Label gc; |
4521 int length = slots_ + Context::MIN_CONTEXT_SLOTS; | 4521 int length = slots_ + Context::MIN_CONTEXT_SLOTS; |
4522 | 4522 |
4523 // Attempt to allocate the context in new space. | 4523 // Attempt to allocate the context in new space. |
4524 __ AllocateInNewSpace(length + (FixedArray::kHeaderSize / kPointerSize), | 4524 __ AllocateInNewSpace(length + (FixedArray::kHeaderSize / kPointerSize), |
(...skipping 29 matching lines...) Expand all Loading... |
4554 __ str(r1, MemOperand(r0, Context::SlotOffset(i))); | 4554 __ str(r1, MemOperand(r0, Context::SlotOffset(i))); |
4555 } | 4555 } |
4556 | 4556 |
4557 // Remove the on-stack argument and return. | 4557 // Remove the on-stack argument and return. |
4558 __ mov(cp, r0); | 4558 __ mov(cp, r0); |
4559 __ pop(); | 4559 __ pop(); |
4560 __ Ret(); | 4560 __ Ret(); |
4561 | 4561 |
4562 // Need to collect. Call into runtime system. | 4562 // Need to collect. Call into runtime system. |
4563 __ bind(&gc); | 4563 __ bind(&gc); |
4564 __ TailCallRuntime(ExternalReference(Runtime::kNewContext), 1, 1); | 4564 __ TailCallRuntime(Runtime::kNewContext, 1, 1); |
4565 } | 4565 } |
4566 | 4566 |
4567 | 4567 |
4568 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { | 4568 void FastCloneShallowArrayStub::Generate(MacroAssembler* masm) { |
4569 // Stack layout on entry: | 4569 // Stack layout on entry: |
4570 // | 4570 // |
4571 // [sp]: constant elements. | 4571 // [sp]: constant elements. |
4572 // [sp + kPointerSize]: literal index. | 4572 // [sp + kPointerSize]: literal index. |
4573 // [sp + (2 * kPointerSize)]: literals array. | 4573 // [sp + (2 * kPointerSize)]: literals array. |
4574 | 4574 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4616 __ ldr(r1, FieldMemOperand(r3, i)); | 4616 __ ldr(r1, FieldMemOperand(r3, i)); |
4617 __ str(r1, FieldMemOperand(r2, i)); | 4617 __ str(r1, FieldMemOperand(r2, i)); |
4618 } | 4618 } |
4619 } | 4619 } |
4620 | 4620 |
4621 // Return and remove the on-stack parameters. | 4621 // Return and remove the on-stack parameters. |
4622 __ add(sp, sp, Operand(3 * kPointerSize)); | 4622 __ add(sp, sp, Operand(3 * kPointerSize)); |
4623 __ Ret(); | 4623 __ Ret(); |
4624 | 4624 |
4625 __ bind(&slow_case); | 4625 __ bind(&slow_case); |
4626 ExternalReference runtime(Runtime::kCreateArrayLiteralShallow); | 4626 __ TailCallRuntime(Runtime::kCreateArrayLiteralShallow, 3, 1); |
4627 __ TailCallRuntime(runtime, 3, 1); | |
4628 } | 4627 } |
4629 | 4628 |
4630 | 4629 |
4631 // Count leading zeros in a 32 bit word. On ARM5 and later it uses the clz | 4630 // Count leading zeros in a 32 bit word. On ARM5 and later it uses the clz |
4632 // instruction. On pre-ARM5 hardware this routine gives the wrong answer for 0 | 4631 // instruction. On pre-ARM5 hardware this routine gives the wrong answer for 0 |
4633 // (31 instead of 32). | 4632 // (31 instead of 32). |
4634 static void CountLeadingZeros( | 4633 static void CountLeadingZeros( |
4635 MacroAssembler* masm, | 4634 MacroAssembler* masm, |
4636 Register source, | 4635 Register source, |
4637 Register scratch, | 4636 Register scratch, |
(...skipping 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6190 // This code should be unreachable. | 6189 // This code should be unreachable. |
6191 __ stop("Unreachable"); | 6190 __ stop("Unreachable"); |
6192 } | 6191 } |
6193 | 6192 |
6194 | 6193 |
6195 void StackCheckStub::Generate(MacroAssembler* masm) { | 6194 void StackCheckStub::Generate(MacroAssembler* masm) { |
6196 // Do tail-call to runtime routine. Runtime routines expect at least one | 6195 // Do tail-call to runtime routine. Runtime routines expect at least one |
6197 // argument, so give it a Smi. | 6196 // argument, so give it a Smi. |
6198 __ mov(r0, Operand(Smi::FromInt(0))); | 6197 __ mov(r0, Operand(Smi::FromInt(0))); |
6199 __ push(r0); | 6198 __ push(r0); |
6200 __ TailCallRuntime(ExternalReference(Runtime::kStackGuard), 1, 1); | 6199 __ TailCallRuntime(Runtime::kStackGuard, 1, 1); |
6201 | 6200 |
6202 __ StubReturn(1); | 6201 __ StubReturn(1); |
6203 } | 6202 } |
6204 | 6203 |
6205 | 6204 |
6206 void GenericUnaryOpStub::Generate(MacroAssembler* masm) { | 6205 void GenericUnaryOpStub::Generate(MacroAssembler* masm) { |
6207 Label slow, done; | 6206 Label slow, done; |
6208 | 6207 |
6209 if (op_ == Token::SUB) { | 6208 if (op_ == Token::SUB) { |
6210 // Check whether the value is a smi. | 6209 // Check whether the value is a smi. |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6799 // Read the argument from the adaptor frame and return it. | 6798 // Read the argument from the adaptor frame and return it. |
6800 __ sub(r3, r0, r1); | 6799 __ sub(r3, r0, r1); |
6801 __ add(r3, r2, Operand(r3, LSL, kPointerSizeLog2 - kSmiTagSize)); | 6800 __ add(r3, r2, Operand(r3, LSL, kPointerSizeLog2 - kSmiTagSize)); |
6802 __ ldr(r0, MemOperand(r3, kDisplacement)); | 6801 __ ldr(r0, MemOperand(r3, kDisplacement)); |
6803 __ Jump(lr); | 6802 __ Jump(lr); |
6804 | 6803 |
6805 // Slow-case: Handle non-smi or out-of-bounds access to arguments | 6804 // Slow-case: Handle non-smi or out-of-bounds access to arguments |
6806 // by calling the runtime system. | 6805 // by calling the runtime system. |
6807 __ bind(&slow); | 6806 __ bind(&slow); |
6808 __ push(r1); | 6807 __ push(r1); |
6809 __ TailCallRuntime(ExternalReference(Runtime::kGetArgumentsProperty), 1, 1); | 6808 __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); |
6810 } | 6809 } |
6811 | 6810 |
6812 | 6811 |
6813 void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) { | 6812 void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) { |
6814 // sp[0] : number of parameters | 6813 // sp[0] : number of parameters |
6815 // sp[4] : receiver displacement | 6814 // sp[4] : receiver displacement |
6816 // sp[8] : function | 6815 // sp[8] : function |
6817 | 6816 |
6818 // Check if the calling frame is an arguments adaptor frame. | 6817 // Check if the calling frame is an arguments adaptor frame. |
6819 Label adaptor_frame, try_allocate, runtime; | 6818 Label adaptor_frame, try_allocate, runtime; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6902 __ cmp(r1, Operand(0)); | 6901 __ cmp(r1, Operand(0)); |
6903 __ b(ne, &loop); | 6902 __ b(ne, &loop); |
6904 | 6903 |
6905 // Return and remove the on-stack parameters. | 6904 // Return and remove the on-stack parameters. |
6906 __ bind(&done); | 6905 __ bind(&done); |
6907 __ add(sp, sp, Operand(3 * kPointerSize)); | 6906 __ add(sp, sp, Operand(3 * kPointerSize)); |
6908 __ Ret(); | 6907 __ Ret(); |
6909 | 6908 |
6910 // Do the runtime call to allocate the arguments object. | 6909 // Do the runtime call to allocate the arguments object. |
6911 __ bind(&runtime); | 6910 __ bind(&runtime); |
6912 __ TailCallRuntime(ExternalReference(Runtime::kNewArgumentsFast), 3, 1); | 6911 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); |
6913 } | 6912 } |
6914 | 6913 |
6915 | 6914 |
6916 void CallFunctionStub::Generate(MacroAssembler* masm) { | 6915 void CallFunctionStub::Generate(MacroAssembler* masm) { |
6917 Label slow; | 6916 Label slow; |
6918 | 6917 |
6919 // If the receiver might be a value (string, number or boolean) check for this | 6918 // If the receiver might be a value (string, number or boolean) check for this |
6920 // and box it if it is. | 6919 // and box it if it is. |
6921 if (ReceiverMightBeValue()) { | 6920 if (ReceiverMightBeValue()) { |
6922 // Get the receiver from the stack. | 6921 // Get the receiver from the stack. |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7346 // r5: first character of string to copy. | 7345 // r5: first character of string to copy. |
7347 ASSERT_EQ(0, SeqTwoByteString::kHeaderSize & kObjectAlignmentMask); | 7346 ASSERT_EQ(0, SeqTwoByteString::kHeaderSize & kObjectAlignmentMask); |
7348 GenerateCopyCharactersLong(masm, r1, r5, r2, r3, r4, r6, r7, r9, | 7347 GenerateCopyCharactersLong(masm, r1, r5, r2, r3, r4, r6, r7, r9, |
7349 DEST_ALWAYS_ALIGNED); | 7348 DEST_ALWAYS_ALIGNED); |
7350 __ IncrementCounter(&Counters::sub_string_native, 1, r3, r4); | 7349 __ IncrementCounter(&Counters::sub_string_native, 1, r3, r4); |
7351 __ add(sp, sp, Operand(3 * kPointerSize)); | 7350 __ add(sp, sp, Operand(3 * kPointerSize)); |
7352 __ Ret(); | 7351 __ Ret(); |
7353 | 7352 |
7354 // Just jump to runtime to create the sub string. | 7353 // Just jump to runtime to create the sub string. |
7355 __ bind(&runtime); | 7354 __ bind(&runtime); |
7356 __ TailCallRuntime(ExternalReference(Runtime::kSubString), 3, 1); | 7355 __ TailCallRuntime(Runtime::kSubString, 3, 1); |
7357 } | 7356 } |
7358 | 7357 |
7359 | 7358 |
7360 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, | 7359 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, |
7361 Register left, | 7360 Register left, |
7362 Register right, | 7361 Register right, |
7363 Register scratch1, | 7362 Register scratch1, |
7364 Register scratch2, | 7363 Register scratch2, |
7365 Register scratch3, | 7364 Register scratch3, |
7366 Register scratch4) { | 7365 Register scratch4) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7437 __ JumpIfNotBothSequentialAsciiStrings(r0, r1, r2, r3, &runtime); | 7436 __ JumpIfNotBothSequentialAsciiStrings(r0, r1, r2, r3, &runtime); |
7438 | 7437 |
7439 // Compare flat ascii strings natively. Remove arguments from stack first. | 7438 // Compare flat ascii strings natively. Remove arguments from stack first. |
7440 __ IncrementCounter(&Counters::string_compare_native, 1, r2, r3); | 7439 __ IncrementCounter(&Counters::string_compare_native, 1, r2, r3); |
7441 __ add(sp, sp, Operand(2 * kPointerSize)); | 7440 __ add(sp, sp, Operand(2 * kPointerSize)); |
7442 GenerateCompareFlatAsciiStrings(masm, r0, r1, r2, r3, r4, r5); | 7441 GenerateCompareFlatAsciiStrings(masm, r0, r1, r2, r3, r4, r5); |
7443 | 7442 |
7444 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 7443 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
7445 // tagged as a small integer. | 7444 // tagged as a small integer. |
7446 __ bind(&runtime); | 7445 __ bind(&runtime); |
7447 __ TailCallRuntime(ExternalReference(Runtime::kStringCompare), 2, 1); | 7446 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
7448 } | 7447 } |
7449 | 7448 |
7450 | 7449 |
7451 void StringAddStub::Generate(MacroAssembler* masm) { | 7450 void StringAddStub::Generate(MacroAssembler* masm) { |
7452 Label string_add_runtime; | 7451 Label string_add_runtime; |
7453 // Stack on entry: | 7452 // Stack on entry: |
7454 // sp[0]: second argument. | 7453 // sp[0]: second argument. |
7455 // sp[4]: first argument. | 7454 // sp[4]: first argument. |
7456 | 7455 |
7457 // Load the two arguments. | 7456 // Load the two arguments. |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7651 // r7: result string. | 7650 // r7: result string. |
7652 GenerateCopyCharacters(masm, r6, r1, r3, r4, false); | 7651 GenerateCopyCharacters(masm, r6, r1, r3, r4, false); |
7653 | 7652 |
7654 __ mov(r0, Operand(r7)); | 7653 __ mov(r0, Operand(r7)); |
7655 __ IncrementCounter(&Counters::string_add_native, 1, r2, r3); | 7654 __ IncrementCounter(&Counters::string_add_native, 1, r2, r3); |
7656 __ add(sp, sp, Operand(2 * kPointerSize)); | 7655 __ add(sp, sp, Operand(2 * kPointerSize)); |
7657 __ Ret(); | 7656 __ Ret(); |
7658 | 7657 |
7659 // Just jump to runtime to add the two strings. | 7658 // Just jump to runtime to add the two strings. |
7660 __ bind(&string_add_runtime); | 7659 __ bind(&string_add_runtime); |
7661 __ TailCallRuntime(ExternalReference(Runtime::kStringAdd), 2, 1); | 7660 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); |
7662 } | 7661 } |
7663 | 7662 |
7664 | 7663 |
7665 #undef __ | 7664 #undef __ |
7666 | 7665 |
7667 } } // namespace v8::internal | 7666 } } // namespace v8::internal |
OLD | NEW |