diff options
| author | Mike Pall <mike> | 2011-03-29 02:31:47 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-03-29 02:31:47 +0200 |
| commit | 7b0a125cf76e67df2f1e43f8e3ac4ca08851a7b3 (patch) | |
| tree | 0d4bf8a484c884329f88b45bdfd0c1d16be0a1ee /src | |
| parent | ca494b72a949571f10d5d5ef415c3f4d3a09a046 (diff) | |
| download | luajit-7b0a125cf76e67df2f1e43f8e3ac4ca08851a7b3.tar.gz luajit-7b0a125cf76e67df2f1e43f8e3ac4ca08851a7b3.tar.bz2 luajit-7b0a125cf76e67df2f1e43f8e3ac4ca08851a7b3.zip | |
ARM: Add basic unary bytecode instructions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_arm.dasc | 107 |
1 files changed, 97 insertions, 10 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 650aa31c..0389e6ce 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
| @@ -684,7 +684,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 684 | | | 684 | | |
| 685 | |.ffunc_bit_op band, and | 685 | |.ffunc_bit_op band, and |
| 686 | |.ffunc_bit_op bor, or | 686 | |.ffunc_bit_op bor, or |
| 687 | |.ffunc_bit_op bxor, xor | 687 | |.ffunc_bit_op bxor, eor |
| 688 | | | 688 | | |
| 689 | |.ffunc_bit bswap | 689 | |.ffunc_bit bswap |
| 690 | | NYI | 690 | | NYI |
| @@ -850,16 +850,67 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 850 | /* -- Unary ops --------------------------------------------------------- */ | 850 | /* -- Unary ops --------------------------------------------------------- */ |
| 851 | 851 | ||
| 852 | case BC_MOV: | 852 | case BC_MOV: |
| 853 | | NYI | 853 | | // RA = dst*8, RC = src |
| 854 | | lsl RC, RC, #3 | ||
| 855 | | ins_next1 | ||
| 856 | | ldrd CARG12, [BASE, RC] | ||
| 857 | | ins_next2 | ||
| 858 | | strd CARG12, [BASE, RA] | ||
| 859 | | ins_next3 | ||
| 854 | break; | 860 | break; |
| 855 | case BC_NOT: | 861 | case BC_NOT: |
| 856 | | NYI | 862 | | // RA = dst*8, RC = src |
| 863 | | add RC, BASE, RC, lsl #3 | ||
| 864 | | ins_next1 | ||
| 865 | | ldr CARG1, [RC, #4] | ||
| 866 | | add RA, BASE, RA | ||
| 867 | | ins_next2 | ||
| 868 | | cmn CARG1, #-LJ_TTRUE | ||
| 869 | | mvnls CARG2, #~LJ_TFALSE | ||
| 870 | | mvnhi CARG2, #~LJ_TTRUE | ||
| 871 | | str CARG2, [RA, #4] | ||
| 872 | | ins_next3 | ||
| 857 | break; | 873 | break; |
| 858 | case BC_UNM: | 874 | case BC_UNM: |
| 859 | | NYI | 875 | | // RA = dst*8, RC = src |
| 876 | | lsl RC, RC, #3 | ||
| 877 | | ldrd CARG12, [BASE, RC] | ||
| 878 | | ins_next1 | ||
| 879 | | ins_next2 | ||
| 880 | | cmn CARG2, #-LJ_TISNUM | ||
| 881 | | bne >5 | ||
| 882 | | rsbs CARG1, CARG1, #0 | ||
| 883 | | bvs >4 | ||
| 884 | |9: | ||
| 885 | | strd CARG12, [BASE, RA] | ||
| 886 | | ins_next3 | ||
| 887 | |4: | ||
| 888 | | mov CARG2, #0x01e00000 // 2^31. | ||
| 889 | | mov CARG1, #0 | ||
| 890 | | orr CARG2, CARG2, #0x40000000 | ||
| 891 | | b <9 | ||
| 892 | |5: | ||
| 893 | | bhi ->vmeta_unm | ||
| 894 | | add CARG2, CARG2, #0x80000000 | ||
| 895 | | b <9 | ||
| 860 | break; | 896 | break; |
| 861 | case BC_LEN: | 897 | case BC_LEN: |
| 862 | | NYI | 898 | | // RA = dst*8, RC = src |
| 899 | | lsl RC, RC, #3 | ||
| 900 | | ldrd CARG12, [BASE, RC] | ||
| 901 | | checkstr CARG2, >2 | ||
| 902 | | ldr CARG1, STR:CARG1->len | ||
| 903 | |1: | ||
| 904 | | mvn CARG2, #~LJ_TISNUM | ||
| 905 | | ins_next1 | ||
| 906 | | ins_next2 | ||
| 907 | | strd CARG12, [BASE, RA] | ||
| 908 | | ins_next3 | ||
| 909 | |2: | ||
| 910 | | checktab CARG2, ->vmeta_len | ||
| 911 | | blx extern lj_tab_len // (GCtab *t) | ||
| 912 | | // Returns uint32_t (but less than 2^31). | ||
| 913 | | b <1 | ||
| 863 | break; | 914 | break; |
| 864 | 915 | ||
| 865 | /* -- Binary ops -------------------------------------------------------- */ | 916 | /* -- Binary ops -------------------------------------------------------- */ |
| @@ -893,7 +944,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 893 | /* -- Constant ops ------------------------------------------------------ */ | 944 | /* -- Constant ops ------------------------------------------------------ */ |
| 894 | 945 | ||
| 895 | case BC_KSTR: | 946 | case BC_KSTR: |
| 896 | | NYI | 947 | | // RA = dst*8, RC = str_const (~) |
| 948 | | mvn RC, RC | ||
| 949 | | ins_next1 | ||
| 950 | | ldr CARG1, [KBASE, RC, lsl #2] | ||
| 951 | | ins_next2 | ||
| 952 | | mvn CARG2, #~LJ_TSTR | ||
| 953 | | strd CARG12, [BASE, RA] | ||
| 954 | | ins_next3 | ||
| 897 | break; | 955 | break; |
| 898 | case BC_KCDATA: | 956 | case BC_KCDATA: |
| 899 | #if LJ_HASFFI | 957 | #if LJ_HASFFI |
| @@ -901,16 +959,45 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 901 | #endif | 959 | #endif |
| 902 | break; | 960 | break; |
| 903 | case BC_KSHORT: | 961 | case BC_KSHORT: |
| 904 | | NYI | 962 | | // RA = dst*8, (RC = int16_literal) |
| 963 | | mov CARG1, INS, asr #16 // Refetch sign-extended reg. | ||
| 964 | | mvn CARG2, #~LJ_TISNUM | ||
| 965 | | ins_next1 | ||
| 966 | | ins_next2 | ||
| 967 | | strd CARG12, [BASE, RA] | ||
| 968 | | ins_next3 | ||
| 905 | break; | 969 | break; |
| 906 | case BC_KNUM: | 970 | case BC_KNUM: |
| 907 | | NYI | 971 | | // RA = dst*8, RC = num_const |
| 972 | | lsl RC, RC, #3 | ||
| 973 | | ins_next1 | ||
| 974 | | ldrd CARG12, [KBASE, RC] | ||
| 975 | | ins_next2 | ||
| 976 | | strd CARG12, [BASE, RA] | ||
| 977 | | ins_next3 | ||
| 908 | break; | 978 | break; |
| 909 | case BC_KPRI: | 979 | case BC_KPRI: |
| 910 | | NYI | 980 | | // RA = dst*8, RC = primitive_type (~) |
| 981 | | add RA, BASE, RA | ||
| 982 | | mvn RC, RC | ||
| 983 | | ins_next1 | ||
| 984 | | ins_next2 | ||
| 985 | | str RC, [RA, #4] | ||
| 986 | | ins_next3 | ||
| 911 | break; | 987 | break; |
| 912 | case BC_KNIL: | 988 | case BC_KNIL: |
| 913 | | NYI | 989 | | // RA = base*8, RC = end |
| 990 | | add RA, BASE, RA | ||
| 991 | | add RC, BASE, RC, lsl #3 | ||
| 992 | | mvn CARG1, #~LJ_TNIL | ||
| 993 | | str CARG1, [RA, #4] | ||
| 994 | | add RA, RA, #8 | ||
| 995 | |1: | ||
| 996 | | str CARG1, [RA, #4] | ||
| 997 | | cmp RA, RC | ||
| 998 | | add RA, RA, #8 | ||
| 999 | | blt <1 | ||
| 1000 | | ins_next_ | ||
| 914 | break; | 1001 | break; |
| 915 | 1002 | ||
| 916 | /* -- Upvalue and function ops ------------------------------------------ */ | 1003 | /* -- Upvalue and function ops ------------------------------------------ */ |
