Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Side by Side Diff: runtime/vm/simulator_arm.cc

Issue 23549013: Preserves callee-saved FPU registers on ARM (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/constants_arm.h ('k') | runtime/vm/stack_frame_arm.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <math.h> // for isnan. 5 #include <math.h> // for isnan.
6 #include <setjmp.h> 6 #include <setjmp.h>
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include "vm/globals.h" 9 #include "vm/globals.h"
10 #if defined(TARGET_ARCH_ARM) 10 #if defined(TARGET_ARCH_ARM)
(...skipping 3571 matching lines...) Expand 10 before | Expand all | Expand 10 after
3582 // simulator code and therefore is regarded as a callee-saved register. 3582 // simulator code and therefore is regarded as a callee-saved register.
3583 int32_t r4_val = get_register(R4); 3583 int32_t r4_val = get_register(R4);
3584 int32_t r5_val = get_register(R5); 3584 int32_t r5_val = get_register(R5);
3585 int32_t r6_val = get_register(R6); 3585 int32_t r6_val = get_register(R6);
3586 int32_t r7_val = get_register(R7); 3586 int32_t r7_val = get_register(R7);
3587 int32_t r8_val = get_register(R8); 3587 int32_t r8_val = get_register(R8);
3588 int32_t r9_val = get_register(R9); 3588 int32_t r9_val = get_register(R9);
3589 int32_t r10_val = get_register(R10); 3589 int32_t r10_val = get_register(R10);
3590 int32_t r11_val = get_register(R11); 3590 int32_t r11_val = get_register(R11);
3591 3591
3592 double d8_val = get_dregister(D8);
3593 double d9_val = get_dregister(D9);
3594 double d10_val = get_dregister(D10);
3595 double d11_val = get_dregister(D11);
3596 double d12_val = get_dregister(D12);
3597 double d13_val = get_dregister(D13);
3598 double d14_val = get_dregister(D14);
3599 double d15_val = get_dregister(D15);
3600
3592 // Setup the callee-saved registers with a known value. To be able to check 3601 // Setup the callee-saved registers with a known value. To be able to check
3593 // that they are preserved properly across dart execution. 3602 // that they are preserved properly across dart execution.
3594 int32_t callee_saved_value = icount_; 3603 int32_t callee_saved_value = icount_;
3595 set_register(R4, callee_saved_value); 3604 set_register(R4, callee_saved_value);
3596 set_register(R5, callee_saved_value); 3605 set_register(R5, callee_saved_value);
3597 set_register(R6, callee_saved_value); 3606 set_register(R6, callee_saved_value);
3598 set_register(R7, callee_saved_value); 3607 set_register(R7, callee_saved_value);
3599 set_register(R8, callee_saved_value); 3608 set_register(R8, callee_saved_value);
3600 set_register(R9, callee_saved_value); 3609 set_register(R9, callee_saved_value);
3601 set_register(R10, callee_saved_value); 3610 set_register(R10, callee_saved_value);
3602 set_register(R11, callee_saved_value); 3611 set_register(R11, callee_saved_value);
3603 3612
3613 double callee_saved_dvalue = static_cast<double>(icount_);
3614 set_dregister(D8, callee_saved_dvalue);
3615 set_dregister(D9, callee_saved_dvalue);
3616 set_dregister(D10, callee_saved_dvalue);
3617 set_dregister(D11, callee_saved_dvalue);
3618 set_dregister(D12, callee_saved_dvalue);
3619 set_dregister(D13, callee_saved_dvalue);
3620 set_dregister(D14, callee_saved_dvalue);
3621 set_dregister(D15, callee_saved_dvalue);
3622
3604 // Start the simulation 3623 // Start the simulation
3605 Execute(); 3624 Execute();
3606 3625
3607 // Check that the callee-saved registers have been preserved. 3626 // Check that the callee-saved registers have been preserved.
3608 ASSERT(callee_saved_value == get_register(R4)); 3627 ASSERT(callee_saved_value == get_register(R4));
3609 ASSERT(callee_saved_value == get_register(R5)); 3628 ASSERT(callee_saved_value == get_register(R5));
3610 ASSERT(callee_saved_value == get_register(R6)); 3629 ASSERT(callee_saved_value == get_register(R6));
3611 ASSERT(callee_saved_value == get_register(R7)); 3630 ASSERT(callee_saved_value == get_register(R7));
3612 ASSERT(callee_saved_value == get_register(R8)); 3631 ASSERT(callee_saved_value == get_register(R8));
3613 ASSERT(callee_saved_value == get_register(R9)); 3632 ASSERT(callee_saved_value == get_register(R9));
3614 ASSERT(callee_saved_value == get_register(R10)); 3633 ASSERT(callee_saved_value == get_register(R10));
3615 ASSERT(callee_saved_value == get_register(R11)); 3634 ASSERT(callee_saved_value == get_register(R11));
3616 3635
3636 ASSERT(callee_saved_dvalue == get_dregister(D8));
3637 ASSERT(callee_saved_dvalue == get_dregister(D9));
3638 ASSERT(callee_saved_dvalue == get_dregister(D10));
3639 ASSERT(callee_saved_dvalue == get_dregister(D11));
3640 ASSERT(callee_saved_dvalue == get_dregister(D12));
3641 ASSERT(callee_saved_dvalue == get_dregister(D13));
3642 ASSERT(callee_saved_dvalue == get_dregister(D14));
3643 ASSERT(callee_saved_dvalue == get_dregister(D15));
3644
3617 // Restore callee-saved registers with the original value. 3645 // Restore callee-saved registers with the original value.
3618 set_register(R4, r4_val); 3646 set_register(R4, r4_val);
3619 set_register(R5, r5_val); 3647 set_register(R5, r5_val);
3620 set_register(R6, r6_val); 3648 set_register(R6, r6_val);
3621 set_register(R7, r7_val); 3649 set_register(R7, r7_val);
3622 set_register(R8, r8_val); 3650 set_register(R8, r8_val);
3623 set_register(R9, r9_val); 3651 set_register(R9, r9_val);
3624 set_register(R10, r10_val); 3652 set_register(R10, r10_val);
3625 set_register(R11, r11_val); 3653 set_register(R11, r11_val);
3626 3654
3655 set_dregister(D8, d8_val);
3656 set_dregister(D9, d9_val);
3657 set_dregister(D10, d10_val);
3658 set_dregister(D11, d11_val);
3659 set_dregister(D12, d12_val);
3660 set_dregister(D13, d13_val);
3661 set_dregister(D14, d14_val);
3662 set_dregister(D15, d15_val);
3663
3627 // Restore the SP register and return R1:R0. 3664 // Restore the SP register and return R1:R0.
3628 set_register(SP, sp_before_call); 3665 set_register(SP, sp_before_call);
3629 int64_t return_value; 3666 int64_t return_value;
3630 if (fp_return) { 3667 if (fp_return) {
3631 return_value = bit_cast<int64_t, double>(get_dregister(D0)); 3668 return_value = bit_cast<int64_t, double>(get_dregister(D0));
3632 } else { 3669 } else {
3633 return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1)); 3670 return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1));
3634 } 3671 }
3635 return return_value; 3672 return return_value;
3636 } 3673 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3668 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); 3705 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
3669 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); 3706 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace));
3670 buf->Longjmp(); 3707 buf->Longjmp();
3671 } 3708 }
3672 3709
3673 } // namespace dart 3710 } // namespace dart
3674 3711
3675 #endif // !defined(HOST_ARCH_ARM) 3712 #endif // !defined(HOST_ARCH_ARM)
3676 3713
3677 #endif // defined TARGET_ARCH_ARM 3714 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/constants_arm.h ('k') | runtime/vm/stack_frame_arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698