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 #include <stdarg.h> | 5 #include <stdarg.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 2611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2622 set_register(rd, rm_val); | 2622 set_register(rd, rm_val); |
2623 break; | 2623 break; |
2624 } | 2624 } |
2625 } | 2625 } |
2626 } else { | 2626 } else { |
2627 switch (instr->Bits(22, 21)) { | 2627 switch (instr->Bits(22, 21)) { |
2628 case 0: | 2628 case 0: |
2629 UNIMPLEMENTED(); | 2629 UNIMPLEMENTED(); |
2630 break; | 2630 break; |
2631 case 1: | 2631 case 1: |
2632 UNIMPLEMENTED(); | 2632 if (instr->Bits(9, 6) == 1) { |
| 2633 if (instr->Bit(20) == 0) { |
| 2634 if (instr->Bits(19, 16) == 0xF) { |
| 2635 // Sxtb. |
| 2636 int32_t rm_val = get_register(instr->RmValue()); |
| 2637 int32_t rotate = instr->Bits(11, 10); |
| 2638 switch (rotate) { |
| 2639 case 0: |
| 2640 break; |
| 2641 case 1: |
| 2642 rm_val = (rm_val >> 8) | (rm_val << 24); |
| 2643 break; |
| 2644 case 2: |
| 2645 rm_val = (rm_val >> 16) | (rm_val << 16); |
| 2646 break; |
| 2647 case 3: |
| 2648 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2649 break; |
| 2650 } |
| 2651 set_register(rd, static_cast<int8_t>(rm_val)); |
| 2652 } else { |
| 2653 // Sxtab. |
| 2654 int32_t rn_val = get_register(rn); |
| 2655 int32_t rm_val = get_register(instr->RmValue()); |
| 2656 int32_t rotate = instr->Bits(11, 10); |
| 2657 switch (rotate) { |
| 2658 case 0: |
| 2659 break; |
| 2660 case 1: |
| 2661 rm_val = (rm_val >> 8) | (rm_val << 24); |
| 2662 break; |
| 2663 case 2: |
| 2664 rm_val = (rm_val >> 16) | (rm_val << 16); |
| 2665 break; |
| 2666 case 3: |
| 2667 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2668 break; |
| 2669 } |
| 2670 set_register(rd, rn_val + static_cast<int8_t>(rm_val)); |
| 2671 } |
| 2672 } else { |
| 2673 if (instr->Bits(19, 16) == 0xF) { |
| 2674 // Sxth. |
| 2675 int32_t rm_val = get_register(instr->RmValue()); |
| 2676 int32_t rotate = instr->Bits(11, 10); |
| 2677 switch (rotate) { |
| 2678 case 0: |
| 2679 break; |
| 2680 case 1: |
| 2681 rm_val = (rm_val >> 8) | (rm_val << 24); |
| 2682 break; |
| 2683 case 2: |
| 2684 rm_val = (rm_val >> 16) | (rm_val << 16); |
| 2685 break; |
| 2686 case 3: |
| 2687 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2688 break; |
| 2689 } |
| 2690 set_register(rd, static_cast<int16_t>(rm_val)); |
| 2691 } else { |
| 2692 // Sxtah. |
| 2693 int32_t rn_val = get_register(rn); |
| 2694 int32_t rm_val = get_register(instr->RmValue()); |
| 2695 int32_t rotate = instr->Bits(11, 10); |
| 2696 switch (rotate) { |
| 2697 case 0: |
| 2698 break; |
| 2699 case 1: |
| 2700 rm_val = (rm_val >> 8) | (rm_val << 24); |
| 2701 break; |
| 2702 case 2: |
| 2703 rm_val = (rm_val >> 16) | (rm_val << 16); |
| 2704 break; |
| 2705 case 3: |
| 2706 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2707 break; |
| 2708 } |
| 2709 set_register(rd, rn_val + static_cast<int16_t>(rm_val)); |
| 2710 } |
| 2711 } |
| 2712 } else { |
| 2713 UNREACHABLE(); |
| 2714 } |
2633 break; | 2715 break; |
2634 case 2: | 2716 case 2: |
2635 if ((instr->Bit(20) == 0) && (instr->Bits(9, 6) == 1)) { | 2717 if ((instr->Bit(20) == 0) && (instr->Bits(9, 6) == 1)) { |
2636 if (instr->Bits(19, 16) == 0xF) { | 2718 if (instr->Bits(19, 16) == 0xF) { |
2637 // Uxtb16. | 2719 // Uxtb16. |
2638 uint32_t rm_val = get_register(instr->RmValue()); | 2720 uint32_t rm_val = get_register(instr->RmValue()); |
2639 int32_t rotate = instr->Bits(11, 10); | 2721 int32_t rotate = instr->Bits(11, 10); |
2640 switch (rotate) { | 2722 switch (rotate) { |
2641 case 0: | 2723 case 0: |
2642 break; | 2724 break; |
2643 case 1: | 2725 case 1: |
2644 rm_val = (rm_val >> 8) | (rm_val << 24); | 2726 rm_val = (rm_val >> 8) | (rm_val << 24); |
2645 break; | 2727 break; |
2646 case 2: | 2728 case 2: |
2647 rm_val = (rm_val >> 16) | (rm_val << 16); | 2729 rm_val = (rm_val >> 16) | (rm_val << 16); |
2648 break; | 2730 break; |
2649 case 3: | 2731 case 3: |
2650 rm_val = (rm_val >> 24) | (rm_val << 8); | 2732 rm_val = (rm_val >> 24) | (rm_val << 8); |
2651 break; | 2733 break; |
2652 } | 2734 } |
2653 set_register(rd, | 2735 set_register(rd, (rm_val & 0xFF) | (rm_val & 0xFF0000)); |
2654 (rm_val & 0xFF) | (rm_val & 0xFF0000)); | |
2655 } else { | 2736 } else { |
2656 UNIMPLEMENTED(); | 2737 UNIMPLEMENTED(); |
2657 } | 2738 } |
2658 } else { | 2739 } else { |
2659 UNIMPLEMENTED(); | 2740 UNIMPLEMENTED(); |
2660 } | 2741 } |
2661 break; | 2742 break; |
2662 case 3: | 2743 case 3: |
2663 if ((instr->Bit(20) == 0) && (instr->Bits(9, 6) == 1)) { | 2744 if ((instr->Bits(9, 6) == 1)) { |
2664 if (instr->Bits(19, 16) == 0xF) { | 2745 if (instr->Bit(20) == 0) { |
2665 // Uxtb. | 2746 if (instr->Bits(19, 16) == 0xF) { |
2666 uint32_t rm_val = get_register(instr->RmValue()); | 2747 // Uxtb. |
2667 int32_t rotate = instr->Bits(11, 10); | 2748 uint32_t rm_val = get_register(instr->RmValue()); |
2668 switch (rotate) { | 2749 int32_t rotate = instr->Bits(11, 10); |
2669 case 0: | 2750 switch (rotate) { |
2670 break; | 2751 case 0: |
2671 case 1: | 2752 break; |
2672 rm_val = (rm_val >> 8) | (rm_val << 24); | 2753 case 1: |
2673 break; | 2754 rm_val = (rm_val >> 8) | (rm_val << 24); |
2674 case 2: | 2755 break; |
2675 rm_val = (rm_val >> 16) | (rm_val << 16); | 2756 case 2: |
2676 break; | 2757 rm_val = (rm_val >> 16) | (rm_val << 16); |
2677 case 3: | 2758 break; |
2678 rm_val = (rm_val >> 24) | (rm_val << 8); | 2759 case 3: |
2679 break; | 2760 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2761 break; |
| 2762 } |
| 2763 set_register(rd, (rm_val & 0xFF)); |
| 2764 } else { |
| 2765 // Uxtab. |
| 2766 uint32_t rn_val = get_register(rn); |
| 2767 uint32_t rm_val = get_register(instr->RmValue()); |
| 2768 int32_t rotate = instr->Bits(11, 10); |
| 2769 switch (rotate) { |
| 2770 case 0: |
| 2771 break; |
| 2772 case 1: |
| 2773 rm_val = (rm_val >> 8) | (rm_val << 24); |
| 2774 break; |
| 2775 case 2: |
| 2776 rm_val = (rm_val >> 16) | (rm_val << 16); |
| 2777 break; |
| 2778 case 3: |
| 2779 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2780 break; |
| 2781 } |
| 2782 set_register(rd, rn_val + (rm_val & 0xFF)); |
2680 } | 2783 } |
2681 set_register(rd, (rm_val & 0xFF)); | |
2682 } else { | 2784 } else { |
2683 // Uxtab. | 2785 if (instr->Bits(19, 16) == 0xF) { |
2684 uint32_t rn_val = get_register(rn); | 2786 // Uxth. |
2685 uint32_t rm_val = get_register(instr->RmValue()); | 2787 uint32_t rm_val = get_register(instr->RmValue()); |
2686 int32_t rotate = instr->Bits(11, 10); | 2788 int32_t rotate = instr->Bits(11, 10); |
2687 switch (rotate) { | 2789 switch (rotate) { |
2688 case 0: | 2790 case 0: |
2689 break; | 2791 break; |
2690 case 1: | 2792 case 1: |
2691 rm_val = (rm_val >> 8) | (rm_val << 24); | 2793 rm_val = (rm_val >> 8) | (rm_val << 24); |
2692 break; | 2794 break; |
2693 case 2: | 2795 case 2: |
2694 rm_val = (rm_val >> 16) | (rm_val << 16); | 2796 rm_val = (rm_val >> 16) | (rm_val << 16); |
2695 break; | 2797 break; |
2696 case 3: | 2798 case 3: |
2697 rm_val = (rm_val >> 24) | (rm_val << 8); | 2799 rm_val = (rm_val >> 24) | (rm_val << 8); |
2698 break; | 2800 break; |
| 2801 } |
| 2802 set_register(rd, (rm_val & 0xFFFF)); |
| 2803 } else { |
| 2804 // Uxtah. |
| 2805 uint32_t rn_val = get_register(rn); |
| 2806 uint32_t rm_val = get_register(instr->RmValue()); |
| 2807 int32_t rotate = instr->Bits(11, 10); |
| 2808 switch (rotate) { |
| 2809 case 0: |
| 2810 break; |
| 2811 case 1: |
| 2812 rm_val = (rm_val >> 8) | (rm_val << 24); |
| 2813 break; |
| 2814 case 2: |
| 2815 rm_val = (rm_val >> 16) | (rm_val << 16); |
| 2816 break; |
| 2817 case 3: |
| 2818 rm_val = (rm_val >> 24) | (rm_val << 8); |
| 2819 break; |
| 2820 } |
| 2821 set_register(rd, rn_val + (rm_val & 0xFFFF)); |
2699 } | 2822 } |
2700 set_register(rd, rn_val + (rm_val & 0xFF)); | |
2701 } | 2823 } |
2702 } else { | 2824 } else { |
2703 UNIMPLEMENTED(); | 2825 UNIMPLEMENTED(); |
2704 } | 2826 } |
2705 break; | 2827 break; |
2706 } | 2828 } |
2707 } | 2829 } |
2708 return; | 2830 return; |
2709 } | 2831 } |
2710 break; | 2832 break; |
(...skipping 1189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3900 uintptr_t address = *stack_slot; | 4022 uintptr_t address = *stack_slot; |
3901 set_register(sp, current_sp + sizeof(uintptr_t)); | 4023 set_register(sp, current_sp + sizeof(uintptr_t)); |
3902 return address; | 4024 return address; |
3903 } | 4025 } |
3904 | 4026 |
3905 } } // namespace v8::internal | 4027 } } // namespace v8::internal |
3906 | 4028 |
3907 #endif // USE_SIMULATOR | 4029 #endif // USE_SIMULATOR |
3908 | 4030 |
3909 #endif // V8_TARGET_ARCH_ARM | 4031 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |