diff options
author | Mike Pall <mike> | 2011-04-13 02:24:56 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-13 02:24:56 +0200 |
commit | 0001a7fcedfa5da45bb8489fbce6447cadd8187b (patch) | |
tree | 593e3485faa1ae22df12bfdf5f60de270f36faa5 /src | |
parent | 7aa7069271d6794d49de5dd280a6b0b1bbf3e8e2 (diff) | |
download | luajit-0001a7fcedfa5da45bb8489fbce6447cadd8187b.tar.gz luajit-0001a7fcedfa5da45bb8489fbce6447cadd8187b.tar.bz2 luajit-0001a7fcedfa5da45bb8489fbce6447cadd8187b.zip |
ARM: Add BC_VARG and BC_TSETM.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_arm.dasc | 95 |
1 files changed, 93 insertions, 2 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index def37ecb..bfa5c4ff 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
@@ -2721,7 +2721,43 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2721 | break; | 2721 | break; |
2722 | 2722 | ||
2723 | case BC_TSETM: | 2723 | case BC_TSETM: |
2724 | | NYI | 2724 | | // RA = base*8 (table at base-1), RC = num_const (start index) |
2725 | | add RA, BASE, RA | ||
2726 | |1: | ||
2727 | | ldr RB, SAVE_MULTRES | ||
2728 | | ldr TAB:CARG2, [RA, #-8] // Guaranteed to be a table. | ||
2729 | | ldr CARG4, [KBASE, RC, lsl #3] // Integer constant is in lo-word. | ||
2730 | | subs RB, RB, #8 | ||
2731 | | ldr CARG1, TAB:CARG2->asize | ||
2732 | | beq >4 // Nothing to copy? | ||
2733 | | add CARG3, CARG4, RB, lsr #3 | ||
2734 | | cmp CARG3, CARG1 | ||
2735 | | ldr CARG1, TAB:CARG2->array | ||
2736 | | add RB, RA, RB | ||
2737 | | bhi >5 | ||
2738 | | add INS, CARG1, CARG4, lsl #3 | ||
2739 | | ldrb CARG4, TAB:CARG2->marked | ||
2740 | |3: // Copy result slots to table. | ||
2741 | | ldrd CARG12, [RA], #8 | ||
2742 | | strd CARG12, [INS], #8 | ||
2743 | | cmp RA, RB | ||
2744 | | blo <3 | ||
2745 | | tst CARG4, #LJ_GC_BLACK // isblack(table) | ||
2746 | | bne >7 | ||
2747 | |4: | ||
2748 | | ins_next | ||
2749 | | | ||
2750 | |5: // Need to resize array part. | ||
2751 | | str BASE, L->base | ||
2752 | | mov CARG1, L | ||
2753 | | str PC, SAVE_PC | ||
2754 | | bl extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) | ||
2755 | | // Must not reallocate the stack. | ||
2756 | | b <1 | ||
2757 | | | ||
2758 | |7: // Possible table write barrier for any value. Skip valiswhite check. | ||
2759 | | barrierback TAB:RB, CARG4, CARG1 | ||
2760 | | b <4 | ||
2725 | break; | 2761 | break; |
2726 | 2762 | ||
2727 | /* -- Calls and vararg handling ----------------------------------------- */ | 2763 | /* -- Calls and vararg handling ----------------------------------------- */ |
@@ -2905,7 +2941,62 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2905 | break; | 2941 | break; |
2906 | 2942 | ||
2907 | case BC_VARG: | 2943 | case BC_VARG: |
2908 | | NYI | 2944 | | decode_RB8 RB, INS |
2945 | | decode_RC8 RC, INS | ||
2946 | | // RA = base*8, RB = (nresults+1)*8, RC = numparams*8 | ||
2947 | | ldr CARG1, [BASE, FRAME_PC] | ||
2948 | | add RC, BASE, RC | ||
2949 | | add RA, BASE, RA | ||
2950 | | add RC, RC, #FRAME_VARG | ||
2951 | | add CARG4, RA, RB | ||
2952 | | sub CARG3, BASE, #8 // CARG3 = vtop | ||
2953 | | sub RC, RC, CARG1 // RC = vbase | ||
2954 | | // Note: RC may now be even _above_ BASE if nargs was < numparams. | ||
2955 | | cmp RB, #0 | ||
2956 | | sub CARG1, CARG3, RC | ||
2957 | | beq >5 // Copy all varargs? | ||
2958 | | sub CARG4, CARG4, #16 | ||
2959 | |1: // Copy vararg slots to destination slots. | ||
2960 | | cmp RC, CARG3 | ||
2961 | | ldrdlo CARG12, [RC], #8 | ||
2962 | | mvnhs CARG2, #~LJ_TNIL | ||
2963 | | cmp RA, CARG4 | ||
2964 | | strd CARG12, [RA], #8 | ||
2965 | | blo <1 | ||
2966 | |2: | ||
2967 | | ins_next | ||
2968 | | | ||
2969 | |5: // Copy all varargs. | ||
2970 | | ldr CARG4, L->maxstack | ||
2971 | | cmp CARG1, #0 | ||
2972 | | movle RB, #8 // MULTRES = (0+1)*8 | ||
2973 | | addgt RB, CARG1, #8 | ||
2974 | | add CARG2, RA, CARG1 | ||
2975 | | str RB, SAVE_MULTRES | ||
2976 | | ble <2 | ||
2977 | | cmp CARG2, CARG4 | ||
2978 | | bhi >7 | ||
2979 | |6: | ||
2980 | | ldrd CARG12, [RC], #8 | ||
2981 | | strd CARG12, [RA], #8 | ||
2982 | | cmp RC, CARG3 | ||
2983 | | blo <6 | ||
2984 | | b <2 | ||
2985 | | | ||
2986 | |7: // Grow stack for varargs. | ||
2987 | | lsr CARG2, CARG1, #3 | ||
2988 | | str RA, L->top | ||
2989 | | mov CARG1, L | ||
2990 | | str BASE, L->base | ||
2991 | | sub RC, RC, BASE // Need delta, because BASE may change. | ||
2992 | | str PC, SAVE_PC | ||
2993 | | sub RA, RA, BASE | ||
2994 | | bl extern lj_state_growstack // (lua_State *L, int n) | ||
2995 | | ldr BASE, L->base | ||
2996 | | add RA, BASE, RA | ||
2997 | | add RC, BASE, RC | ||
2998 | | sub CARG3, BASE, #8 | ||
2999 | | b <6 | ||
2909 | break; | 3000 | break; |
2910 | 3001 | ||
2911 | /* -- Returns ----------------------------------------------------------- */ | 3002 | /* -- Returns ----------------------------------------------------------- */ |