OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if V8_TARGET_ARCH_S390 | 5 #if V8_TARGET_ARCH_S390 |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 __ bne(slow); // First was a heap number, second wasn't. Go slow case. | 470 __ bne(slow); // First was a heap number, second wasn't. Go slow case. |
471 | 471 |
472 // Both are heap numbers. Load them up then jump to the code we have | 472 // Both are heap numbers. Load them up then jump to the code we have |
473 // for that. | 473 // for that. |
474 __ LoadDouble(d6, FieldMemOperand(rhs, HeapNumber::kValueOffset)); | 474 __ LoadDouble(d6, FieldMemOperand(rhs, HeapNumber::kValueOffset)); |
475 __ LoadDouble(d7, FieldMemOperand(lhs, HeapNumber::kValueOffset)); | 475 __ LoadDouble(d7, FieldMemOperand(lhs, HeapNumber::kValueOffset)); |
476 | 476 |
477 __ b(both_loaded_as_doubles); | 477 __ b(both_loaded_as_doubles); |
478 } | 478 } |
479 | 479 |
480 // Fast negative check for internalized-to-internalized equality. | 480 // Fast negative check for internalized-to-internalized equality or receiver |
| 481 // equality. Also handles the undetectable receiver to null/undefined |
| 482 // comparison. |
481 static void EmitCheckForInternalizedStringsOrObjects(MacroAssembler* masm, | 483 static void EmitCheckForInternalizedStringsOrObjects(MacroAssembler* masm, |
482 Register lhs, Register rhs, | 484 Register lhs, Register rhs, |
483 Label* possible_strings, | 485 Label* possible_strings, |
484 Label* runtime_call) { | 486 Label* runtime_call) { |
485 DCHECK((lhs.is(r2) && rhs.is(r3)) || (lhs.is(r3) && rhs.is(r2))); | 487 DCHECK((lhs.is(r2) && rhs.is(r3)) || (lhs.is(r3) && rhs.is(r2))); |
486 | 488 |
487 // r4 is object type of rhs. | 489 // r4 is object type of rhs. |
488 Label object_test, return_unequal, undetectable; | 490 Label object_test, return_equal, return_unequal, undetectable; |
489 STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); | 491 STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); |
490 __ mov(r0, Operand(kIsNotStringMask)); | 492 __ mov(r0, Operand(kIsNotStringMask)); |
491 __ AndP(r0, r4); | 493 __ AndP(r0, r4); |
492 __ bne(&object_test, Label::kNear); | 494 __ bne(&object_test, Label::kNear); |
493 __ mov(r0, Operand(kIsNotInternalizedMask)); | 495 __ mov(r0, Operand(kIsNotInternalizedMask)); |
494 __ AndP(r0, r4); | 496 __ AndP(r0, r4); |
495 __ bne(possible_strings); | 497 __ bne(possible_strings); |
496 __ CompareObjectType(lhs, r5, r5, FIRST_NONSTRING_TYPE); | 498 __ CompareObjectType(lhs, r5, r5, FIRST_NONSTRING_TYPE); |
497 __ bge(runtime_call); | 499 __ bge(runtime_call); |
498 __ mov(r0, Operand(kIsNotInternalizedMask)); | 500 __ mov(r0, Operand(kIsNotInternalizedMask)); |
(...skipping 20 matching lines...) Expand all Loading... |
519 __ CompareInstanceType(r5, r5, FIRST_JS_RECEIVER_TYPE); | 521 __ CompareInstanceType(r5, r5, FIRST_JS_RECEIVER_TYPE); |
520 __ blt(runtime_call); | 522 __ blt(runtime_call); |
521 | 523 |
522 __ bind(&return_unequal); | 524 __ bind(&return_unequal); |
523 // Return non-equal by returning the non-zero object pointer in r2. | 525 // Return non-equal by returning the non-zero object pointer in r2. |
524 __ Ret(); | 526 __ Ret(); |
525 | 527 |
526 __ bind(&undetectable); | 528 __ bind(&undetectable); |
527 __ AndP(r0, r7, Operand(1 << Map::kIsUndetectable)); | 529 __ AndP(r0, r7, Operand(1 << Map::kIsUndetectable)); |
528 __ beq(&return_unequal); | 530 __ beq(&return_unequal); |
| 531 |
| 532 // If both sides are JSReceivers, then the result is false according to |
| 533 // the HTML specification, which says that only comparisons with null or |
| 534 // undefined are affected by special casing for document.all. |
| 535 __ CompareInstanceType(r4, r4, ODDBALL_TYPE); |
| 536 __ beq(&return_equal); |
| 537 __ CompareInstanceType(r5, r5, ODDBALL_TYPE); |
| 538 __ bne(&return_unequal); |
| 539 |
| 540 __ bind(&return_equal); |
529 __ LoadImmP(r2, Operand(EQUAL)); | 541 __ LoadImmP(r2, Operand(EQUAL)); |
530 __ Ret(); | 542 __ Ret(); |
531 } | 543 } |
532 | 544 |
533 static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input, | 545 static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input, |
534 Register scratch, | 546 Register scratch, |
535 CompareICState::State expected, | 547 CompareICState::State expected, |
536 Label* fail) { | 548 Label* fail) { |
537 Label ok; | 549 Label ok; |
538 if (expected == CompareICState::SMI) { | 550 if (expected == CompareICState::SMI) { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 StringHelper::GenerateCompareFlatOneByteStrings(masm, lhs, rhs, r4, r5, r6); | 681 StringHelper::GenerateCompareFlatOneByteStrings(masm, lhs, rhs, r4, r5, r6); |
670 } | 682 } |
671 // Never falls through to here. | 683 // Never falls through to here. |
672 | 684 |
673 __ bind(&slow); | 685 __ bind(&slow); |
674 | 686 |
675 if (cc == eq) { | 687 if (cc == eq) { |
676 { | 688 { |
677 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 689 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
678 __ Push(lhs, rhs); | 690 __ Push(lhs, rhs); |
679 __ CallRuntime(strict() ? Runtime::kStrictEquals : Runtime::kEquals); | 691 __ CallRuntime(strict() ? Runtime::kStrictEqual : Runtime::kEqual); |
680 } | 692 } |
681 // Turn true into 0 and false into some non-zero value. | 693 // Turn true into 0 and false into some non-zero value. |
682 STATIC_ASSERT(EQUAL == 0); | 694 STATIC_ASSERT(EQUAL == 0); |
683 __ LoadRoot(r4, Heap::kTrueValueRootIndex); | 695 __ LoadRoot(r3, Heap::kTrueValueRootIndex); |
684 __ sub(r3, r3, r4); | 696 __ SubP(r2, r2, r3); |
685 __ Ret(); | 697 __ Ret(); |
686 } else { | 698 } else { |
687 __ Push(lhs, rhs); | 699 __ Push(lhs, rhs); |
688 int ncr; // NaN compare result | 700 int ncr; // NaN compare result |
689 if (cc == lt || cc == le) { | 701 if (cc == lt || cc == le) { |
690 ncr = GREATER; | 702 ncr = GREATER; |
691 } else { | 703 } else { |
692 DCHECK(cc == gt || cc == ge); // remaining cases | 704 DCHECK(cc == gt || cc == ge); // remaining cases |
693 ncr = LESS; | 705 ncr = LESS; |
694 } | 706 } |
(...skipping 2216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2911 __ bind(&loop); | 2923 __ bind(&loop); |
2912 __ LoadlB(scratch1, MemOperand(left, index)); | 2924 __ LoadlB(scratch1, MemOperand(left, index)); |
2913 __ LoadlB(r0, MemOperand(right, index)); | 2925 __ LoadlB(r0, MemOperand(right, index)); |
2914 __ CmpP(scratch1, r0); | 2926 __ CmpP(scratch1, r0); |
2915 __ bne(chars_not_equal); | 2927 __ bne(chars_not_equal); |
2916 __ AddP(index, Operand(1)); | 2928 __ AddP(index, Operand(1)); |
2917 __ CmpP(index, Operand::Zero()); | 2929 __ CmpP(index, Operand::Zero()); |
2918 __ bne(&loop); | 2930 __ bne(&loop); |
2919 } | 2931 } |
2920 | 2932 |
2921 void StringCompareStub::Generate(MacroAssembler* masm) { | |
2922 // ----------- S t a t e ------------- | |
2923 // -- r3 : left | |
2924 // -- r2 : right | |
2925 // -- r14 : return address | |
2926 // ----------------------------------- | |
2927 __ AssertString(r3); | |
2928 __ AssertString(r2); | |
2929 | |
2930 Label not_same; | |
2931 __ CmpP(r2, r3); | |
2932 __ bne(¬_same); | |
2933 __ LoadSmiLiteral(r2, Smi::FromInt(EQUAL)); | |
2934 __ IncrementCounter(isolate()->counters()->string_compare_native(), 1, r3, | |
2935 r4); | |
2936 __ Ret(); | |
2937 | |
2938 __ bind(¬_same); | |
2939 | |
2940 // Check that both objects are sequential one-byte strings. | |
2941 Label runtime; | |
2942 __ JumpIfNotBothSequentialOneByteStrings(r3, r2, r4, r5, &runtime); | |
2943 | |
2944 // Compare flat one-byte strings natively. | |
2945 __ IncrementCounter(isolate()->counters()->string_compare_native(), 1, r4, | |
2946 r5); | |
2947 StringHelper::GenerateCompareFlatOneByteStrings(masm, r3, r2, r4, r5, r6); | |
2948 | |
2949 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | |
2950 // tagged as a small integer. | |
2951 __ bind(&runtime); | |
2952 __ Push(r3, r2); | |
2953 __ TailCallRuntime(Runtime::kStringCompare); | |
2954 } | |
2955 | |
2956 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { | 2933 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { |
2957 // ----------- S t a t e ------------- | 2934 // ----------- S t a t e ------------- |
2958 // -- r3 : left | 2935 // -- r3 : left |
2959 // -- r2 : right | 2936 // -- r2 : right |
2960 // r3: second string | 2937 // r3: second string |
2961 // ----------------------------------- | 2938 // ----------------------------------- |
2962 | 2939 |
2963 // Load r4 with the allocation site. We stick an undefined dummy value here | 2940 // Load r4 with the allocation site. We stick an undefined dummy value here |
2964 // and replace it with the real allocation site later when we instantiate this | 2941 // and replace it with the real allocation site later when we instantiate this |
2965 // stub in BinaryOpICWithAllocationSiteStub::GetCodeCopyFromTemplate(). | 2942 // stub in BinaryOpICWithAllocationSiteStub::GetCodeCopyFromTemplate(). |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3248 if (equality) { | 3225 if (equality) { |
3249 StringHelper::GenerateFlatOneByteStringEquals(masm, left, right, tmp1, | 3226 StringHelper::GenerateFlatOneByteStringEquals(masm, left, right, tmp1, |
3250 tmp2); | 3227 tmp2); |
3251 } else { | 3228 } else { |
3252 StringHelper::GenerateCompareFlatOneByteStrings(masm, left, right, tmp1, | 3229 StringHelper::GenerateCompareFlatOneByteStrings(masm, left, right, tmp1, |
3253 tmp2, tmp3); | 3230 tmp2, tmp3); |
3254 } | 3231 } |
3255 | 3232 |
3256 // Handle more complex cases in runtime. | 3233 // Handle more complex cases in runtime. |
3257 __ bind(&runtime); | 3234 __ bind(&runtime); |
3258 __ Push(left, right); | |
3259 if (equality) { | 3235 if (equality) { |
3260 __ TailCallRuntime(Runtime::kStringEquals); | 3236 { |
| 3237 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| 3238 __ Push(left, right); |
| 3239 __ CallRuntime(Runtime::kStringEqual); |
| 3240 } |
| 3241 __ LoadRoot(r3, Heap::kTrueValueRootIndex); |
| 3242 __ SubP(r2, r2, r3); |
| 3243 __ Ret(); |
3261 } else { | 3244 } else { |
| 3245 __ Push(left, right); |
3262 __ TailCallRuntime(Runtime::kStringCompare); | 3246 __ TailCallRuntime(Runtime::kStringCompare); |
3263 } | 3247 } |
3264 | 3248 |
3265 __ bind(&miss); | 3249 __ bind(&miss); |
3266 GenerateMiss(masm); | 3250 GenerateMiss(masm); |
3267 } | 3251 } |
3268 | 3252 |
3269 void CompareICStub::GenerateReceivers(MacroAssembler* masm) { | 3253 void CompareICStub::GenerateReceivers(MacroAssembler* masm) { |
3270 DCHECK_EQ(CompareICState::RECEIVER, state()); | 3254 DCHECK_EQ(CompareICState::RECEIVER, state()); |
3271 Label miss; | 3255 Label miss; |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3775 | 3759 |
3776 __ bind(&need_incremental); | 3760 __ bind(&need_incremental); |
3777 | 3761 |
3778 // Fall through when we need to inform the incremental marker. | 3762 // Fall through when we need to inform the incremental marker. |
3779 } | 3763 } |
3780 | 3764 |
3781 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { | 3765 void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { |
3782 CEntryStub ces(isolate(), 1, kSaveFPRegs); | 3766 CEntryStub ces(isolate(), 1, kSaveFPRegs); |
3783 __ Call(ces.GetCode(), RelocInfo::CODE_TARGET); | 3767 __ Call(ces.GetCode(), RelocInfo::CODE_TARGET); |
3784 int parameter_count_offset = | 3768 int parameter_count_offset = |
3785 StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset; | 3769 StubFailureTrampolineFrameConstants::kArgumentsLengthOffset; |
3786 __ LoadP(r3, MemOperand(fp, parameter_count_offset)); | 3770 __ LoadP(r3, MemOperand(fp, parameter_count_offset)); |
3787 if (function_mode() == JS_FUNCTION_STUB_MODE) { | 3771 if (function_mode() == JS_FUNCTION_STUB_MODE) { |
3788 __ AddP(r3, Operand(1)); | 3772 __ AddP(r3, Operand(1)); |
3789 } | 3773 } |
3790 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); | 3774 masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE); |
3791 __ ShiftLeftP(r3, r3, Operand(kPointerSizeLog2)); | 3775 __ ShiftLeftP(r3, r3, Operand(kPointerSizeLog2)); |
3792 __ la(sp, MemOperand(r3, sp)); | 3776 __ la(sp, MemOperand(r3, sp)); |
3793 __ Ret(); | 3777 __ Ret(); |
3794 } | 3778 } |
3795 | 3779 |
(...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4767 // we reach the JavaScript frame for the function (similar to what the | 4751 // we reach the JavaScript frame for the function (similar to what the |
4768 // runtime fallback implementation does). So make r4 point to that | 4752 // runtime fallback implementation does). So make r4 point to that |
4769 // JavaScript frame. | 4753 // JavaScript frame. |
4770 { | 4754 { |
4771 Label loop, loop_entry; | 4755 Label loop, loop_entry; |
4772 __ LoadRR(r4, fp); | 4756 __ LoadRR(r4, fp); |
4773 __ b(&loop_entry); | 4757 __ b(&loop_entry); |
4774 __ bind(&loop); | 4758 __ bind(&loop); |
4775 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); | 4759 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); |
4776 __ bind(&loop_entry); | 4760 __ bind(&loop_entry); |
4777 __ LoadP(ip, MemOperand(r4, StandardFrameConstants::kMarkerOffset)); | 4761 __ LoadP(ip, MemOperand(r4, StandardFrameConstants::kFunctionOffset)); |
4778 __ CmpP(ip, r3); | 4762 __ CmpP(ip, r3); |
4779 __ bne(&loop); | 4763 __ bne(&loop); |
4780 } | 4764 } |
4781 | 4765 |
4782 // Check if we have rest parameters (only possible if we have an | 4766 // Check if we have rest parameters (only possible if we have an |
4783 // arguments adaptor frame below the function frame). | 4767 // arguments adaptor frame below the function frame). |
4784 Label no_rest_parameters; | 4768 Label no_rest_parameters; |
4785 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); | 4769 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); |
4786 __ LoadP(ip, MemOperand(r4, StandardFrameConstants::kContextOffset)); | 4770 __ LoadP(ip, MemOperand(r4, CommonFrameConstants::kContextOrFrameTypeOffset)); |
4787 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); | 4771 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); |
4788 __ bne(&no_rest_parameters); | 4772 __ bne(&no_rest_parameters); |
4789 | 4773 |
4790 // Check if the arguments adaptor frame contains more arguments than | 4774 // Check if the arguments adaptor frame contains more arguments than |
4791 // specified by the function's internal formal parameter count. | 4775 // specified by the function's internal formal parameter count. |
4792 Label rest_parameters; | 4776 Label rest_parameters; |
4793 __ LoadP(r2, MemOperand(r4, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 4777 __ LoadP(r2, MemOperand(r4, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
4794 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); | 4778 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); |
4795 __ LoadW( | 4779 __ LoadW( |
4796 r3, FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); | 4780 r3, FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4924 // r3 : function | 4908 // r3 : function |
4925 // r4 : number of parameters (tagged) | 4909 // r4 : number of parameters (tagged) |
4926 // r5 : parameters pointer | 4910 // r5 : parameters pointer |
4927 // Registers used over whole function: | 4911 // Registers used over whole function: |
4928 // r7 : arguments count (tagged) | 4912 // r7 : arguments count (tagged) |
4929 // r8 : mapped parameter count (tagged) | 4913 // r8 : mapped parameter count (tagged) |
4930 | 4914 |
4931 // Check if the calling frame is an arguments adaptor frame. | 4915 // Check if the calling frame is an arguments adaptor frame. |
4932 Label adaptor_frame, try_allocate, runtime; | 4916 Label adaptor_frame, try_allocate, runtime; |
4933 __ LoadP(r6, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 4917 __ LoadP(r6, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
4934 __ LoadP(r2, MemOperand(r6, StandardFrameConstants::kContextOffset)); | 4918 __ LoadP(r2, MemOperand(r6, CommonFrameConstants::kContextOrFrameTypeOffset)); |
4935 __ CmpSmiLiteral(r2, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); | 4919 __ CmpSmiLiteral(r2, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); |
4936 __ beq(&adaptor_frame); | 4920 __ beq(&adaptor_frame); |
4937 | 4921 |
4938 // No adaptor, parameter count = argument count. | 4922 // No adaptor, parameter count = argument count. |
4939 __ LoadRR(r7, r4); | 4923 __ LoadRR(r7, r4); |
4940 __ LoadRR(r8, r4); | 4924 __ LoadRR(r8, r4); |
4941 __ b(&try_allocate); | 4925 __ b(&try_allocate); |
4942 | 4926 |
4943 // We have an adaptor frame. Patch the parameters pointer. | 4927 // We have an adaptor frame. Patch the parameters pointer. |
4944 __ bind(&adaptor_frame); | 4928 __ bind(&adaptor_frame); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5151 // we reach the JavaScript frame for the function (similar to what the | 5135 // we reach the JavaScript frame for the function (similar to what the |
5152 // runtime fallback implementation does). So make r4 point to that | 5136 // runtime fallback implementation does). So make r4 point to that |
5153 // JavaScript frame. | 5137 // JavaScript frame. |
5154 { | 5138 { |
5155 Label loop, loop_entry; | 5139 Label loop, loop_entry; |
5156 __ LoadRR(r4, fp); | 5140 __ LoadRR(r4, fp); |
5157 __ b(&loop_entry); | 5141 __ b(&loop_entry); |
5158 __ bind(&loop); | 5142 __ bind(&loop); |
5159 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); | 5143 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); |
5160 __ bind(&loop_entry); | 5144 __ bind(&loop_entry); |
5161 __ LoadP(ip, MemOperand(r4, StandardFrameConstants::kMarkerOffset)); | 5145 __ LoadP(ip, MemOperand(r4, StandardFrameConstants::kFunctionOffset)); |
5162 __ CmpP(ip, r3); | 5146 __ CmpP(ip, r3); |
5163 __ bne(&loop); | 5147 __ bne(&loop); |
5164 } | 5148 } |
5165 | 5149 |
5166 // Check if we have an arguments adaptor frame below the function frame. | 5150 // Check if we have an arguments adaptor frame below the function frame. |
5167 Label arguments_adaptor, arguments_done; | 5151 Label arguments_adaptor, arguments_done; |
5168 __ LoadP(r5, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); | 5152 __ LoadP(r5, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); |
5169 __ LoadP(ip, MemOperand(r5, StandardFrameConstants::kContextOffset)); | 5153 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset)); |
5170 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); | 5154 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); |
5171 __ beq(&arguments_adaptor); | 5155 __ beq(&arguments_adaptor); |
5172 { | 5156 { |
5173 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); | 5157 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); |
5174 __ LoadW(r2, FieldMemOperand( | 5158 __ LoadW(r2, FieldMemOperand( |
5175 r3, SharedFunctionInfo::kFormalParameterCountOffset)); | 5159 r3, SharedFunctionInfo::kFormalParameterCountOffset)); |
5176 #if V8_TARGET_ARCH_S390X | 5160 #if V8_TARGET_ARCH_S390X |
5177 __ SmiTag(r2); | 5161 __ SmiTag(r2); |
5178 #endif | 5162 #endif |
5179 __ SmiToPtrArrayOffset(r8, r2); | 5163 __ SmiToPtrArrayOffset(r8, r2); |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5570 STATIC_ASSERT(FCA::kCalleeIndex == 5); | 5554 STATIC_ASSERT(FCA::kCalleeIndex == 5); |
5571 STATIC_ASSERT(FCA::kDataIndex == 4); | 5555 STATIC_ASSERT(FCA::kDataIndex == 4); |
5572 STATIC_ASSERT(FCA::kReturnValueOffset == 3); | 5556 STATIC_ASSERT(FCA::kReturnValueOffset == 3); |
5573 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); | 5557 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); |
5574 STATIC_ASSERT(FCA::kIsolateIndex == 1); | 5558 STATIC_ASSERT(FCA::kIsolateIndex == 1); |
5575 STATIC_ASSERT(FCA::kHolderIndex == 0); | 5559 STATIC_ASSERT(FCA::kHolderIndex == 0); |
5576 STATIC_ASSERT(FCA::kArgsLength == 7); | 5560 STATIC_ASSERT(FCA::kArgsLength == 7); |
5577 | 5561 |
5578 // context save | 5562 // context save |
5579 __ push(context); | 5563 __ push(context); |
5580 if (!is_lazy) { | 5564 if (!is_lazy()) { |
5581 // load context from callee | 5565 // load context from callee |
5582 __ LoadP(context, FieldMemOperand(callee, JSFunction::kContextOffset)); | 5566 __ LoadP(context, FieldMemOperand(callee, JSFunction::kContextOffset)); |
5583 } | 5567 } |
5584 | 5568 |
5585 // callee | 5569 // callee |
5586 __ push(callee); | 5570 __ push(callee); |
5587 | 5571 |
5588 // call data | 5572 // call data |
5589 __ push(call_data); | 5573 __ push(call_data); |
5590 | 5574 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5726 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 5710 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
5727 kStackUnwindSpace, NULL, return_value_operand, NULL); | 5711 kStackUnwindSpace, NULL, return_value_operand, NULL); |
5728 } | 5712 } |
5729 | 5713 |
5730 #undef __ | 5714 #undef __ |
5731 | 5715 |
5732 } // namespace internal | 5716 } // namespace internal |
5733 } // namespace v8 | 5717 } // namespace v8 |
5734 | 5718 |
5735 #endif // V8_TARGET_ARCH_S390 | 5719 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |