aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-13 02:24:56 +0200
committerMike Pall <mike>2011-04-13 02:24:56 +0200
commit0001a7fcedfa5da45bb8489fbce6447cadd8187b (patch)
tree593e3485faa1ae22df12bfdf5f60de270f36faa5 /src
parent7aa7069271d6794d49de5dd280a6b0b1bbf3e8e2 (diff)
downloadluajit-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.dasc95
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 ----------------------------------------------------------- */