diff options
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 ----------------------------------------------------------- */ |
