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_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 |
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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) | 149 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) |
150 // -- sp[argc * 8] : receiver | 150 // -- sp[argc * 8] : receiver |
151 // ----------------------------------- | 151 // ----------------------------------- |
152 | 152 |
153 // 1. Load the first argument into a0 and get rid of the rest (including the | 153 // 1. Load the first argument into a0 and get rid of the rest (including the |
154 // receiver). | 154 // receiver). |
155 Label no_arguments; | 155 Label no_arguments; |
156 { | 156 { |
157 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 157 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
158 __ Dsubu(a0, a0, Operand(1)); | 158 __ Dsubu(a0, a0, Operand(1)); |
159 __ dsll(a0, a0, kPointerSizeLog2); | 159 __ Dlsa(sp, sp, a0, kPointerSizeLog2); |
160 __ Daddu(sp, a0, sp); | |
161 __ ld(a0, MemOperand(sp)); | 160 __ ld(a0, MemOperand(sp)); |
162 __ Drop(2); | 161 __ Drop(2); |
163 } | 162 } |
164 | 163 |
165 // 2a. Convert first argument to number. | 164 // 2a. Convert first argument to number. |
166 ToNumberStub stub(masm->isolate()); | 165 ToNumberStub stub(masm->isolate()); |
167 __ TailCallStub(&stub); | 166 __ TailCallStub(&stub); |
168 | 167 |
169 // 2b. No arguments, return +0. | 168 // 2b. No arguments, return +0. |
170 __ bind(&no_arguments); | 169 __ bind(&no_arguments); |
(...skipping 14 matching lines...) Expand all Loading... |
185 | 184 |
186 // 1. Make sure we operate in the context of the called function. | 185 // 1. Make sure we operate in the context of the called function. |
187 __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 186 __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
188 | 187 |
189 // 2. Load the first argument into a0 and get rid of the rest (including the | 188 // 2. Load the first argument into a0 and get rid of the rest (including the |
190 // receiver). | 189 // receiver). |
191 { | 190 { |
192 Label no_arguments, done; | 191 Label no_arguments, done; |
193 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 192 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
194 __ Dsubu(a0, a0, Operand(1)); | 193 __ Dsubu(a0, a0, Operand(1)); |
195 __ dsll(a0, a0, kPointerSizeLog2); | 194 __ Dlsa(sp, sp, a0, kPointerSizeLog2); |
196 __ Daddu(sp, a0, sp); | |
197 __ ld(a0, MemOperand(sp)); | 195 __ ld(a0, MemOperand(sp)); |
198 __ Drop(2); | 196 __ Drop(2); |
199 __ jmp(&done); | 197 __ jmp(&done); |
200 __ bind(&no_arguments); | 198 __ bind(&no_arguments); |
201 __ Move(a0, Smi::FromInt(0)); | 199 __ Move(a0, Smi::FromInt(0)); |
202 __ Drop(1); | 200 __ Drop(1); |
203 __ bind(&done); | 201 __ bind(&done); |
204 } | 202 } |
205 | 203 |
206 // 3. Make sure a0 is a number. | 204 // 3. Make sure a0 is a number. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) | 248 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) |
251 // -- sp[argc * 8] : receiver | 249 // -- sp[argc * 8] : receiver |
252 // ----------------------------------- | 250 // ----------------------------------- |
253 | 251 |
254 // 1. Load the first argument into a0 and get rid of the rest (including the | 252 // 1. Load the first argument into a0 and get rid of the rest (including the |
255 // receiver). | 253 // receiver). |
256 Label no_arguments; | 254 Label no_arguments; |
257 { | 255 { |
258 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 256 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
259 __ Dsubu(a0, a0, Operand(1)); | 257 __ Dsubu(a0, a0, Operand(1)); |
260 __ dsll(a0, a0, kPointerSizeLog2); | 258 __ Dlsa(sp, sp, a0, kPointerSizeLog2); |
261 __ Daddu(sp, a0, sp); | |
262 __ ld(a0, MemOperand(sp)); | 259 __ ld(a0, MemOperand(sp)); |
263 __ Drop(2); | 260 __ Drop(2); |
264 } | 261 } |
265 | 262 |
266 // 2a. At least one argument, return a0 if it's a string, otherwise | 263 // 2a. At least one argument, return a0 if it's a string, otherwise |
267 // dispatch to appropriate conversion. | 264 // dispatch to appropriate conversion. |
268 Label to_string, symbol_descriptive_string; | 265 Label to_string, symbol_descriptive_string; |
269 { | 266 { |
270 __ JumpIfSmi(a0, &to_string); | 267 __ JumpIfSmi(a0, &to_string); |
271 __ GetObjectType(a0, a1, a1); | 268 __ GetObjectType(a0, a1, a1); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 | 309 |
313 // 1. Make sure we operate in the context of the called function. | 310 // 1. Make sure we operate in the context of the called function. |
314 __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 311 __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
315 | 312 |
316 // 2. Load the first argument into a0 and get rid of the rest (including the | 313 // 2. Load the first argument into a0 and get rid of the rest (including the |
317 // receiver). | 314 // receiver). |
318 { | 315 { |
319 Label no_arguments, done; | 316 Label no_arguments, done; |
320 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 317 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
321 __ Dsubu(a0, a0, Operand(1)); | 318 __ Dsubu(a0, a0, Operand(1)); |
322 __ dsll(a0, a0, kPointerSizeLog2); | 319 __ Dlsa(sp, sp, a0, kPointerSizeLog2); |
323 __ Daddu(sp, a0, sp); | |
324 __ ld(a0, MemOperand(sp)); | 320 __ ld(a0, MemOperand(sp)); |
325 __ Drop(2); | 321 __ Drop(2); |
326 __ jmp(&done); | 322 __ jmp(&done); |
327 __ bind(&no_arguments); | 323 __ bind(&no_arguments); |
328 __ LoadRoot(a0, Heap::kempty_stringRootIndex); | 324 __ LoadRoot(a0, Heap::kempty_stringRootIndex); |
329 __ Drop(1); | 325 __ Drop(1); |
330 __ bind(&done); | 326 __ bind(&done); |
331 } | 327 } |
332 | 328 |
333 // 3. Make sure a0 is a string. | 329 // 3. Make sure a0 is a string. |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 // a2: address of last argument (caller sp) | 600 // a2: address of last argument (caller sp) |
605 // a3: new target | 601 // a3: new target |
606 // t0: number of arguments (smi-tagged) | 602 // t0: number of arguments (smi-tagged) |
607 // sp[0]: receiver | 603 // sp[0]: receiver |
608 // sp[1]: receiver | 604 // sp[1]: receiver |
609 // sp[2]: number of arguments (smi-tagged) | 605 // sp[2]: number of arguments (smi-tagged) |
610 Label loop, entry; | 606 Label loop, entry; |
611 __ mov(t0, a0); | 607 __ mov(t0, a0); |
612 __ jmp(&entry); | 608 __ jmp(&entry); |
613 __ bind(&loop); | 609 __ bind(&loop); |
614 __ dsll(a4, t0, kPointerSizeLog2); | 610 __ Dlsa(a4, a2, t0, kPointerSizeLog2); |
615 __ Daddu(a4, a2, Operand(a4)); | |
616 __ ld(a5, MemOperand(a4)); | 611 __ ld(a5, MemOperand(a4)); |
617 __ push(a5); | 612 __ push(a5); |
618 __ bind(&entry); | 613 __ bind(&entry); |
619 __ Daddu(t0, t0, Operand(-1)); | 614 __ Daddu(t0, t0, Operand(-1)); |
620 __ Branch(&loop, greater_equal, t0, Operand(zero_reg)); | 615 __ Branch(&loop, greater_equal, t0, Operand(zero_reg)); |
621 | 616 |
622 // Call the function. | 617 // Call the function. |
623 // a0: number of arguments | 618 // a0: number of arguments |
624 // a1: constructor function | 619 // a1: constructor function |
625 // a3: new target | 620 // a3: new target |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 // Clobbers a2. | 786 // Clobbers a2. |
792 Generate_CheckStackOverflow(masm, a3, kArgcIsUntaggedInt); | 787 Generate_CheckStackOverflow(masm, a3, kArgcIsUntaggedInt); |
793 | 788 |
794 // Remember new.target. | 789 // Remember new.target. |
795 __ mov(a5, a0); | 790 __ mov(a5, a0); |
796 | 791 |
797 // Copy arguments to the stack in a loop. | 792 // Copy arguments to the stack in a loop. |
798 // a3: argc | 793 // a3: argc |
799 // s0: argv, i.e. points to first arg | 794 // s0: argv, i.e. points to first arg |
800 Label loop, entry; | 795 Label loop, entry; |
801 __ dsll(a4, a3, kPointerSizeLog2); | 796 __ Dlsa(a6, s0, a3, kPointerSizeLog2); |
802 __ daddu(a6, s0, a4); | |
803 __ b(&entry); | 797 __ b(&entry); |
804 __ nop(); // Branch delay slot nop. | 798 __ nop(); // Branch delay slot nop. |
805 // a6 points past last arg. | 799 // a6 points past last arg. |
806 __ bind(&loop); | 800 __ bind(&loop); |
807 __ ld(a4, MemOperand(s0)); // Read next parameter. | 801 __ ld(a4, MemOperand(s0)); // Read next parameter. |
808 __ daddiu(s0, s0, kPointerSize); | 802 __ daddiu(s0, s0, kPointerSize); |
809 __ ld(a4, MemOperand(a4)); // Dereference handle. | 803 __ ld(a4, MemOperand(a4)); // Dereference handle. |
810 __ push(a4); // Push parameter. | 804 __ push(a4); // Push parameter. |
811 __ bind(&entry); | 805 __ bind(&entry); |
812 __ Branch(&loop, ne, s0, Operand(a6)); | 806 __ Branch(&loop, ne, s0, Operand(a6)); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); | 942 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
949 __ LoadRoot(kInterpreterDispatchTableRegister, | 943 __ LoadRoot(kInterpreterDispatchTableRegister, |
950 Heap::kInterpreterTableRootIndex); | 944 Heap::kInterpreterTableRootIndex); |
951 __ Daddu(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, | 945 __ Daddu(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, |
952 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 946 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
953 | 947 |
954 // Dispatch to the first bytecode handler for the function. | 948 // Dispatch to the first bytecode handler for the function. |
955 __ Daddu(a0, kInterpreterBytecodeArrayRegister, | 949 __ Daddu(a0, kInterpreterBytecodeArrayRegister, |
956 kInterpreterBytecodeOffsetRegister); | 950 kInterpreterBytecodeOffsetRegister); |
957 __ lbu(a0, MemOperand(a0)); | 951 __ lbu(a0, MemOperand(a0)); |
958 __ dsll(at, a0, kPointerSizeLog2); | 952 __ Dlsa(at, kInterpreterDispatchTableRegister, a0, kPointerSizeLog2); |
959 __ Daddu(at, kInterpreterDispatchTableRegister, at); | |
960 __ ld(at, MemOperand(at)); | 953 __ ld(at, MemOperand(at)); |
961 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging | 954 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging |
962 // and header removal. | 955 // and header removal. |
963 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); | 956 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); |
964 __ Call(at); | 957 __ Call(at); |
965 } | 958 } |
966 | 959 |
967 | 960 |
968 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { | 961 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
969 // TODO(rmcilroy): List of things not currently dealt with here but done in | 962 // 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... |
1102 __ ld(kInterpreterBytecodeOffsetRegister, | 1095 __ ld(kInterpreterBytecodeOffsetRegister, |
1103 MemOperand( | 1096 MemOperand( |
1104 kInterpreterRegisterFileRegister, | 1097 kInterpreterRegisterFileRegister, |
1105 InterpreterFrameConstants::kBytecodeOffsetFromRegisterPointer)); | 1098 InterpreterFrameConstants::kBytecodeOffsetFromRegisterPointer)); |
1106 __ SmiUntag(kInterpreterBytecodeOffsetRegister); | 1099 __ SmiUntag(kInterpreterBytecodeOffsetRegister); |
1107 | 1100 |
1108 // Dispatch to the target bytecode. | 1101 // Dispatch to the target bytecode. |
1109 __ Daddu(a1, kInterpreterBytecodeArrayRegister, | 1102 __ Daddu(a1, kInterpreterBytecodeArrayRegister, |
1110 kInterpreterBytecodeOffsetRegister); | 1103 kInterpreterBytecodeOffsetRegister); |
1111 __ lbu(a1, MemOperand(a1)); | 1104 __ lbu(a1, MemOperand(a1)); |
1112 __ dsll(a1, a1, kPointerSizeLog2); | 1105 __ Dlsa(a1, kInterpreterDispatchTableRegister, a1, kPointerSizeLog2); |
1113 __ Daddu(a1, kInterpreterDispatchTableRegister, a1); | |
1114 __ ld(a1, MemOperand(a1)); | 1106 __ ld(a1, MemOperand(a1)); |
1115 __ Daddu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1107 __ Daddu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag)); |
1116 __ Jump(a1); | 1108 __ Jump(a1); |
1117 } | 1109 } |
1118 | 1110 |
1119 | 1111 |
1120 void Builtins::Generate_InterpreterNotifyDeoptimized(MacroAssembler* masm) { | 1112 void Builtins::Generate_InterpreterNotifyDeoptimized(MacroAssembler* masm) { |
1121 Generate_InterpreterNotifyDeoptimizedHelper(masm, Deoptimizer::EAGER); | 1113 Generate_InterpreterNotifyDeoptimizedHelper(masm, Deoptimizer::EAGER); |
1122 } | 1114 } |
1123 | 1115 |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1390 // -- sp[8 * (argc - 1)] : first argument | 1382 // -- sp[8 * (argc - 1)] : first argument |
1391 // -- sp[8 * argc] : receiver | 1383 // -- sp[8 * argc] : receiver |
1392 // ----------------------------------- | 1384 // ----------------------------------- |
1393 | 1385 |
1394 // Load the FunctionTemplateInfo. | 1386 // Load the FunctionTemplateInfo. |
1395 __ ld(t1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 1387 __ ld(t1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
1396 __ ld(t1, FieldMemOperand(t1, SharedFunctionInfo::kFunctionDataOffset)); | 1388 __ ld(t1, FieldMemOperand(t1, SharedFunctionInfo::kFunctionDataOffset)); |
1397 | 1389 |
1398 // Do the compatible receiver check | 1390 // Do the compatible receiver check |
1399 Label receiver_check_failed; | 1391 Label receiver_check_failed; |
1400 __ sll(at, a0, kPointerSizeLog2); | 1392 __ Dlsa(t8, sp, a0, kPointerSizeLog2); |
1401 __ Daddu(t8, sp, at); | |
1402 __ ld(t0, MemOperand(t8)); | 1393 __ ld(t0, MemOperand(t8)); |
1403 CompatibleReceiverCheck(masm, t0, t1, &receiver_check_failed); | 1394 CompatibleReceiverCheck(masm, t0, t1, &receiver_check_failed); |
1404 | 1395 |
1405 // Get the callback offset from the FunctionTemplateInfo, and jump to the | 1396 // Get the callback offset from the FunctionTemplateInfo, and jump to the |
1406 // beginning of the code. | 1397 // beginning of the code. |
1407 __ ld(t2, FieldMemOperand(t1, FunctionTemplateInfo::kCallCodeOffset)); | 1398 __ ld(t2, FieldMemOperand(t1, FunctionTemplateInfo::kCallCodeOffset)); |
1408 __ ld(t2, FieldMemOperand(t2, CallHandlerInfo::kFastHandlerOffset)); | 1399 __ ld(t2, FieldMemOperand(t2, CallHandlerInfo::kFastHandlerOffset)); |
1409 __ Daddu(t2, t2, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1400 __ Daddu(t2, t2, Operand(Code::kHeaderSize - kHeapObjectTag)); |
1410 __ Jump(t2); | 1401 __ Jump(t2); |
1411 | 1402 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 // ----------------------------------- | 1516 // ----------------------------------- |
1526 | 1517 |
1527 // 1. Load receiver into a1, argArray into a0 (if present), remove all | 1518 // 1. Load receiver into a1, argArray into a0 (if present), remove all |
1528 // arguments from the stack (including the receiver), and push thisArg (if | 1519 // arguments from the stack (including the receiver), and push thisArg (if |
1529 // present) instead. | 1520 // present) instead. |
1530 { | 1521 { |
1531 Label no_arg; | 1522 Label no_arg; |
1532 Register scratch = a4; | 1523 Register scratch = a4; |
1533 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); | 1524 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); |
1534 __ mov(a3, a2); | 1525 __ mov(a3, a2); |
| 1526 // Dlsa() cannot be used hare as scratch value used later. |
1535 __ dsll(scratch, a0, kPointerSizeLog2); | 1527 __ dsll(scratch, a0, kPointerSizeLog2); |
1536 __ Daddu(a0, sp, Operand(scratch)); | 1528 __ Daddu(a0, sp, Operand(scratch)); |
1537 __ ld(a1, MemOperand(a0)); // receiver | 1529 __ ld(a1, MemOperand(a0)); // receiver |
1538 __ Dsubu(a0, a0, Operand(kPointerSize)); | 1530 __ Dsubu(a0, a0, Operand(kPointerSize)); |
1539 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1531 __ Branch(&no_arg, lt, a0, Operand(sp)); |
1540 __ ld(a2, MemOperand(a0)); // thisArg | 1532 __ ld(a2, MemOperand(a0)); // thisArg |
1541 __ Dsubu(a0, a0, Operand(kPointerSize)); | 1533 __ Dsubu(a0, a0, Operand(kPointerSize)); |
1542 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1534 __ Branch(&no_arg, lt, a0, Operand(sp)); |
1543 __ ld(a3, MemOperand(a0)); // argArray | 1535 __ ld(a3, MemOperand(a0)); // argArray |
1544 __ bind(&no_arg); | 1536 __ bind(&no_arg); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 { | 1587 { |
1596 Label done; | 1588 Label done; |
1597 __ Branch(&done, ne, a0, Operand(zero_reg)); | 1589 __ Branch(&done, ne, a0, Operand(zero_reg)); |
1598 __ PushRoot(Heap::kUndefinedValueRootIndex); | 1590 __ PushRoot(Heap::kUndefinedValueRootIndex); |
1599 __ Daddu(a0, a0, Operand(1)); | 1591 __ Daddu(a0, a0, Operand(1)); |
1600 __ bind(&done); | 1592 __ bind(&done); |
1601 } | 1593 } |
1602 | 1594 |
1603 // 2. Get the function to call (passed as receiver) from the stack. | 1595 // 2. Get the function to call (passed as receiver) from the stack. |
1604 // a0: actual number of arguments | 1596 // a0: actual number of arguments |
1605 __ dsll(at, a0, kPointerSizeLog2); | 1597 __ Dlsa(at, sp, a0, kPointerSizeLog2); |
1606 __ daddu(at, sp, at); | |
1607 __ ld(a1, MemOperand(at)); | 1598 __ ld(a1, MemOperand(at)); |
1608 | 1599 |
1609 // 3. Shift arguments and return address one slot down on the stack | 1600 // 3. Shift arguments and return address one slot down on the stack |
1610 // (overwriting the original receiver). Adjust argument count to make | 1601 // (overwriting the original receiver). Adjust argument count to make |
1611 // the original first argument the new receiver. | 1602 // the original first argument the new receiver. |
1612 // a0: actual number of arguments | 1603 // a0: actual number of arguments |
1613 // a1: function | 1604 // a1: function |
1614 { | 1605 { |
1615 Label loop; | 1606 Label loop; |
1616 // Calculate the copy start address (destination). Copy end address is sp. | 1607 // Calculate the copy start address (destination). Copy end address is sp. |
1617 __ dsll(at, a0, kPointerSizeLog2); | 1608 __ Dlsa(a2, sp, a0, kPointerSizeLog2); |
1618 __ daddu(a2, sp, at); | |
1619 | 1609 |
1620 __ bind(&loop); | 1610 __ bind(&loop); |
1621 __ ld(at, MemOperand(a2, -kPointerSize)); | 1611 __ ld(at, MemOperand(a2, -kPointerSize)); |
1622 __ sd(at, MemOperand(a2)); | 1612 __ sd(at, MemOperand(a2)); |
1623 __ Dsubu(a2, a2, Operand(kPointerSize)); | 1613 __ Dsubu(a2, a2, Operand(kPointerSize)); |
1624 __ Branch(&loop, ne, a2, Operand(sp)); | 1614 __ Branch(&loop, ne, a2, Operand(sp)); |
1625 // Adjust the actual number of arguments and remove the top element | 1615 // Adjust the actual number of arguments and remove the top element |
1626 // (which is a copy of the last argument). | 1616 // (which is a copy of the last argument). |
1627 __ Dsubu(a0, a0, Operand(1)); | 1617 __ Dsubu(a0, a0, Operand(1)); |
1628 __ Pop(); | 1618 __ Pop(); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1708 | 1698 |
1709 // 1. Load target into a1 (if present), argumentsList into a0 (if present), | 1699 // 1. Load target into a1 (if present), argumentsList into a0 (if present), |
1710 // new.target into a3 (if present, otherwise use target), remove all | 1700 // new.target into a3 (if present, otherwise use target), remove all |
1711 // arguments from the stack (including the receiver), and push thisArgument | 1701 // arguments from the stack (including the receiver), and push thisArgument |
1712 // (if present) instead. | 1702 // (if present) instead. |
1713 { | 1703 { |
1714 Label no_arg; | 1704 Label no_arg; |
1715 Register scratch = a4; | 1705 Register scratch = a4; |
1716 __ LoadRoot(a1, Heap::kUndefinedValueRootIndex); | 1706 __ LoadRoot(a1, Heap::kUndefinedValueRootIndex); |
1717 __ mov(a2, a1); | 1707 __ mov(a2, a1); |
| 1708 // Dlsa() cannot be used hare as scratch value used later. |
1718 __ dsll(scratch, a0, kPointerSizeLog2); | 1709 __ dsll(scratch, a0, kPointerSizeLog2); |
1719 __ Daddu(a0, sp, Operand(scratch)); | 1710 __ Daddu(a0, sp, Operand(scratch)); |
1720 __ sd(a2, MemOperand(a0)); // receiver | 1711 __ sd(a2, MemOperand(a0)); // receiver |
1721 __ Dsubu(a0, a0, Operand(kPointerSize)); | 1712 __ Dsubu(a0, a0, Operand(kPointerSize)); |
1722 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1713 __ Branch(&no_arg, lt, a0, Operand(sp)); |
1723 __ ld(a1, MemOperand(a0)); // target | 1714 __ ld(a1, MemOperand(a0)); // target |
1724 __ mov(a3, a1); // new.target defaults to target | 1715 __ mov(a3, a1); // new.target defaults to target |
1725 __ Dsubu(a0, a0, Operand(kPointerSize)); | 1716 __ Dsubu(a0, a0, Operand(kPointerSize)); |
1726 __ Branch(&no_arg, lt, a0, Operand(sp)); | 1717 __ Branch(&no_arg, lt, a0, Operand(sp)); |
1727 __ ld(a2, MemOperand(a0)); // argumentsList | 1718 __ ld(a2, MemOperand(a0)); // argumentsList |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1919 // -- a3 : new.target (checked to be constructor or undefined) | 1910 // -- a3 : new.target (checked to be constructor or undefined) |
1920 // -- sp[0] : thisArgument | 1911 // -- sp[0] : thisArgument |
1921 // ----------------------------------- | 1912 // ----------------------------------- |
1922 | 1913 |
1923 // Push arguments onto the stack (thisArgument is already on the stack). | 1914 // Push arguments onto the stack (thisArgument is already on the stack). |
1924 { | 1915 { |
1925 __ mov(a4, zero_reg); | 1916 __ mov(a4, zero_reg); |
1926 Label done, loop; | 1917 Label done, loop; |
1927 __ bind(&loop); | 1918 __ bind(&loop); |
1928 __ Branch(&done, eq, a4, Operand(a2)); | 1919 __ Branch(&done, eq, a4, Operand(a2)); |
1929 __ dsll(at, a4, kPointerSizeLog2); | 1920 __ Dlsa(at, a0, a4, kPointerSizeLog2); |
1930 __ Daddu(at, a0, at); | |
1931 __ ld(at, FieldMemOperand(at, FixedArray::kHeaderSize)); | 1921 __ ld(at, FieldMemOperand(at, FixedArray::kHeaderSize)); |
1932 __ Push(at); | 1922 __ Push(at); |
1933 __ Daddu(a4, a4, Operand(1)); | 1923 __ Daddu(a4, a4, Operand(1)); |
1934 __ Branch(&loop); | 1924 __ Branch(&loop); |
1935 __ bind(&done); | 1925 __ bind(&done); |
1936 __ Move(a0, a4); | 1926 __ Move(a0, a4); |
1937 } | 1927 } |
1938 | 1928 |
1939 // Dispatch to Call or Construct depending on whether new.target is undefined. | 1929 // Dispatch to Call or Construct depending on whether new.target is undefined. |
1940 { | 1930 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1983 // -- a1 : the function to call (checked to be a JSFunction) | 1973 // -- a1 : the function to call (checked to be a JSFunction) |
1984 // -- a2 : the shared function info. | 1974 // -- a2 : the shared function info. |
1985 // -- cp : the function context. | 1975 // -- cp : the function context. |
1986 // ----------------------------------- | 1976 // ----------------------------------- |
1987 | 1977 |
1988 if (mode == ConvertReceiverMode::kNullOrUndefined) { | 1978 if (mode == ConvertReceiverMode::kNullOrUndefined) { |
1989 // Patch receiver to global proxy. | 1979 // Patch receiver to global proxy. |
1990 __ LoadGlobalProxy(a3); | 1980 __ LoadGlobalProxy(a3); |
1991 } else { | 1981 } else { |
1992 Label convert_to_object, convert_receiver; | 1982 Label convert_to_object, convert_receiver; |
1993 __ dsll(at, a0, kPointerSizeLog2); | 1983 __ Dlsa(at, sp, a0, kPointerSizeLog2); |
1994 __ daddu(at, sp, at); | |
1995 __ ld(a3, MemOperand(at)); | 1984 __ ld(a3, MemOperand(at)); |
1996 __ JumpIfSmi(a3, &convert_to_object); | 1985 __ JumpIfSmi(a3, &convert_to_object); |
1997 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | 1986 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
1998 __ GetObjectType(a3, a4, a4); | 1987 __ GetObjectType(a3, a4, a4); |
1999 __ Branch(&done_convert, hs, a4, Operand(FIRST_JS_RECEIVER_TYPE)); | 1988 __ Branch(&done_convert, hs, a4, Operand(FIRST_JS_RECEIVER_TYPE)); |
2000 if (mode != ConvertReceiverMode::kNotNullOrUndefined) { | 1989 if (mode != ConvertReceiverMode::kNotNullOrUndefined) { |
2001 Label convert_global_proxy; | 1990 Label convert_global_proxy; |
2002 __ JumpIfRoot(a3, Heap::kUndefinedValueRootIndex, | 1991 __ JumpIfRoot(a3, Heap::kUndefinedValueRootIndex, |
2003 &convert_global_proxy); | 1992 &convert_global_proxy); |
2004 __ JumpIfNotRoot(a3, Heap::kNullValueRootIndex, &convert_to_object); | 1993 __ JumpIfNotRoot(a3, Heap::kNullValueRootIndex, &convert_to_object); |
(...skipping 15 matching lines...) Expand all Loading... |
2020 __ mov(a0, a3); | 2009 __ mov(a0, a3); |
2021 ToObjectStub stub(masm->isolate()); | 2010 ToObjectStub stub(masm->isolate()); |
2022 __ CallStub(&stub); | 2011 __ CallStub(&stub); |
2023 __ mov(a3, v0); | 2012 __ mov(a3, v0); |
2024 __ Pop(a0, a1); | 2013 __ Pop(a0, a1); |
2025 __ SmiUntag(a0); | 2014 __ SmiUntag(a0); |
2026 } | 2015 } |
2027 __ ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 2016 __ ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
2028 __ bind(&convert_receiver); | 2017 __ bind(&convert_receiver); |
2029 } | 2018 } |
2030 __ dsll(at, a0, kPointerSizeLog2); | 2019 __ Dlsa(at, sp, a0, kPointerSizeLog2); |
2031 __ daddu(at, sp, at); | |
2032 __ sd(a3, MemOperand(at)); | 2020 __ sd(a3, MemOperand(at)); |
2033 } | 2021 } |
2034 __ bind(&done_convert); | 2022 __ bind(&done_convert); |
2035 | 2023 |
2036 // ----------- S t a t e ------------- | 2024 // ----------- S t a t e ------------- |
2037 // -- a0 : the number of arguments (not including the receiver) | 2025 // -- a0 : the number of arguments (not including the receiver) |
2038 // -- a1 : the function to call (checked to be a JSFunction) | 2026 // -- a1 : the function to call (checked to be a JSFunction) |
2039 // -- a2 : the shared function info. | 2027 // -- a2 : the shared function info. |
2040 // -- cp : the function context. | 2028 // -- cp : the function context. |
2041 // ----------------------------------- | 2029 // ----------------------------------- |
(...skipping 19 matching lines...) Expand all Loading... |
2061 void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) { | 2049 void Builtins::Generate_CallBoundFunction(MacroAssembler* masm) { |
2062 // ----------- S t a t e ------------- | 2050 // ----------- S t a t e ------------- |
2063 // -- a0 : the number of arguments (not including the receiver) | 2051 // -- a0 : the number of arguments (not including the receiver) |
2064 // -- a1 : the function to call (checked to be a JSBoundFunction) | 2052 // -- a1 : the function to call (checked to be a JSBoundFunction) |
2065 // ----------------------------------- | 2053 // ----------------------------------- |
2066 __ AssertBoundFunction(a1); | 2054 __ AssertBoundFunction(a1); |
2067 | 2055 |
2068 // Patch the receiver to [[BoundThis]]. | 2056 // Patch the receiver to [[BoundThis]]. |
2069 { | 2057 { |
2070 __ ld(at, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); | 2058 __ ld(at, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); |
2071 __ dsll(a4, a0, kPointerSizeLog2); | 2059 __ Dlsa(a4, sp, a0, kPointerSizeLog2); |
2072 __ daddu(a4, a4, sp); | |
2073 __ sd(at, MemOperand(a4)); | 2060 __ sd(at, MemOperand(a4)); |
2074 } | 2061 } |
2075 | 2062 |
2076 // Load [[BoundArguments]] into a2 and length of that into a4. | 2063 // Load [[BoundArguments]] into a2 and length of that into a4. |
2077 __ ld(a2, FieldMemOperand(a1, JSBoundFunction::kBoundArgumentsOffset)); | 2064 __ ld(a2, FieldMemOperand(a1, JSBoundFunction::kBoundArgumentsOffset)); |
2078 __ ld(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); | 2065 __ ld(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); |
2079 __ SmiUntag(a4); | 2066 __ SmiUntag(a4); |
2080 | 2067 |
2081 // ----------- S t a t e ------------- | 2068 // ----------- S t a t e ------------- |
2082 // -- a0 : the number of arguments (not including the receiver) | 2069 // -- a0 : the number of arguments (not including the receiver) |
(...skipping 20 matching lines...) Expand all Loading... |
2103 } | 2090 } |
2104 __ bind(&done); | 2091 __ bind(&done); |
2105 } | 2092 } |
2106 | 2093 |
2107 // Relocate arguments down the stack. | 2094 // Relocate arguments down the stack. |
2108 { | 2095 { |
2109 Label loop, done_loop; | 2096 Label loop, done_loop; |
2110 __ mov(a5, zero_reg); | 2097 __ mov(a5, zero_reg); |
2111 __ bind(&loop); | 2098 __ bind(&loop); |
2112 __ Branch(&done_loop, gt, a5, Operand(a0)); | 2099 __ Branch(&done_loop, gt, a5, Operand(a0)); |
2113 __ dsll(a6, a4, kPointerSizeLog2); | 2100 __ Dlsa(a6, sp, a4, kPointerSizeLog2); |
2114 __ daddu(a6, a6, sp); | |
2115 __ ld(at, MemOperand(a6)); | 2101 __ ld(at, MemOperand(a6)); |
2116 __ dsll(a6, a5, kPointerSizeLog2); | 2102 __ Dlsa(a6, sp, a5, kPointerSizeLog2); |
2117 __ daddu(a6, a6, sp); | |
2118 __ sd(at, MemOperand(a6)); | 2103 __ sd(at, MemOperand(a6)); |
2119 __ Daddu(a4, a4, Operand(1)); | 2104 __ Daddu(a4, a4, Operand(1)); |
2120 __ Daddu(a5, a5, Operand(1)); | 2105 __ Daddu(a5, a5, Operand(1)); |
2121 __ Branch(&loop); | 2106 __ Branch(&loop); |
2122 __ bind(&done_loop); | 2107 __ bind(&done_loop); |
2123 } | 2108 } |
2124 | 2109 |
2125 // Copy [[BoundArguments]] to the stack (below the arguments). | 2110 // Copy [[BoundArguments]] to the stack (below the arguments). |
2126 { | 2111 { |
2127 Label loop, done_loop; | 2112 Label loop, done_loop; |
2128 __ ld(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); | 2113 __ ld(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); |
2129 __ SmiUntag(a4); | 2114 __ SmiUntag(a4); |
2130 __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 2115 __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
2131 __ bind(&loop); | 2116 __ bind(&loop); |
2132 __ Dsubu(a4, a4, Operand(1)); | 2117 __ Dsubu(a4, a4, Operand(1)); |
2133 __ Branch(&done_loop, lt, a4, Operand(zero_reg)); | 2118 __ Branch(&done_loop, lt, a4, Operand(zero_reg)); |
2134 __ dsll(a5, a4, kPointerSizeLog2); | 2119 __ Dlsa(a5, a2, a4, kPointerSizeLog2); |
2135 __ daddu(a5, a5, a2); | |
2136 __ ld(at, MemOperand(a5)); | 2120 __ ld(at, MemOperand(a5)); |
2137 __ dsll(a5, a0, kPointerSizeLog2); | 2121 __ Dlsa(a5, sp, a0, kPointerSizeLog2); |
2138 __ daddu(a5, a5, sp); | |
2139 __ sd(at, MemOperand(a5)); | 2122 __ sd(at, MemOperand(a5)); |
2140 __ Daddu(a0, a0, Operand(1)); | 2123 __ Daddu(a0, a0, Operand(1)); |
2141 __ Branch(&loop); | 2124 __ Branch(&loop); |
2142 __ bind(&done_loop); | 2125 __ bind(&done_loop); |
2143 } | 2126 } |
2144 | 2127 |
2145 // Call the [[BoundTargetFunction]] via the Call builtin. | 2128 // Call the [[BoundTargetFunction]] via the Call builtin. |
2146 __ ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); | 2129 __ ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); |
2147 __ li(at, Operand(ExternalReference(Builtins::kCall_ReceiverIsAny, | 2130 __ li(at, Operand(ExternalReference(Builtins::kCall_ReceiverIsAny, |
2148 masm->isolate()))); | 2131 masm->isolate()))); |
(...skipping 30 matching lines...) Expand all Loading... |
2179 ExternalReference(Runtime::kJSProxyCall, masm->isolate())); | 2162 ExternalReference(Runtime::kJSProxyCall, masm->isolate())); |
2180 | 2163 |
2181 // 2. Call to something else, which might have a [[Call]] internal method (if | 2164 // 2. Call to something else, which might have a [[Call]] internal method (if |
2182 // not we raise an exception). | 2165 // not we raise an exception). |
2183 __ bind(&non_function); | 2166 __ bind(&non_function); |
2184 // Check if target has a [[Call]] internal method. | 2167 // Check if target has a [[Call]] internal method. |
2185 __ lbu(t1, FieldMemOperand(t1, Map::kBitFieldOffset)); | 2168 __ lbu(t1, FieldMemOperand(t1, Map::kBitFieldOffset)); |
2186 __ And(t1, t1, Operand(1 << Map::kIsCallable)); | 2169 __ And(t1, t1, Operand(1 << Map::kIsCallable)); |
2187 __ Branch(&non_callable, eq, t1, Operand(zero_reg)); | 2170 __ Branch(&non_callable, eq, t1, Operand(zero_reg)); |
2188 // Overwrite the original receiver with the (original) target. | 2171 // Overwrite the original receiver with the (original) target. |
2189 __ dsll(at, a0, kPointerSizeLog2); | 2172 __ Dlsa(at, sp, a0, kPointerSizeLog2); |
2190 __ daddu(at, sp, at); | |
2191 __ sd(a1, MemOperand(at)); | 2173 __ sd(a1, MemOperand(at)); |
2192 // Let the "call_as_function_delegate" take care of the rest. | 2174 // Let the "call_as_function_delegate" take care of the rest. |
2193 __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1); | 2175 __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1); |
2194 __ Jump(masm->isolate()->builtins()->CallFunction( | 2176 __ Jump(masm->isolate()->builtins()->CallFunction( |
2195 ConvertReceiverMode::kNotNullOrUndefined), | 2177 ConvertReceiverMode::kNotNullOrUndefined), |
2196 RelocInfo::CODE_TARGET); | 2178 RelocInfo::CODE_TARGET); |
2197 | 2179 |
2198 // 3. Call to something that is not callable. | 2180 // 3. Call to something that is not callable. |
2199 __ bind(&non_callable); | 2181 __ bind(&non_callable); |
2200 { | 2182 { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2266 } | 2248 } |
2267 __ bind(&done); | 2249 __ bind(&done); |
2268 } | 2250 } |
2269 | 2251 |
2270 // Relocate arguments down the stack. | 2252 // Relocate arguments down the stack. |
2271 { | 2253 { |
2272 Label loop, done_loop; | 2254 Label loop, done_loop; |
2273 __ mov(a5, zero_reg); | 2255 __ mov(a5, zero_reg); |
2274 __ bind(&loop); | 2256 __ bind(&loop); |
2275 __ Branch(&done_loop, ge, a5, Operand(a0)); | 2257 __ Branch(&done_loop, ge, a5, Operand(a0)); |
2276 __ dsll(a6, a4, kPointerSizeLog2); | 2258 __ Dlsa(a6, sp, a4, kPointerSizeLog2); |
2277 __ daddu(a6, a6, sp); | |
2278 __ ld(at, MemOperand(a6)); | 2259 __ ld(at, MemOperand(a6)); |
2279 __ dsll(a6, a5, kPointerSizeLog2); | 2260 __ Dlsa(a6, sp, a5, kPointerSizeLog2); |
2280 __ daddu(a6, a6, sp); | |
2281 __ sd(at, MemOperand(a6)); | 2261 __ sd(at, MemOperand(a6)); |
2282 __ Daddu(a4, a4, Operand(1)); | 2262 __ Daddu(a4, a4, Operand(1)); |
2283 __ Daddu(a5, a5, Operand(1)); | 2263 __ Daddu(a5, a5, Operand(1)); |
2284 __ Branch(&loop); | 2264 __ Branch(&loop); |
2285 __ bind(&done_loop); | 2265 __ bind(&done_loop); |
2286 } | 2266 } |
2287 | 2267 |
2288 // Copy [[BoundArguments]] to the stack (below the arguments). | 2268 // Copy [[BoundArguments]] to the stack (below the arguments). |
2289 { | 2269 { |
2290 Label loop, done_loop; | 2270 Label loop, done_loop; |
2291 __ ld(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); | 2271 __ ld(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); |
2292 __ SmiUntag(a4); | 2272 __ SmiUntag(a4); |
2293 __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 2273 __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
2294 __ bind(&loop); | 2274 __ bind(&loop); |
2295 __ Dsubu(a4, a4, Operand(1)); | 2275 __ Dsubu(a4, a4, Operand(1)); |
2296 __ Branch(&done_loop, lt, a4, Operand(zero_reg)); | 2276 __ Branch(&done_loop, lt, a4, Operand(zero_reg)); |
2297 __ dsll(a5, a4, kPointerSizeLog2); | 2277 __ Dlsa(a5, a2, a4, kPointerSizeLog2); |
2298 __ daddu(a5, a5, a2); | |
2299 __ ld(at, MemOperand(a5)); | 2278 __ ld(at, MemOperand(a5)); |
2300 __ dsll(a5, a0, kPointerSizeLog2); | 2279 __ Dlsa(a5, sp, a0, kPointerSizeLog2); |
2301 __ daddu(a5, a5, sp); | |
2302 __ sd(at, MemOperand(a5)); | 2280 __ sd(at, MemOperand(a5)); |
2303 __ Daddu(a0, a0, Operand(1)); | 2281 __ Daddu(a0, a0, Operand(1)); |
2304 __ Branch(&loop); | 2282 __ Branch(&loop); |
2305 __ bind(&done_loop); | 2283 __ bind(&done_loop); |
2306 } | 2284 } |
2307 | 2285 |
2308 // Patch new.target to [[BoundTargetFunction]] if new.target equals target. | 2286 // Patch new.target to [[BoundTargetFunction]] if new.target equals target. |
2309 { | 2287 { |
2310 Label skip_load; | 2288 Label skip_load; |
2311 __ Branch(&skip_load, ne, a1, Operand(a3)); | 2289 __ Branch(&skip_load, ne, a1, Operand(a3)); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2370 __ Jump(masm->isolate()->builtins()->ConstructBoundFunction(), | 2348 __ Jump(masm->isolate()->builtins()->ConstructBoundFunction(), |
2371 RelocInfo::CODE_TARGET, eq, t2, Operand(JS_BOUND_FUNCTION_TYPE)); | 2349 RelocInfo::CODE_TARGET, eq, t2, Operand(JS_BOUND_FUNCTION_TYPE)); |
2372 | 2350 |
2373 // Only dispatch to proxies after checking whether they are constructors. | 2351 // Only dispatch to proxies after checking whether they are constructors. |
2374 __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, | 2352 __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, |
2375 eq, t2, Operand(JS_PROXY_TYPE)); | 2353 eq, t2, Operand(JS_PROXY_TYPE)); |
2376 | 2354 |
2377 // Called Construct on an exotic Object with a [[Construct]] internal method. | 2355 // Called Construct on an exotic Object with a [[Construct]] internal method. |
2378 { | 2356 { |
2379 // Overwrite the original receiver with the (original) target. | 2357 // Overwrite the original receiver with the (original) target. |
2380 __ dsll(at, a0, kPointerSizeLog2); | 2358 __ Dlsa(at, sp, a0, kPointerSizeLog2); |
2381 __ daddu(at, sp, at); | |
2382 __ sd(a1, MemOperand(at)); | 2359 __ sd(a1, MemOperand(at)); |
2383 // Let the "call_as_constructor_delegate" take care of the rest. | 2360 // Let the "call_as_constructor_delegate" take care of the rest. |
2384 __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1); | 2361 __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1); |
2385 __ Jump(masm->isolate()->builtins()->CallFunction(), | 2362 __ Jump(masm->isolate()->builtins()->CallFunction(), |
2386 RelocInfo::CODE_TARGET); | 2363 RelocInfo::CODE_TARGET); |
2387 } | 2364 } |
2388 | 2365 |
2389 // Called Construct on an Object that doesn't have a [[Construct]] internal | 2366 // Called Construct on an Object that doesn't have a [[Construct]] internal |
2390 // method. | 2367 // method. |
2391 __ bind(&non_constructor); | 2368 __ bind(&non_constructor); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2548 } | 2525 } |
2549 } | 2526 } |
2550 | 2527 |
2551 | 2528 |
2552 #undef __ | 2529 #undef __ |
2553 | 2530 |
2554 } // namespace internal | 2531 } // namespace internal |
2555 } // namespace v8 | 2532 } // namespace v8 |
2556 | 2533 |
2557 #endif // V8_TARGET_ARCH_MIPS64 | 2534 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |