aboutsummaryrefslogtreecommitdiff
path: root/src/vm_mips.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_mips.dasc')
-rw-r--r--src/vm_mips.dasc108
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)