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_ARM | 5 #if V8_TARGET_ARCH_ARM |
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 1364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 } | 1375 } |
1376 __ Jump(masm->isolate()->builtins()->OnStackReplacement(), | 1376 __ Jump(masm->isolate()->builtins()->OnStackReplacement(), |
1377 RelocInfo::CODE_TARGET); | 1377 RelocInfo::CODE_TARGET); |
1378 | 1378 |
1379 __ bind(&ok); | 1379 __ bind(&ok); |
1380 __ Ret(); | 1380 __ Ret(); |
1381 } | 1381 } |
1382 | 1382 |
1383 | 1383 |
1384 // static | 1384 // static |
1385 void Builtins::Generate_FunctionCall(MacroAssembler* masm) { | 1385 void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { |
1386 // 1. Make sure we have at least one argument. | |
1387 // r0: actual number of arguments | |
1388 { | |
1389 Label done; | |
1390 __ cmp(r0, Operand::Zero()); | |
1391 __ b(ne, &done); | |
1392 __ PushRoot(Heap::kUndefinedValueRootIndex); | |
1393 __ add(r0, r0, Operand(1)); | |
1394 __ bind(&done); | |
1395 } | |
1396 | |
1397 // 2. Get the callable to call (passed as receiver) from the stack. | |
1398 // r0: actual number of arguments | |
1399 __ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2)); | |
1400 | |
1401 // 3. Shift arguments and return address one slot down on the stack | |
1402 // (overwriting the original receiver). Adjust argument count to make | |
1403 // the original first argument the new receiver. | |
1404 // r0: actual number of arguments | |
1405 // r1: callable | |
1406 { | |
1407 Label loop; | |
1408 // Calculate the copy start address (destination). Copy end address is sp. | |
1409 __ add(r2, sp, Operand(r0, LSL, kPointerSizeLog2)); | |
1410 | |
1411 __ bind(&loop); | |
1412 __ ldr(ip, MemOperand(r2, -kPointerSize)); | |
1413 __ str(ip, MemOperand(r2)); | |
1414 __ sub(r2, r2, Operand(kPointerSize)); | |
1415 __ cmp(r2, sp); | |
1416 __ b(ne, &loop); | |
1417 // Adjust the actual number of arguments and remove the top element | |
1418 // (which is a copy of the last argument). | |
1419 __ sub(r0, r0, Operand(1)); | |
1420 __ pop(); | |
1421 } | |
1422 | |
1423 // 4. Call the callable. | |
1424 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | |
1425 } | |
1426 | |
1427 | |
1428 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { | |
1429 // ----------- S t a t e ------------- | 1386 // ----------- S t a t e ------------- |
1430 // -- r0 : argc | 1387 // -- r0 : argc |
1431 // -- sp[0] : argArray | 1388 // -- sp[0] : argArray |
1432 // -- sp[4] : thisArg | 1389 // -- sp[4] : thisArg |
1433 // -- sp[8] : receiver | 1390 // -- sp[8] : receiver |
1434 // ----------------------------------- | 1391 // ----------------------------------- |
1435 | 1392 |
1436 // 1. Load receiver into r1, argArray into r0 (if present), remove all | 1393 // 1. Load receiver into r1, argArray into r0 (if present), remove all |
1437 // arguments from the stack (including the receiver), and push thisArg (if | 1394 // arguments from the stack (including the receiver), and push thisArg (if |
1438 // present) instead. | 1395 // present) instead. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1483 | 1440 |
1484 // 4c. The receiver is not callable, throw an appropriate TypeError. | 1441 // 4c. The receiver is not callable, throw an appropriate TypeError. |
1485 __ bind(&receiver_not_callable); | 1442 __ bind(&receiver_not_callable); |
1486 { | 1443 { |
1487 __ str(r1, MemOperand(sp, 0)); | 1444 __ str(r1, MemOperand(sp, 0)); |
1488 __ TailCallRuntime(Runtime::kThrowApplyNonFunction, 1, 1); | 1445 __ TailCallRuntime(Runtime::kThrowApplyNonFunction, 1, 1); |
1489 } | 1446 } |
1490 } | 1447 } |
1491 | 1448 |
1492 | 1449 |
| 1450 // static |
| 1451 void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { |
| 1452 // 1. Make sure we have at least one argument. |
| 1453 // r0: actual number of arguments |
| 1454 { |
| 1455 Label done; |
| 1456 __ cmp(r0, Operand::Zero()); |
| 1457 __ b(ne, &done); |
| 1458 __ PushRoot(Heap::kUndefinedValueRootIndex); |
| 1459 __ add(r0, r0, Operand(1)); |
| 1460 __ bind(&done); |
| 1461 } |
| 1462 |
| 1463 // 2. Get the callable to call (passed as receiver) from the stack. |
| 1464 // r0: actual number of arguments |
| 1465 __ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 1466 |
| 1467 // 3. Shift arguments and return address one slot down on the stack |
| 1468 // (overwriting the original receiver). Adjust argument count to make |
| 1469 // the original first argument the new receiver. |
| 1470 // r0: actual number of arguments |
| 1471 // r1: callable |
| 1472 { |
| 1473 Label loop; |
| 1474 // Calculate the copy start address (destination). Copy end address is sp. |
| 1475 __ add(r2, sp, Operand(r0, LSL, kPointerSizeLog2)); |
| 1476 |
| 1477 __ bind(&loop); |
| 1478 __ ldr(ip, MemOperand(r2, -kPointerSize)); |
| 1479 __ str(ip, MemOperand(r2)); |
| 1480 __ sub(r2, r2, Operand(kPointerSize)); |
| 1481 __ cmp(r2, sp); |
| 1482 __ b(ne, &loop); |
| 1483 // Adjust the actual number of arguments and remove the top element |
| 1484 // (which is a copy of the last argument). |
| 1485 __ sub(r0, r0, Operand(1)); |
| 1486 __ pop(); |
| 1487 } |
| 1488 |
| 1489 // 4. Call the callable. |
| 1490 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); |
| 1491 } |
| 1492 |
| 1493 |
1493 void Builtins::Generate_ReflectApply(MacroAssembler* masm) { | 1494 void Builtins::Generate_ReflectApply(MacroAssembler* masm) { |
1494 // ----------- S t a t e ------------- | 1495 // ----------- S t a t e ------------- |
1495 // -- r0 : argc | 1496 // -- r0 : argc |
1496 // -- sp[0] : argumentsList | 1497 // -- sp[0] : argumentsList |
1497 // -- sp[4] : thisArgument | 1498 // -- sp[4] : thisArgument |
1498 // -- sp[8] : target | 1499 // -- sp[8] : target |
1499 // -- sp[12] : receiver | 1500 // -- sp[12] : receiver |
1500 // ----------------------------------- | 1501 // ----------------------------------- |
1501 | 1502 |
1502 // 1. Load target into r1 (if present), argumentsList into r0 (if present), | 1503 // 1. Load target into r1 (if present), argumentsList into r0 (if present), |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2174 } | 2175 } |
2175 } | 2176 } |
2176 | 2177 |
2177 | 2178 |
2178 #undef __ | 2179 #undef __ |
2179 | 2180 |
2180 } // namespace internal | 2181 } // namespace internal |
2181 } // namespace v8 | 2182 } // namespace v8 |
2182 | 2183 |
2183 #endif // V8_TARGET_ARCH_ARM | 2184 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |