OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 __ LeaveStubFrame(); | 387 __ LeaveStubFrame(); |
388 __ mov(FP, ShifterOperand(R0)); | 388 __ mov(FP, ShifterOperand(R0)); |
389 | 389 |
390 // Frame is fully rewritten at this point and it is safe to perform a GC. | 390 // Frame is fully rewritten at this point and it is safe to perform a GC. |
391 // Materialize any objects that were deferred by FillFrame because they | 391 // Materialize any objects that were deferred by FillFrame because they |
392 // require allocation. | 392 // require allocation. |
393 __ EnterStubFrame(); | 393 __ EnterStubFrame(); |
394 if (preserve_result) { | 394 if (preserve_result) { |
395 __ Push(R1); // Preserve result, it will be GC-d here. | 395 __ Push(R1); // Preserve result, it will be GC-d here. |
396 } | 396 } |
397 __ CallRuntime(kDeoptimizeMaterializeDoublesRuntimeEntry); | 397 __ PushObject(Smi::ZoneHandle()); // Space for the result. |
| 398 __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry); |
| 399 // Result tells stub how many bytes to remove from the expression stack |
| 400 // of the bottom-most frame. They were used as materialization arguments. |
| 401 __ Pop(R1); |
398 if (preserve_result) { | 402 if (preserve_result) { |
399 __ Pop(R0); // Restore result. | 403 __ Pop(R0); // Restore result. |
400 } | 404 } |
401 __ LeaveStubFrame(); | 405 __ LeaveStubFrame(); |
| 406 // Remove materialization arguments. |
| 407 __ add(SP, SP, ShifterOperand(R1, ASR, kSmiTagSize)); |
402 __ Ret(); | 408 __ Ret(); |
403 } | 409 } |
404 | 410 |
405 | 411 |
406 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) { | 412 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) { |
407 // Correct return address to point just after the call that is being | 413 // Correct return address to point just after the call that is being |
408 // deoptimized. | 414 // deoptimized. |
409 __ AddImmediate(LR, -CallPattern::kFixedLengthInBytes); | 415 __ AddImmediate(LR, -CallPattern::kFixedLengthInBytes); |
410 GenerateDeoptimizationSequence(assembler, true); // Preserve R0. | 416 GenerateDeoptimizationSequence(assembler, true); // Preserve R0. |
411 } | 417 } |
(...skipping 1511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1923 __ Bind(&reference_compare); | 1929 __ Bind(&reference_compare); |
1924 __ cmp(left, ShifterOperand(right)); | 1930 __ cmp(left, ShifterOperand(right)); |
1925 __ Bind(&done); | 1931 __ Bind(&done); |
1926 __ PopList((1 << R0) | (1 << R1) | (1 << R2)); | 1932 __ PopList((1 << R0) | (1 << R1) | (1 << R2)); |
1927 __ Ret(); | 1933 __ Ret(); |
1928 } | 1934 } |
1929 | 1935 |
1930 } // namespace dart | 1936 } // namespace dart |
1931 | 1937 |
1932 #endif // defined TARGET_ARCH_ARM | 1938 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |