| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_MIPS | 5 #if V8_TARGET_ARCH_MIPS |
| 6 | 6 |
| 7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
| 8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 150 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 151 // -- sp[argc * 4] : receiver | 151 // -- sp[argc * 4] : receiver |
| 152 // ----------------------------------- | 152 // ----------------------------------- |
| 153 | 153 |
| 154 // 1. Load the first argument into a0 and get rid of the rest (including the | 154 // 1. Load the first argument into a0 and get rid of the rest (including the |
| 155 // receiver). | 155 // receiver). |
| 156 Label no_arguments; | 156 Label no_arguments; |
| 157 { | 157 { |
| 158 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 158 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
| 159 __ Subu(a0, a0, Operand(1)); | 159 __ Subu(a0, a0, Operand(1)); |
| 160 __ sll(a0, a0, kPointerSizeLog2); | 160 __ Lsa(sp, sp, a0, kPointerSizeLog2); |
| 161 __ Addu(sp, a0, sp); | |
| 162 __ lw(a0, MemOperand(sp)); | 161 __ lw(a0, MemOperand(sp)); |
| 163 __ Drop(2); | 162 __ Drop(2); |
| 164 } | 163 } |
| 165 | 164 |
| 166 // 2a. Convert first argument to number. | 165 // 2a. Convert first argument to number. |
| 167 ToNumberStub stub(masm->isolate()); | 166 ToNumberStub stub(masm->isolate()); |
| 168 __ TailCallStub(&stub); | 167 __ TailCallStub(&stub); |
| 169 | 168 |
| 170 // 2b. No arguments, return +0. | 169 // 2b. No arguments, return +0. |
| 171 __ bind(&no_arguments); | 170 __ bind(&no_arguments); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 187 | 186 |
| 188 // 1. Make sure we operate in the context of the called function. | 187 // 1. Make sure we operate in the context of the called function. |
| 189 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 188 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 190 | 189 |
| 191 // 2. Load the first argument into a0 and get rid of the rest (including the | 190 // 2. Load the first argument into a0 and get rid of the rest (including the |
| 192 // receiver). | 191 // receiver). |
| 193 { | 192 { |
| 194 Label no_arguments, done; | 193 Label no_arguments, done; |
| 195 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 194 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
| 196 __ Subu(a0, a0, Operand(1)); | 195 __ Subu(a0, a0, Operand(1)); |
| 197 __ sll(a0, a0, kPointerSizeLog2); | 196 __ Lsa(sp, sp, a0, kPointerSizeLog2); |
| 198 __ Addu(sp, a0, sp); | |
| 199 __ lw(a0, MemOperand(sp)); | 197 __ lw(a0, MemOperand(sp)); |
| 200 __ Drop(2); | 198 __ Drop(2); |
| 201 __ jmp(&done); | 199 __ jmp(&done); |
| 202 __ bind(&no_arguments); | 200 __ bind(&no_arguments); |
| 203 __ Move(a0, Smi::FromInt(0)); | 201 __ Move(a0, Smi::FromInt(0)); |
| 204 __ Drop(1); | 202 __ Drop(1); |
| 205 __ bind(&done); | 203 __ bind(&done); |
| 206 } | 204 } |
| 207 | 205 |
| 208 // 3. Make sure a0 is a number. | 206 // 3. Make sure a0 is a number. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 250 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 253 // -- sp[argc * 4] : receiver | 251 // -- sp[argc * 4] : receiver |
| 254 // ----------------------------------- | 252 // ----------------------------------- |
| 255 | 253 |
| 256 // 1. Load the first argument into a0 and get rid of the rest (including the | 254 // 1. Load the first argument into a0 and get rid of the rest (including the |
| 257 // receiver). | 255 // receiver). |
| 258 Label no_arguments; | 256 Label no_arguments; |
| 259 { | 257 { |
| 260 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 258 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
| 261 __ Subu(a0, a0, Operand(1)); | 259 __ Subu(a0, a0, Operand(1)); |
| 262 __ sll(a0, a0, kPointerSizeLog2); | 260 __ Lsa(sp, sp, a0, kPointerSizeLog2); |
| 263 __ Addu(sp, a0, sp); | |
| 264 __ lw(a0, MemOperand(sp)); | 261 __ lw(a0, MemOperand(sp)); |
| 265 __ Drop(2); | 262 __ Drop(2); |
| 266 } | 263 } |
| 267 | 264 |
| 268 // 2a. At least one argument, return a0 if it's a string, otherwise | 265 // 2a. At least one argument, return a0 if it's a string, otherwise |
| 269 // dispatch to appropriate conversion. | 266 // dispatch to appropriate conversion. |
| 270 Label to_string, symbol_descriptive_string; | 267 Label to_string, symbol_descriptive_string; |
| 271 { | 268 { |
| 272 __ JumpIfSmi(a0, &to_string); | 269 __ JumpIfSmi(a0, &to_string); |
| 273 __ GetObjectType(a0, a1, a1); | 270 __ GetObjectType(a0, a1, a1); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 | 312 |
| 316 // 1. Make sure we operate in the context of the called function. | 313 // 1. Make sure we operate in the context of the called function. |
| 317 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 314 __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 318 | 315 |
| 319 // 2. Load the first argument into a0 and get rid of the rest (including the | 316 // 2. Load the first argument into a0 and get rid of the rest (including the |
| 320 // receiver). | 317 // receiver). |
| 321 { | 318 { |
| 322 Label no_arguments, done; | 319 Label no_arguments, done; |
| 323 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 320 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
| 324 __ Subu(a0, a0, Operand(1)); | 321 __ Subu(a0, a0, Operand(1)); |
| 325 __ sll(a0, a0, kPointerSizeLog2); | 322 __ Lsa(sp, sp, a0, kPointerSizeLog2); |
| 326 __ Addu(sp, a0, sp); | |
| 327 __ lw(a0, MemOperand(sp)); | 323 __ lw(a0, MemOperand(sp)); |
| 328 __ Drop(2); | 324 __ Drop(2); |
| 329 __ jmp(&done); | 325 __ jmp(&done); |
| 330 __ bind(&no_arguments); | 326 __ bind(&no_arguments); |
| 331 __ LoadRoot(a0, Heap::kempty_stringRootIndex); | 327 __ LoadRoot(a0, Heap::kempty_stringRootIndex); |
| 332 __ Drop(1); | 328 __ Drop(1); |
| 333 __ bind(&done); | 329 __ bind(&done); |
| 334 } | 330 } |
| 335 | 331 |
| 336 // 3. Make sure a0 is a string. | 332 // 3. Make sure a0 is a string. |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 // a2: address of last argument (caller sp) | 607 // a2: address of last argument (caller sp) |
| 612 // a3: new target | 608 // a3: new target |
| 613 // t4: number of arguments (smi-tagged) | 609 // t4: number of arguments (smi-tagged) |
| 614 // sp[0]: receiver | 610 // sp[0]: receiver |
| 615 // sp[1]: receiver | 611 // sp[1]: receiver |
| 616 // sp[2]: number of arguments (smi-tagged) | 612 // sp[2]: number of arguments (smi-tagged) |
| 617 Label loop, entry; | 613 Label loop, entry; |
| 618 __ SmiTag(t4, a0); | 614 __ SmiTag(t4, a0); |
| 619 __ jmp(&entry); | 615 __ jmp(&entry); |
| 620 __ bind(&loop); | 616 __ bind(&loop); |
| 621 __ sll(t0, t4, kPointerSizeLog2 - kSmiTagSize); | 617 __ Lsa(t0, a2, t4, kPointerSizeLog2 - kSmiTagSize); |
| 622 __ Addu(t0, a2, Operand(t0)); | |
| 623 __ lw(t1, MemOperand(t0)); | 618 __ lw(t1, MemOperand(t0)); |
| 624 __ push(t1); | 619 __ push(t1); |
| 625 __ bind(&entry); | 620 __ bind(&entry); |
| 626 __ Addu(t4, t4, Operand(-2)); | 621 __ Addu(t4, t4, Operand(-2)); |
| 627 __ Branch(&loop, greater_equal, t4, Operand(zero_reg)); | 622 __ Branch(&loop, greater_equal, t4, Operand(zero_reg)); |
| 628 | 623 |
| 629 // Call the function. | 624 // Call the function. |
| 630 // a0: number of arguments | 625 // a0: number of arguments |
| 631 // a1: constructor function | 626 // a1: constructor function |
| 632 // a3: new target | 627 // a3: new target |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 691 if (check_derived_construct) { | 686 if (check_derived_construct) { |
| 692 Label dont_throw; | 687 Label dont_throw; |
| 693 __ JumpIfNotSmi(v0, &dont_throw); | 688 __ JumpIfNotSmi(v0, &dont_throw); |
| 694 { | 689 { |
| 695 FrameScope scope(masm, StackFrame::INTERNAL); | 690 FrameScope scope(masm, StackFrame::INTERNAL); |
| 696 __ CallRuntime(Runtime::kThrowDerivedConstructorReturnedNonObject); | 691 __ CallRuntime(Runtime::kThrowDerivedConstructorReturnedNonObject); |
| 697 } | 692 } |
| 698 __ bind(&dont_throw); | 693 __ bind(&dont_throw); |
| 699 } | 694 } |
| 700 | 695 |
| 701 __ sll(t0, a1, kPointerSizeLog2 - 1); | 696 __ Lsa(sp, sp, a1, kPointerSizeLog2 - 1); |
| 702 __ Addu(sp, sp, t0); | |
| 703 __ Addu(sp, sp, kPointerSize); | 697 __ Addu(sp, sp, kPointerSize); |
| 704 if (create_implicit_receiver) { | 698 if (create_implicit_receiver) { |
| 705 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2); | 699 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2); |
| 706 } | 700 } |
| 707 __ Ret(); | 701 __ Ret(); |
| 708 } | 702 } |
| 709 | 703 |
| 710 | 704 |
| 711 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { | 705 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
| 712 Generate_JSConstructStubHelper(masm, false, true, false); | 706 Generate_JSConstructStubHelper(masm, false, true, false); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 // Clobbers a2. | 794 // Clobbers a2. |
| 801 Generate_CheckStackOverflow(masm, a3, kArgcIsUntaggedInt); | 795 Generate_CheckStackOverflow(masm, a3, kArgcIsUntaggedInt); |
| 802 | 796 |
| 803 // Remember new.target. | 797 // Remember new.target. |
| 804 __ mov(t1, a0); | 798 __ mov(t1, a0); |
| 805 | 799 |
| 806 // Copy arguments to the stack in a loop. | 800 // Copy arguments to the stack in a loop. |
| 807 // a3: argc | 801 // a3: argc |
| 808 // s0: argv, i.e. points to first arg | 802 // s0: argv, i.e. points to first arg |
| 809 Label loop, entry; | 803 Label loop, entry; |
| 810 __ sll(t0, a3, kPointerSizeLog2); | 804 __ Lsa(t2, s0, a3, kPointerSizeLog2); |
| 811 __ addu(t2, s0, t0); | |
| 812 __ b(&entry); | 805 __ b(&entry); |
| 813 __ nop(); // Branch delay slot nop. | 806 __ nop(); // Branch delay slot nop. |
| 814 // t2 points past last arg. | 807 // t2 points past last arg. |
| 815 __ bind(&loop); | 808 __ bind(&loop); |
| 816 __ lw(t0, MemOperand(s0)); // Read next parameter. | 809 __ lw(t0, MemOperand(s0)); // Read next parameter. |
| 817 __ addiu(s0, s0, kPointerSize); | 810 __ addiu(s0, s0, kPointerSize); |
| 818 __ lw(t0, MemOperand(t0)); // Dereference handle. | 811 __ lw(t0, MemOperand(t0)); // Dereference handle. |
| 819 __ push(t0); // Push parameter. | 812 __ push(t0); // Push parameter. |
| 820 __ bind(&entry); | 813 __ bind(&entry); |
| 821 __ Branch(&loop, ne, s0, Operand(t2)); | 814 __ Branch(&loop, ne, s0, Operand(t2)); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); | 951 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
| 959 __ LoadRoot(kInterpreterDispatchTableRegister, | 952 __ LoadRoot(kInterpreterDispatchTableRegister, |
| 960 Heap::kInterpreterTableRootIndex); | 953 Heap::kInterpreterTableRootIndex); |
| 961 __ Addu(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, | 954 __ Addu(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, |
| 962 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 955 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| 963 | 956 |
| 964 // Dispatch to the first bytecode handler for the function. | 957 // Dispatch to the first bytecode handler for the function. |
| 965 __ Addu(a0, kInterpreterBytecodeArrayRegister, | 958 __ Addu(a0, kInterpreterBytecodeArrayRegister, |
| 966 kInterpreterBytecodeOffsetRegister); | 959 kInterpreterBytecodeOffsetRegister); |
| 967 __ lbu(a0, MemOperand(a0)); | 960 __ lbu(a0, MemOperand(a0)); |
| 968 __ sll(at, a0, kPointerSizeLog2); | 961 __ Lsa(at, kInterpreterDispatchTableRegister, a0, kPointerSizeLog2); |
| 969 __ Addu(at, kInterpreterDispatchTableRegister, at); | |
| 970 __ lw(at, MemOperand(at)); | 962 __ lw(at, MemOperand(at)); |
| 971 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging | 963 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging |
| 972 // and header removal. | 964 // and header removal. |
| 973 __ Addu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); | 965 __ Addu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 974 __ Call(at); | 966 __ Call(at); |
| 975 } | 967 } |
| 976 | 968 |
| 977 | 969 |
| 978 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { | 970 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
| 979 // TODO(rmcilroy): List of things not currently dealt with here but done in | 971 // TODO(rmcilroy): List of things not currently dealt with here but done in |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1112 __ lw(kInterpreterBytecodeOffsetRegister, | 1104 __ lw(kInterpreterBytecodeOffsetRegister, |
| 1113 MemOperand( | 1105 MemOperand( |
| 1114 kInterpreterRegisterFileRegister, | 1106 kInterpreterRegisterFileRegister, |
| 1115 InterpreterFrameConstants::kBytecodeOffsetFromRegisterPointer)); | 1107 InterpreterFrameConstants::kBytecodeOffsetFromRegisterPointer)); |
| 1116 __ SmiUntag(kInterpreterBytecodeOffsetRegister); | 1108 __ SmiUntag(kInterpreterBytecodeOffsetRegister); |
| 1117 | 1109 |
| 1118 // Dispatch to the target bytecode. | 1110 // Dispatch to the target bytecode. |
| 1119 __ Addu(a1, kInterpreterBytecodeArrayRegister, | 1111 __ Addu(a1, kInterpreterBytecodeArrayRegister, |
| 1120 kInterpreterBytecodeOffsetRegister); | 1112 kInterpreterBytecodeOffsetRegister); |
| 1121 __ lbu(a1, MemOperand(a1)); | 1113 __ lbu(a1, MemOperand(a1)); |
| 1122 __ sll(a1, a1, kPointerSizeLog2); | 1114 __ Lsa(a1, kInterpreterDispatchTableRegister, a1, kPointerSizeLog2); |
| 1123 __ Addu(a1, kInterpreterDispatchTableRegister, a1); | |
| 1124 __ lw(a1, MemOperand(a1)); | 1115 __ lw(a1, MemOperand(a1)); |
| 1125 __ Addu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1116 __ Addu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 1126 __ Jump(a1); | 1117 __ Jump(a1); |
| 1127 } | 1118 } |
| 1128 | 1119 |
| 1129 | 1120 |
| 1130 void Builtins::Generate_InterpreterNotifyDeoptimized(MacroAssembler* masm) { | 1121 void Builtins::Generate_InterpreterNotifyDeoptimized(MacroAssembler* masm) { |
| 1131 Generate_InterpreterNotifyDeoptimizedHelper(masm, Deoptimizer::EAGER); | 1122 Generate_InterpreterNotifyDeoptimizedHelper(masm, Deoptimizer::EAGER); |
| 1132 } | 1123 } |
| 1133 | 1124 |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1400 // -- sp[4 * (argc - 1)] : first argument | 1391 // -- sp[4 * (argc - 1)] : first argument |
| 1401 // -- sp[4 * argc] : receiver | 1392 // -- sp[4 * argc] : receiver |
| 1402 // ----------------------------------- | 1393 // ----------------------------------- |
| 1403 | 1394 |
| 1404 // Load the FunctionTemplateInfo. | 1395 // Load the FunctionTemplateInfo. |
| 1405 __ lw(t1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 1396 __ lw(t1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
| 1406 __ lw(t1, FieldMemOperand(t1, SharedFunctionInfo::kFunctionDataOffset)); | 1397 __ lw(t1, FieldMemOperand(t1, SharedFunctionInfo::kFunctionDataOffset)); |
| 1407 | 1398 |
| 1408 // Do the compatible receiver check. | 1399 // Do the compatible receiver check. |
| 1409 Label receiver_check_failed; | 1400 Label receiver_check_failed; |
| 1410 __ sll(at, a0, kPointerSizeLog2); | 1401 __ Lsa(t8, sp, a0, kPointerSizeLog2); |
| 1411 __ Addu(t8, sp, at); | |
| 1412 __ lw(t0, MemOperand(t8)); | 1402 __ lw(t0, MemOperand(t8)); |
| 1413 CompatibleReceiverCheck(masm, t0, t1, &receiver_check_failed); | 1403 CompatibleReceiverCheck(masm, t0, t1, &receiver_check_failed); |
| 1414 | 1404 |
| 1415 // Get the callback offset from the FunctionTemplateInfo, and jump to the | 1405 // Get the callback offset from the FunctionTemplateInfo, and jump to the |
| 1416 // beginning of the code. | 1406 // beginning of the code. |
| 1417 __ lw(t2, FieldMemOperand(t1, FunctionTemplateInfo::kCallCodeOffset)); | 1407 __ lw(t2, FieldMemOperand(t1, FunctionTemplateInfo::kCallCodeOffset)); |
| 1418 __ lw(t2, FieldMemOperand(t2, CallHandlerInfo::kFastHandlerOffset)); | 1408 __ lw(t2, FieldMemOperand(t2, CallHandlerInfo::kFastHandlerOffset)); |
| 1419 __ Addu(t2, t2, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1409 __ Addu(t2, t2, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 1420 __ Jump(t2); | 1410 __ Jump(t2); |
| 1421 | 1411 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1535 // ----------------------------------- | 1525 // ----------------------------------- |
| 1536 | 1526 |
| 1537 // 1. Load receiver into a1, argArray into a0 (if present), remove all | 1527 // 1. Load receiver into a1, argArray into a0 (if present), remove all |
| 1538 // arguments from the stack (including the receiver), and push thisArg (if | 1528 // arguments from the stack (including the receiver), and push thisArg (if |
| 1539 // present) instead. | 1529 // present) instead. |
| 1540 { | 1530 { |
| 1541 Label no_arg; | 1531 Label no_arg; |
| 1542 Register scratch = t0; | 1532 Register scratch = t0; |
| 1543 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); | 1533 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); |
| 1544 __ mov(a3, a2); | 1534 __ mov(a3, a2); |
| 1535 // Lsa() cannot be used hare as scratch value used later. |
| 1545 __ sll(scratch, a0, kPointerSizeLog2); | 1536 __ sll(scratch, a0, kPointerSizeLog2); |
| 1546 __ Addu(a0, sp, Operand(scratch)); | 1537 __ Addu(a0, sp, Operand(scratch)); |
| 1547 __ lw(a1, MemOperand(a0)); // receiver | 1538 __ lw(a1, MemOperand(a0)); // receiver |
| 1548 __ Subu(a0, a0, Operand(kPointerSize)); | 1539 __ Subu(a0, a0, Operand(kPointerSize)); |
| 1549 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1540 __ Branch(&no_arg, lt, a0, Operand(sp)); |
| 1550 __ lw(a2, MemOperand(a0)); // thisArg | 1541 __ lw(a2, MemOperand(a0)); // thisArg |
| 1551 __ Subu(a0, a0, Operand(kPointerSize)); | 1542 __ Subu(a0, a0, Operand(kPointerSize)); |
| 1552 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1543 __ Branch(&no_arg, lt, a0, Operand(sp)); |
| 1553 __ lw(a3, MemOperand(a0)); // argArray | 1544 __ lw(a3, MemOperand(a0)); // argArray |
| 1554 __ bind(&no_arg); | 1545 __ bind(&no_arg); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1605 { | 1596 { |
| 1606 Label done; | 1597 Label done; |
| 1607 __ Branch(&done, ne, a0, Operand(zero_reg)); | 1598 __ Branch(&done, ne, a0, Operand(zero_reg)); |
| 1608 __ PushRoot(Heap::kUndefinedValueRootIndex); | 1599 __ PushRoot(Heap::kUndefinedValueRootIndex); |
| 1609 __ Addu(a0, a0, Operand(1)); | 1600 __ Addu(a0, a0, Operand(1)); |
| 1610 __ bind(&done); | 1601 __ bind(&done); |
| 1611 } | 1602 } |
| 1612 | 1603 |
| 1613 // 2. Get the function to call (passed as receiver) from the stack. | 1604 // 2. Get the function to call (passed as receiver) from the stack. |
| 1614 // a0: actual number of arguments | 1605 // a0: actual number of arguments |
| 1615 __ sll(at, a0, kPointerSizeLog2); | 1606 __ Lsa(at, sp, a0, kPointerSizeLog2); |
| 1616 __ addu(at, sp, at); | |
| 1617 __ lw(a1, MemOperand(at)); | 1607 __ lw(a1, MemOperand(at)); |
| 1618 | 1608 |
| 1619 // 3. Shift arguments and return address one slot down on the stack | 1609 // 3. Shift arguments and return address one slot down on the stack |
| 1620 // (overwriting the original receiver). Adjust argument count to make | 1610 // (overwriting the original receiver). Adjust argument count to make |
| 1621 // the original first argument the new receiver. | 1611 // the original first argument the new receiver. |
| 1622 // a0: actual number of arguments | 1612 // a0: actual number of arguments |
| 1623 // a1: function | 1613 // a1: function |
| 1624 { | 1614 { |
| 1625 Label loop; | 1615 Label loop; |
| 1626 // Calculate the copy start address (destination). Copy end address is sp. | 1616 // Calculate the copy start address (destination). Copy end address is sp. |
| 1627 __ sll(at, a0, kPointerSizeLog2); | 1617 __ Lsa(a2, sp, a0, kPointerSizeLog2); |
| 1628 __ addu(a2, sp, at); | |
| 1629 | 1618 |
| 1630 __ bind(&loop); | 1619 __ bind(&loop); |
| 1631 __ lw(at, MemOperand(a2, -kPointerSize)); | 1620 __ lw(at, MemOperand(a2, -kPointerSize)); |
| 1632 __ sw(at, MemOperand(a2)); | 1621 __ sw(at, MemOperand(a2)); |
| 1633 __ Subu(a2, a2, Operand(kPointerSize)); | 1622 __ Subu(a2, a2, Operand(kPointerSize)); |
| 1634 __ Branch(&loop, ne, a2, Operand(sp)); | 1623 __ Branch(&loop, ne, a2, Operand(sp)); |
| 1635 // Adjust the actual number of arguments and remove the top element | 1624 // Adjust the actual number of arguments and remove the top element |
| 1636 // (which is a copy of the last argument). | 1625 // (which is a copy of the last argument). |
| 1637 __ Subu(a0, a0, Operand(1)); | 1626 __ Subu(a0, a0, Operand(1)); |
| 1638 __ Pop(); | 1627 __ Pop(); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1718 | 1707 |
| 1719 // 1. Load target into a1 (if present), argumentsList into a0 (if present), | 1708 // 1. Load target into a1 (if present), argumentsList into a0 (if present), |
| 1720 // new.target into a3 (if present, otherwise use target), remove all | 1709 // new.target into a3 (if present, otherwise use target), remove all |
| 1721 // arguments from the stack (including the receiver), and push thisArgument | 1710 // arguments from the stack (including the receiver), and push thisArgument |
| 1722 // (if present) instead. | 1711 // (if present) instead. |
| 1723 { | 1712 { |
| 1724 Label no_arg; | 1713 Label no_arg; |
| 1725 Register scratch = t0; | 1714 Register scratch = t0; |
| 1726 __ LoadRoot(a1, Heap::kUndefinedValueRootIndex); | 1715 __ LoadRoot(a1, Heap::kUndefinedValueRootIndex); |
| 1727 __ mov(a2, a1); | 1716 __ mov(a2, a1); |
| 1717 // Lsa() cannot be used hare as scratch value used later. |
| 1728 __ sll(scratch, a0, kPointerSizeLog2); | 1718 __ sll(scratch, a0, kPointerSizeLog2); |
| 1729 __ Addu(a0, sp, Operand(scratch)); | 1719 __ Addu(a0, sp, Operand(scratch)); |
| 1730 __ sw(a2, MemOperand(a0)); // receiver | 1720 __ sw(a2, MemOperand(a0)); // receiver |
| 1731 __ Subu(a0, a0, Operand(kPointerSize)); | 1721 __ Subu(a0, a0, Operand(kPointerSize)); |
| 1732 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1722 __ Branch(&no_arg, lt, a0, Operand(sp)); |
| 1733 __ lw(a1, MemOperand(a0)); // target | 1723 __ lw(a1, MemOperand(a0)); // target |
| 1734 __ mov(a3, a1); // new.target defaults to target | 1724 __ mov(a3, a1); // new.target defaults to target |
| 1735 __ Subu(a0, a0, Operand(kPointerSize)); | 1725 __ Subu(a0, a0, Operand(kPointerSize)); |
| 1736 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1726 __ Branch(&no_arg, lt, a0, Operand(sp)); |
| 1737 __ lw(a2, MemOperand(a0)); // argumentsList | 1727 __ lw(a2, MemOperand(a0)); // argumentsList |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1819 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { | 1809 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { |
| 1820 // ----------- S t a t e ------------- | 1810 // ----------- S t a t e ------------- |
| 1821 // -- v0 : result being passed through | 1811 // -- v0 : result being passed through |
| 1822 // ----------------------------------- | 1812 // ----------------------------------- |
| 1823 // Get the number of arguments passed (as a smi), tear down the frame and | 1813 // Get the number of arguments passed (as a smi), tear down the frame and |
| 1824 // then tear down the parameters. | 1814 // then tear down the parameters. |
| 1825 __ lw(a1, MemOperand(fp, -(StandardFrameConstants::kFixedFrameSizeFromFp + | 1815 __ lw(a1, MemOperand(fp, -(StandardFrameConstants::kFixedFrameSizeFromFp + |
| 1826 kPointerSize))); | 1816 kPointerSize))); |
| 1827 __ mov(sp, fp); | 1817 __ mov(sp, fp); |
| 1828 __ MultiPop(fp.bit() | ra.bit()); | 1818 __ MultiPop(fp.bit() | ra.bit()); |
| 1829 __ sll(t0, a1, kPointerSizeLog2 - kSmiTagSize); | 1819 __ Lsa(sp, sp, a1, kPointerSizeLog2 - kSmiTagSize); |
| 1830 __ Addu(sp, sp, t0); | |
| 1831 // Adjust for the receiver. | 1820 // Adjust for the receiver. |
| 1832 __ Addu(sp, sp, Operand(kPointerSize)); | 1821 __ Addu(sp, sp, Operand(kPointerSize)); |
| 1833 } | 1822 } |
| 1834 | 1823 |
| 1835 | 1824 |
| 1836 // static | 1825 // static |
| 1837 void Builtins::Generate_Apply(MacroAssembler* masm) { | 1826 void Builtins::Generate_Apply(MacroAssembler* masm) { |
| 1838 // ----------- S t a t e ------------- | 1827 // ----------- S t a t e ------------- |
| 1839 // -- a0 : argumentsList | 1828 // -- a0 : argumentsList |
| 1840 // -- a1 : target | 1829 // -- a1 : target |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1928 // -- a3 : new.target (checked to be constructor or undefined) | 1917 // -- a3 : new.target (checked to be constructor or undefined) |
| 1929 // -- sp[0] : thisArgument | 1918 // -- sp[0] : thisArgument |
| 1930 // ----------------------------------- | 1919 // ----------------------------------- |
| 1931 | 1920 |
| 1932 // Push arguments onto the stack (thisArgument is already on the stack). | 1921 // Push arguments onto the stack (thisArgument is already on the stack). |
| 1933 { | 1922 { |
| 1934 __ mov(t0, zero_reg); | 1923 __ mov(t0, zero_reg); |
| 1935 Label done, loop; | 1924 Label done, loop; |
| 1936 __ bind(&loop); | 1925 __ bind(&loop); |
| 1937 __ Branch(&done, eq, t0, Operand(a2)); | 1926 __ Branch(&done, eq, t0, Operand(a2)); |
| 1938 __ sll(at, t0, kPointerSizeLog2); | 1927 __ Lsa(at, a0, t0, kPointerSizeLog2); |
| 1939 __ Addu(at, a0, at); | |
| 1940 __ lw(at, FieldMemOperand(at, FixedArray::kHeaderSize)); | 1928 __ lw(at, FieldMemOperand(at, FixedArray::kHeaderSize)); |
| 1941 __ Push(at); | 1929 __ Push(at); |
| 1942 __ Addu(t0, t0, Operand(1)); | 1930 __ Addu(t0, t0, Operand(1)); |
| 1943 __ Branch(&loop); | 1931 __ Branch(&loop); |
| 1944 __ bind(&done); | 1932 __ bind(&done); |
| 1945 __ Move(a0, t0); | 1933 __ Move(a0, t0); |
| 1946 } | 1934 } |
| 1947 | 1935 |
| 1948 // Dispatch to Call or Construct depending on whether new.target is undefined. | 1936 // Dispatch to Call or Construct depending on whether new.target is undefined. |
| 1949 { | 1937 { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1992 // -- a1 : the function to call (checked to be a JSFunction) | 1980 // -- a1 : the function to call (checked to be a JSFunction) |
| 1993 // -- a2 : the shared function info. | 1981 // -- a2 : the shared function info. |
| 1994 // -- cp : the function context. | 1982 // -- cp : the function context. |
| 1995 // ----------------------------------- | 1983 // ----------------------------------- |
| 1996 | 1984 |
| 1997 if (mode == ConvertReceiverMode::kNullOrUndefined) { | 1985 if (mode == ConvertReceiverMode::kNullOrUndefined) { |
| 1998 // Patch receiver to global proxy. | 1986 // Patch receiver to global proxy. |
| 1999 __ LoadGlobalProxy(a3); | 1987 __ LoadGlobalProxy(a3); |
| 2000 } else { | 1988 } else { |
| 2001 Label convert_to_object, convert_receiver; | 1989 Label convert_to_object, convert_receiver; |
| 2002 __ sll(at, a0, kPointerSizeLog2); | 1990 __ Lsa(at, sp, a0, kPointerSizeLog2); |
| 2003 __ addu(at, sp, at); | |
| 2004 __ lw(a3, MemOperand(at)); | 1991 __ lw(a3, MemOperand(at)); |
| 2005 __ JumpIfSmi(a3, &convert_to_object); | 1992 __ JumpIfSmi(a3, &convert_to_object); |
| 2006 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | 1993 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
| 2007 __ GetObjectType(a3, t0, t0); | 1994 __ GetObjectType(a3, t0, t0); |
| 2008 __ Branch(&done_convert, hs, t0, Operand(FIRST_JS_RECEIVER_TYPE)); | 1995 __ Branch(&done_convert, hs, t0, Operand(FIRST_JS_RECEIVER_TYPE)); |
| 2009 if (mode != ConvertReceiverMode::kNotNullOrUndefined) { | 1996 if (mode != ConvertReceiverMode::kNotNullOrUndefined) { |
| 2010 Label convert_global_proxy; | 1997 Label convert_global_proxy; |
| 2011 __ JumpIfRoot(a3, Heap::kUndefinedValueRootIndex, | 1998 __ JumpIfRoot(a3, Heap::kUndefinedValueRootIndex, |
| 2012 &convert_global_proxy); | 1999 &convert_global_proxy); |
| 2013 __ JumpIfNotRoot(a3, Heap::kNullValueRootIndex, &convert_to_object); | 2000 __ JumpIfNotRoot(a3, Heap::kNullValueRootIndex, &convert_to_object); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2029 __ mov(a0, a3); | 2016 __ mov(a0, a3); |
| 2030 ToObjectStub stub(masm->isolate()); | 2017 ToObjectStub stub(masm->isolate()); |
| 2031 __ CallStub(&stub); | 2018 __ CallStub(&stub); |
| 2032 __ mov(a3, v0); | 2019 __ mov(a3, v0); |
| 2033 __ Pop(a0, a1); | 2020 __ Pop(a0, a1); |
| 2034 __ sra(a0, a0, kSmiTagSize); // Un-tag. | 2021 __ sra(a0, a0, kSmiTagSize); // Un-tag. |
| 2035 } | 2022 } |
| 2036 __ lw(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 2023 __ lw(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
| 2037 __ bind(&convert_receiver); | 2024 __ bind(&convert_receiver); |
| 2038 } | 2025 } |
| 2039 __ sll(at, a0, kPointerSizeLog2); | 2026 __ Lsa(at, sp, a0, kPointerSizeLog2); |
| 2040 __ addu(at, sp, at); | |
| 2041 __ sw(a3, MemOperand(at)); | 2027 __ sw(a3, MemOperand(at)); |
| 2042 } | 2028 } |
| 2043 __ bind(&done_convert); | 2029 __ bind(&done_convert); |
| 2044 | 2030 |
| 2045 // ----------- S t a t e ------------- | 2031 // ----------- S t a t e ------------- |
| 2046 // -- a0 : the number of arguments (not including the receiver) | 2032 // -- a0 : the number of arguments (not including the receiver) |
| 2047 // -- a1 : the function to call (checked to be a JSFunction) | 2033 // -- a1 : the function to call (checked to be a JSFunction) |
| 2048 // -- a2 : the shared function info. | 2034 // -- a2 : the shared function info. |
| 2049 // -- cp : the function context. | 2035 // -- cp : the function context. |
| 2050 // ----------------------------------- | 2036 // ----------------------------------- |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2071 void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) { | 2057 void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) { |
| 2072 // ----------- S t a t e ------------- | 2058 // ----------- S t a t e ------------- |
| 2073 // -- a0 : the number of arguments (not including the receiver) | 2059 // -- a0 : the number of arguments (not including the receiver) |
| 2074 // -- a1 : the function to call (checked to be a JSBoundFunction) | 2060 // -- a1 : the function to call (checked to be a JSBoundFunction) |
| 2075 // ----------------------------------- | 2061 // ----------------------------------- |
| 2076 __ AssertBoundFunction(a1); | 2062 __ AssertBoundFunction(a1); |
| 2077 | 2063 |
| 2078 // Patch the receiver to [[BoundThis]]. | 2064 // Patch the receiver to [[BoundThis]]. |
| 2079 { | 2065 { |
| 2080 __ lw(at, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); | 2066 __ lw(at, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); |
| 2081 __ sll(t0, a0, kPointerSizeLog2); | 2067 __ Lsa(t0, sp, a0, kPointerSizeLog2); |
| 2082 __ addu(t0, t0, sp); | |
| 2083 __ sw(at, MemOperand(t0)); | 2068 __ sw(at, MemOperand(t0)); |
| 2084 } | 2069 } |
| 2085 | 2070 |
| 2086 // Load [[BoundArguments]] into a2 and length of that into t0. | 2071 // Load [[BoundArguments]] into a2 and length of that into t0. |
| 2087 __ lw(a2, FieldMemOperand(a1, JSBoundFunction::kBoundArgumentsOffset)); | 2072 __ lw(a2, FieldMemOperand(a1, JSBoundFunction::kBoundArgumentsOffset)); |
| 2088 __ lw(t0, FieldMemOperand(a2, FixedArray::kLengthOffset)); | 2073 __ lw(t0, FieldMemOperand(a2, FixedArray::kLengthOffset)); |
| 2089 __ SmiUntag(t0); | 2074 __ SmiUntag(t0); |
| 2090 | 2075 |
| 2091 // ----------- S t a t e ------------- | 2076 // ----------- S t a t e ------------- |
| 2092 // -- a0 : the number of arguments (not including the receiver) | 2077 // -- a0 : the number of arguments (not including the receiver) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2113 } | 2098 } |
| 2114 __ bind(&done); | 2099 __ bind(&done); |
| 2115 } | 2100 } |
| 2116 | 2101 |
| 2117 // Relocate arguments down the stack. | 2102 // Relocate arguments down the stack. |
| 2118 { | 2103 { |
| 2119 Label loop, done_loop; | 2104 Label loop, done_loop; |
| 2120 __ mov(t1, zero_reg); | 2105 __ mov(t1, zero_reg); |
| 2121 __ bind(&loop); | 2106 __ bind(&loop); |
| 2122 __ Branch(&done_loop, gt, t1, Operand(a0)); | 2107 __ Branch(&done_loop, gt, t1, Operand(a0)); |
| 2123 __ sll(t2, t0, kPointerSizeLog2); | 2108 __ Lsa(t2, sp, t0, kPointerSizeLog2); |
| 2124 __ addu(t2, t2, sp); | |
| 2125 __ lw(at, MemOperand(t2)); | 2109 __ lw(at, MemOperand(t2)); |
| 2126 __ sll(t2, t1, kPointerSizeLog2); | 2110 __ Lsa(t2, sp, t1, kPointerSizeLog2); |
| 2127 __ addu(t2, t2, sp); | |
| 2128 __ sw(at, MemOperand(t2)); | 2111 __ sw(at, MemOperand(t2)); |
| 2129 __ Addu(t0, t0, Operand(1)); | 2112 __ Addu(t0, t0, Operand(1)); |
| 2130 __ Addu(t1, t1, Operand(1)); | 2113 __ Addu(t1, t1, Operand(1)); |
| 2131 __ Branch(&loop); | 2114 __ Branch(&loop); |
| 2132 __ bind(&done_loop); | 2115 __ bind(&done_loop); |
| 2133 } | 2116 } |
| 2134 | 2117 |
| 2135 // Copy [[BoundArguments]] to the stack (below the arguments). | 2118 // Copy [[BoundArguments]] to the stack (below the arguments). |
| 2136 { | 2119 { |
| 2137 Label loop, done_loop; | 2120 Label loop, done_loop; |
| 2138 __ lw(t0, FieldMemOperand(a2, FixedArray::kLengthOffset)); | 2121 __ lw(t0, FieldMemOperand(a2, FixedArray::kLengthOffset)); |
| 2139 __ SmiUntag(t0); | 2122 __ SmiUntag(t0); |
| 2140 __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 2123 __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| 2141 __ bind(&loop); | 2124 __ bind(&loop); |
| 2142 __ Subu(t0, t0, Operand(1)); | 2125 __ Subu(t0, t0, Operand(1)); |
| 2143 __ Branch(&done_loop, lt, t0, Operand(zero_reg)); | 2126 __ Branch(&done_loop, lt, t0, Operand(zero_reg)); |
| 2144 __ sll(t1, t0, kPointerSizeLog2); | 2127 __ Lsa(t1, a2, t0, kPointerSizeLog2); |
| 2145 __ addu(t1, t1, a2); | |
| 2146 __ lw(at, MemOperand(t1)); | 2128 __ lw(at, MemOperand(t1)); |
| 2147 __ sll(t1, a0, kPointerSizeLog2); | 2129 __ Lsa(t1, sp, a0, kPointerSizeLog2); |
| 2148 __ addu(t1, t1, sp); | |
| 2149 __ sw(at, MemOperand(t1)); | 2130 __ sw(at, MemOperand(t1)); |
| 2150 __ Addu(a0, a0, Operand(1)); | 2131 __ Addu(a0, a0, Operand(1)); |
| 2151 __ Branch(&loop); | 2132 __ Branch(&loop); |
| 2152 __ bind(&done_loop); | 2133 __ bind(&done_loop); |
| 2153 } | 2134 } |
| 2154 | 2135 |
| 2155 // Call the [[BoundTargetFunction]] via the Call builtin. | 2136 // Call the [[BoundTargetFunction]] via the Call builtin. |
| 2156 __ lw(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); | 2137 __ lw(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); |
| 2157 __ li(at, Operand(ExternalReference(Builtins::kCall_ReceiverIsAny, | 2138 __ li(at, Operand(ExternalReference(Builtins::kCall_ReceiverIsAny, |
| 2158 masm->isolate()))); | 2139 masm->isolate()))); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2189 ExternalReference(Runtime::kJSProxyCall, masm->isolate())); | 2170 ExternalReference(Runtime::kJSProxyCall, masm->isolate())); |
| 2190 | 2171 |
| 2191 // 2. Call to something else, which might have a [[Call]] internal method (if | 2172 // 2. Call to something else, which might have a [[Call]] internal method (if |
| 2192 // not we raise an exception). | 2173 // not we raise an exception). |
| 2193 __ bind(&non_function); | 2174 __ bind(&non_function); |
| 2194 // Check if target has a [[Call]] internal method. | 2175 // Check if target has a [[Call]] internal method. |
| 2195 __ lbu(t1, FieldMemOperand(t1, Map::kBitFieldOffset)); | 2176 __ lbu(t1, FieldMemOperand(t1, Map::kBitFieldOffset)); |
| 2196 __ And(t1, t1, Operand(1 << Map::kIsCallable)); | 2177 __ And(t1, t1, Operand(1 << Map::kIsCallable)); |
| 2197 __ Branch(&non_callable, eq, t1, Operand(zero_reg)); | 2178 __ Branch(&non_callable, eq, t1, Operand(zero_reg)); |
| 2198 // Overwrite the original receiver with the (original) target. | 2179 // Overwrite the original receiver with the (original) target. |
| 2199 __ sll(at, a0, kPointerSizeLog2); | 2180 __ Lsa(at, sp, a0, kPointerSizeLog2); |
| 2200 __ addu(at, sp, at); | |
| 2201 __ sw(a1, MemOperand(at)); | 2181 __ sw(a1, MemOperand(at)); |
| 2202 // Let the "call_as_function_delegate" take care of the rest. | 2182 // Let the "call_as_function_delegate" take care of the rest. |
| 2203 __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1); | 2183 __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1); |
| 2204 __ Jump(masm->isolate()->builtins()->CallFunction( | 2184 __ Jump(masm->isolate()->builtins()->CallFunction( |
| 2205 ConvertReceiverMode::kNotNullOrUndefined), | 2185 ConvertReceiverMode::kNotNullOrUndefined), |
| 2206 RelocInfo::CODE_TARGET); | 2186 RelocInfo::CODE_TARGET); |
| 2207 | 2187 |
| 2208 // 3. Call to something that is not callable. | 2188 // 3. Call to something that is not callable. |
| 2209 __ bind(&non_callable); | 2189 __ bind(&non_callable); |
| 2210 { | 2190 { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2277 } | 2257 } |
| 2278 __ bind(&done); | 2258 __ bind(&done); |
| 2279 } | 2259 } |
| 2280 | 2260 |
| 2281 // Relocate arguments down the stack. | 2261 // Relocate arguments down the stack. |
| 2282 { | 2262 { |
| 2283 Label loop, done_loop; | 2263 Label loop, done_loop; |
| 2284 __ mov(t1, zero_reg); | 2264 __ mov(t1, zero_reg); |
| 2285 __ bind(&loop); | 2265 __ bind(&loop); |
| 2286 __ Branch(&done_loop, ge, t1, Operand(a0)); | 2266 __ Branch(&done_loop, ge, t1, Operand(a0)); |
| 2287 __ sll(t2, t0, kPointerSizeLog2); | 2267 __ Lsa(t2, sp, t0, kPointerSizeLog2); |
| 2288 __ addu(t2, t2, sp); | |
| 2289 __ lw(at, MemOperand(t2)); | 2268 __ lw(at, MemOperand(t2)); |
| 2290 __ sll(t2, t1, kPointerSizeLog2); | 2269 __ Lsa(t2, sp, t1, kPointerSizeLog2); |
| 2291 __ addu(t2, t2, sp); | |
| 2292 __ sw(at, MemOperand(t2)); | 2270 __ sw(at, MemOperand(t2)); |
| 2293 __ Addu(t0, t0, Operand(1)); | 2271 __ Addu(t0, t0, Operand(1)); |
| 2294 __ Addu(t1, t1, Operand(1)); | 2272 __ Addu(t1, t1, Operand(1)); |
| 2295 __ Branch(&loop); | 2273 __ Branch(&loop); |
| 2296 __ bind(&done_loop); | 2274 __ bind(&done_loop); |
| 2297 } | 2275 } |
| 2298 | 2276 |
| 2299 // Copy [[BoundArguments]] to the stack (below the arguments). | 2277 // Copy [[BoundArguments]] to the stack (below the arguments). |
| 2300 { | 2278 { |
| 2301 Label loop, done_loop; | 2279 Label loop, done_loop; |
| 2302 __ lw(t0, FieldMemOperand(a2, FixedArray::kLengthOffset)); | 2280 __ lw(t0, FieldMemOperand(a2, FixedArray::kLengthOffset)); |
| 2303 __ SmiUntag(t0); | 2281 __ SmiUntag(t0); |
| 2304 __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 2282 __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
| 2305 __ bind(&loop); | 2283 __ bind(&loop); |
| 2306 __ Subu(t0, t0, Operand(1)); | 2284 __ Subu(t0, t0, Operand(1)); |
| 2307 __ Branch(&done_loop, lt, t0, Operand(zero_reg)); | 2285 __ Branch(&done_loop, lt, t0, Operand(zero_reg)); |
| 2308 __ sll(t1, t0, kPointerSizeLog2); | 2286 __ Lsa(t1, a2, t0, kPointerSizeLog2); |
| 2309 __ addu(t1, t1, a2); | |
| 2310 __ lw(at, MemOperand(t1)); | 2287 __ lw(at, MemOperand(t1)); |
| 2311 __ sll(t1, a0, kPointerSizeLog2); | 2288 __ Lsa(t1, sp, a0, kPointerSizeLog2); |
| 2312 __ addu(t1, t1, sp); | |
| 2313 __ sw(at, MemOperand(t1)); | 2289 __ sw(at, MemOperand(t1)); |
| 2314 __ Addu(a0, a0, Operand(1)); | 2290 __ Addu(a0, a0, Operand(1)); |
| 2315 __ Branch(&loop); | 2291 __ Branch(&loop); |
| 2316 __ bind(&done_loop); | 2292 __ bind(&done_loop); |
| 2317 } | 2293 } |
| 2318 | 2294 |
| 2319 // Patch new.target to [[BoundTargetFunction]] if new.target equals target. | 2295 // Patch new.target to [[BoundTargetFunction]] if new.target equals target. |
| 2320 { | 2296 { |
| 2321 Label skip_load; | 2297 Label skip_load; |
| 2322 __ Branch(&skip_load, ne, a1, Operand(a3)); | 2298 __ Branch(&skip_load, ne, a1, Operand(a3)); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2381 __ Jump(masm->isolate()->builtins()->ConstructBoundFunction(), | 2357 __ Jump(masm->isolate()->builtins()->ConstructBoundFunction(), |
| 2382 RelocInfo::CODE_TARGET, eq, t2, Operand(JS_BOUND_FUNCTION_TYPE)); | 2358 RelocInfo::CODE_TARGET, eq, t2, Operand(JS_BOUND_FUNCTION_TYPE)); |
| 2383 | 2359 |
| 2384 // Only dispatch to proxies after checking whether they are constructors. | 2360 // Only dispatch to proxies after checking whether they are constructors. |
| 2385 __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, | 2361 __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, |
| 2386 eq, t2, Operand(JS_PROXY_TYPE)); | 2362 eq, t2, Operand(JS_PROXY_TYPE)); |
| 2387 | 2363 |
| 2388 // Called Construct on an exotic Object with a [[Construct]] internal method. | 2364 // Called Construct on an exotic Object with a [[Construct]] internal method. |
| 2389 { | 2365 { |
| 2390 // Overwrite the original receiver with the (original) target. | 2366 // Overwrite the original receiver with the (original) target. |
| 2391 __ sll(at, a0, kPointerSizeLog2); | 2367 __ Lsa(at, sp, a0, kPointerSizeLog2); |
| 2392 __ addu(at, sp, at); | |
| 2393 __ sw(a1, MemOperand(at)); | 2368 __ sw(a1, MemOperand(at)); |
| 2394 // Let the "call_as_constructor_delegate" take care of the rest. | 2369 // Let the "call_as_constructor_delegate" take care of the rest. |
| 2395 __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1); | 2370 __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1); |
| 2396 __ Jump(masm->isolate()->builtins()->CallFunction(), | 2371 __ Jump(masm->isolate()->builtins()->CallFunction(), |
| 2397 RelocInfo::CODE_TARGET); | 2372 RelocInfo::CODE_TARGET); |
| 2398 } | 2373 } |
| 2399 | 2374 |
| 2400 // Called Construct on an Object that doesn't have a [[Construct]] internal | 2375 // Called Construct on an Object that doesn't have a [[Construct]] internal |
| 2401 // method. | 2376 // method. |
| 2402 __ bind(&non_constructor); | 2377 __ bind(&non_constructor); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2425 { // Enough parameters: actual >= expected. | 2400 { // Enough parameters: actual >= expected. |
| 2426 // a0: actual number of arguments as a smi | 2401 // a0: actual number of arguments as a smi |
| 2427 // a1: function | 2402 // a1: function |
| 2428 // a2: expected number of arguments | 2403 // a2: expected number of arguments |
| 2429 // a3: new target (passed through to callee) | 2404 // a3: new target (passed through to callee) |
| 2430 __ bind(&enough); | 2405 __ bind(&enough); |
| 2431 EnterArgumentsAdaptorFrame(masm); | 2406 EnterArgumentsAdaptorFrame(masm); |
| 2432 ArgumentAdaptorStackCheck(masm, &stack_overflow); | 2407 ArgumentAdaptorStackCheck(masm, &stack_overflow); |
| 2433 | 2408 |
| 2434 // Calculate copy start address into a0 and copy end address into t1. | 2409 // Calculate copy start address into a0 and copy end address into t1. |
| 2435 __ sll(a0, a0, kPointerSizeLog2 - kSmiTagSize); | 2410 __ Lsa(a0, fp, a0, kPointerSizeLog2 - kSmiTagSize); |
| 2436 __ Addu(a0, fp, a0); | |
| 2437 // Adjust for return address and receiver. | 2411 // Adjust for return address and receiver. |
| 2438 __ Addu(a0, a0, Operand(2 * kPointerSize)); | 2412 __ Addu(a0, a0, Operand(2 * kPointerSize)); |
| 2439 // Compute copy end address. | 2413 // Compute copy end address. |
| 2440 __ sll(t1, a2, kPointerSizeLog2); | 2414 __ sll(t1, a2, kPointerSizeLog2); |
| 2441 __ subu(t1, a0, t1); | 2415 __ subu(t1, a0, t1); |
| 2442 | 2416 |
| 2443 // Copy the arguments (including the receiver) to the new stack frame. | 2417 // Copy the arguments (including the receiver) to the new stack frame. |
| 2444 // a0: copy start address | 2418 // a0: copy start address |
| 2445 // a1: function | 2419 // a1: function |
| 2446 // a2: expected number of arguments | 2420 // a2: expected number of arguments |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2481 | 2455 |
| 2482 __ bind(&no_strong_error); | 2456 __ bind(&no_strong_error); |
| 2483 EnterArgumentsAdaptorFrame(masm); | 2457 EnterArgumentsAdaptorFrame(masm); |
| 2484 ArgumentAdaptorStackCheck(masm, &stack_overflow); | 2458 ArgumentAdaptorStackCheck(masm, &stack_overflow); |
| 2485 | 2459 |
| 2486 // Calculate copy start address into a0 and copy end address into t3. | 2460 // Calculate copy start address into a0 and copy end address into t3. |
| 2487 // a0: actual number of arguments as a smi | 2461 // a0: actual number of arguments as a smi |
| 2488 // a1: function | 2462 // a1: function |
| 2489 // a2: expected number of arguments | 2463 // a2: expected number of arguments |
| 2490 // a3: new target (passed through to callee) | 2464 // a3: new target (passed through to callee) |
| 2491 __ sll(a0, a0, kPointerSizeLog2 - kSmiTagSize); | 2465 __ Lsa(a0, fp, a0, kPointerSizeLog2 - kSmiTagSize); |
| 2492 __ Addu(a0, fp, a0); | |
| 2493 // Adjust for return address and receiver. | 2466 // Adjust for return address and receiver. |
| 2494 __ Addu(a0, a0, Operand(2 * kPointerSize)); | 2467 __ Addu(a0, a0, Operand(2 * kPointerSize)); |
| 2495 // Compute copy end address. Also adjust for return address. | 2468 // Compute copy end address. Also adjust for return address. |
| 2496 __ Addu(t3, fp, kPointerSize); | 2469 __ Addu(t3, fp, kPointerSize); |
| 2497 | 2470 |
| 2498 // Copy the arguments (including the receiver) to the new stack frame. | 2471 // Copy the arguments (including the receiver) to the new stack frame. |
| 2499 // a0: copy start address | 2472 // a0: copy start address |
| 2500 // a1: function | 2473 // a1: function |
| 2501 // a2: expected number of arguments | 2474 // a2: expected number of arguments |
| 2502 // a3: new target (passed through to callee) | 2475 // a3: new target (passed through to callee) |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2559 } | 2532 } |
| 2560 } | 2533 } |
| 2561 | 2534 |
| 2562 | 2535 |
| 2563 #undef __ | 2536 #undef __ |
| 2564 | 2537 |
| 2565 } // namespace internal | 2538 } // namespace internal |
| 2566 } // namespace v8 | 2539 } // namespace v8 |
| 2567 | 2540 |
| 2568 #endif // V8_TARGET_ARCH_MIPS | 2541 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |