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

Side by Side Diff: src/arm/simulator-arm.cc

Issue 709123005: [arm] Recognize SXTB, SXTH, UXTB and UXTH. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month 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 | « src/arm/disasm-arm.cc ('k') | src/compiler/arm/code-generator-arm.cc » ('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 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
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
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
OLDNEW
« no previous file with comments | « src/arm/disasm-arm.cc ('k') | src/compiler/arm/code-generator-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698