diff options
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r-- | src/vm_mips.dasc | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index f37cd931..6db5801f 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc | |||
@@ -688,6 +688,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
688 | | b ->vm_call_dispatch_f | 688 | | b ->vm_call_dispatch_f |
689 | |. li NARGS8:RC, 16 // 2 args for func(t, k). | 689 | |. li NARGS8:RC, 16 // 2 args for func(t, k). |
690 | | | 690 | | |
691 | |->vmeta_tgetr: | ||
692 | | load_got lj_tab_getinth | ||
693 | | call_intern lj_tab_getinth // (GCtab *t, int32_t key) | ||
694 | |. nop | ||
695 | | // Returns cTValue * or NULL. | ||
696 | | beqz CRET1, >1 | ||
697 | |. nop | ||
698 | | b ->BC_TGETR_Z | ||
699 | |. ldc1 f0, 0(CRET1) | ||
700 | | | ||
691 | |//----------------------------------------------------------------------- | 701 | |//----------------------------------------------------------------------- |
692 | | | 702 | | |
693 | |->vmeta_tsets1: | 703 | |->vmeta_tsets1: |
@@ -740,6 +750,16 @@ static void build_subroutines(BuildCtx *ctx) | |||
740 | | b ->vm_call_dispatch_f | 750 | | b ->vm_call_dispatch_f |
741 | |. li NARGS8:RC, 24 // 3 args for func(t, k, v) | 751 | |. li NARGS8:RC, 24 // 3 args for func(t, k, v) |
742 | | | 752 | | |
753 | |->vmeta_tsetr: | ||
754 | | load_got lj_tab_setinth | ||
755 | | sw BASE, L->base | ||
756 | | sw PC, SAVE_PC | ||
757 | | call_intern lj_tab_setinth // (lua_State *L, GCtab *t, int32_t key) | ||
758 | |. move CARG1, L | ||
759 | | // Returns TValue *. | ||
760 | | b ->BC_TSETR_Z | ||
761 | |. nop | ||
762 | | | ||
743 | |//-- Comparison metamethods --------------------------------------------- | 763 | |//-- Comparison metamethods --------------------------------------------- |
744 | | | 764 | | |
745 | |->vmeta_comp: | 765 | |->vmeta_comp: |
@@ -813,6 +833,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
813 | |. nop | 833 | |. nop |
814 | |.endif | 834 | |.endif |
815 | | | 835 | | |
836 | |->vmeta_istype: | ||
837 | | load_got lj_meta_istype | ||
838 | | addiu PC, PC, -4 | ||
839 | | sw BASE, L->base | ||
840 | | srl CARG2, RA, 3 | ||
841 | | srl CARG3, RD, 3 | ||
842 | | sw PC, SAVE_PC | ||
843 | | call_intern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp) | ||
844 | |. move CARG1, L | ||
845 | | b ->cont_nop | ||
846 | |. nop | ||
847 | | | ||
816 | |//-- Arithmetic metamethods --------------------------------------------- | 848 | |//-- Arithmetic metamethods --------------------------------------------- |
817 | | | 849 | | |
818 | |->vmeta_unm: | 850 | |->vmeta_unm: |
@@ -2566,6 +2598,26 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2566 | | ins_next | 2598 | | ins_next |
2567 | break; | 2599 | break; |
2568 | 2600 | ||
2601 | case BC_ISTYPE: | ||
2602 | | // RA = src*8, RD = -type*8 | ||
2603 | | addu TMP2, BASE, RA | ||
2604 | | srl TMP1, RD, 3 | ||
2605 | | lw TMP0, HI(TMP2) | ||
2606 | | ins_next1 | ||
2607 | | addu AT, TMP0, TMP1 | ||
2608 | | bnez AT, ->vmeta_istype | ||
2609 | |. ins_next2 | ||
2610 | break; | ||
2611 | case BC_ISNUM: | ||
2612 | | // RA = src*8, RD = -(TISNUM-1)*8 | ||
2613 | | addu TMP2, BASE, RA | ||
2614 | | lw TMP0, HI(TMP2) | ||
2615 | | ins_next1 | ||
2616 | | sltiu AT, TMP0, LJ_TISNUM | ||
2617 | | beqz AT, ->vmeta_istype | ||
2618 | |. ins_next2 | ||
2619 | break; | ||
2620 | |||
2569 | /* -- Unary ops --------------------------------------------------------- */ | 2621 | /* -- Unary ops --------------------------------------------------------- */ |
2570 | 2622 | ||
2571 | case BC_MOV: | 2623 | case BC_MOV: |
@@ -3204,6 +3256,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3204 | | b ->vmeta_tgetb // Caveat: preserve TMP0! | 3256 | | b ->vmeta_tgetb // Caveat: preserve TMP0! |
3205 | |. nop | 3257 | |. nop |
3206 | break; | 3258 | break; |
3259 | case BC_TGETR: | ||
3260 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
3261 | | decode_RB8a RB, INS | ||
3262 | | decode_RB8b RB | ||
3263 | | decode_RDtoRC8 RC, RD | ||
3264 | | addu CARG2, BASE, RB | ||
3265 | | addu CARG3, BASE, RC | ||
3266 | | lw TAB:CARG1, LO(CARG2) | ||
3267 | | ldc1 f0, 0(CARG3) | ||
3268 | | trunc.w.d f2, f0 | ||
3269 | | lw TMP0, TAB:CARG1->asize | ||
3270 | | mfc1 CARG2, f2 | ||
3271 | | lw TMP1, TAB:CARG1->array | ||
3272 | | sltu AT, CARG2, TMP0 | ||
3273 | | sll TMP2, CARG2, 3 | ||
3274 | | beqz AT, ->vmeta_tgetr // In array part? | ||
3275 | |. addu TMP2, TMP1, TMP2 | ||
3276 | | ldc1 f0, 0(TMP2) | ||
3277 | |->BC_TGETR_Z: | ||
3278 | | addu RA, BASE, RA | ||
3279 | | ins_next1 | ||
3280 | | sdc1 f0, 0(RA) | ||
3281 | | ins_next2 | ||
3282 | break; | ||
3207 | 3283 | ||
3208 | case BC_TSETV: | 3284 | case BC_TSETV: |
3209 | | // RA = src*8, RB = table*8, RC = key*8 | 3285 | | // RA = src*8, RB = table*8, RC = key*8 |
@@ -3392,6 +3468,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3392 | |7: // Possible table write barrier for the value. Skip valiswhite check. | 3468 | |7: // Possible table write barrier for the value. Skip valiswhite check. |
3393 | | barrierback TAB:RB, TMP3, TMP0, <2 | 3469 | | barrierback TAB:RB, TMP3, TMP0, <2 |
3394 | break; | 3470 | break; |
3471 | case BC_TSETR: | ||
3472 | | // RA = dst*8, RB = table*8, RC = key*8 | ||
3473 | | decode_RB8a RB, INS | ||
3474 | | decode_RB8b RB | ||
3475 | | decode_RDtoRC8 RC, RD | ||
3476 | | addu CARG1, BASE, RB | ||
3477 | | addu CARG3, BASE, RC | ||
3478 | | lw TAB:CARG2, LO(CARG1) | ||
3479 | | ldc1 f0, 0(CARG3) | ||
3480 | | trunc.w.d f2, f0 | ||
3481 | | lbu TMP3, TAB:CARG2->marked | ||
3482 | | lw TMP0, TAB:CARG2->asize | ||
3483 | | mfc1 CARG3, f2 | ||
3484 | | lw TMP1, TAB:CARG2->array | ||
3485 | | andi AT, TMP3, LJ_GC_BLACK // isblack(table) | ||
3486 | | bnez AT, >7 | ||
3487 | |. addu RA, BASE, RA | ||
3488 | |2: | ||
3489 | | sltu AT, CARG3, TMP0 | ||
3490 | | sll TMP2, CARG3, 3 | ||
3491 | | beqz AT, ->vmeta_tsetr // In array part? | ||
3492 | |. ldc1 f20, 0(RA) | ||
3493 | | addu CRET1, TMP1, TMP2 | ||
3494 | |->BC_TSETR_Z: | ||
3495 | | ins_next1 | ||
3496 | | sdc1 f20, 0(CRET1) | ||
3497 | | ins_next2 | ||
3498 | | | ||
3499 | |7: // Possible table write barrier for the value. Skip valiswhite check. | ||
3500 | | barrierback TAB:RB, TMP3, TMP0, <2 | ||
3501 | break; | ||
3502 | |||
3395 | 3503 | ||
3396 | case BC_TSETM: | 3504 | case BC_TSETM: |
3397 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) | 3505 | | // RA = base*8 (table at base-1), RD = num_const*8 (start index) |