aboutsummaryrefslogtreecommitdiff
path: root/src/vm_mips.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/vm_mips.dasc97
1 files changed, 92 insertions, 5 deletions
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc
index 3b0ea4a2..f70c613e 100644
--- a/src/vm_mips.dasc
+++ b/src/vm_mips.dasc
@@ -190,7 +190,7 @@
190|//----------------------------------------------------------------------- 190|//-----------------------------------------------------------------------
191| 191|
192|// Trap for not-yet-implemented parts. 192|// Trap for not-yet-implemented parts.
193|.macro NYI; .long 0xf0f0f0f0; .endmacro 193|.macro NYI; .long 0xec1cf0f0; .endmacro
194| 194|
195|// Macros to mark delay slots. 195|// Macros to mark delay slots.
196|.macro ., a; a; .endmacro 196|.macro ., a; a; .endmacro
@@ -2798,6 +2798,73 @@ static void build_subroutines(BuildCtx *ctx)
2798 |//-- Miscellaneous functions -------------------------------------------- 2798 |//-- Miscellaneous functions --------------------------------------------
2799 |//----------------------------------------------------------------------- 2799 |//-----------------------------------------------------------------------
2800 | 2800 |
2801 |.define NEXT_TAB, TAB:CARG1
2802 |.define NEXT_IDX, CARG2
2803 |.define NEXT_ASIZE, CARG3
2804 |.define NEXT_NIL, CARG4
2805 |.define NEXT_TMP0, r12
2806 |.define NEXT_TMP1, r13
2807 |.define NEXT_TMP2, r14
2808 |.define NEXT_RES_VK, CRET1
2809 |.define NEXT_RES_IDX, CRET2
2810 |.define NEXT_RES_PTR, sp
2811 |.define NEXT_RES_VAL_I, 0(sp)
2812 |.define NEXT_RES_VAL_IT, 4(sp)
2813 |.define NEXT_RES_KEY_I, 8(sp)
2814 |.define NEXT_RES_KEY_IT, 12(sp)
2815 |
2816 |// TValue *lj_vm_next(GCtab *t, uint32_t idx)
2817 |// Next idx returned in CRET2.
2818 |->vm_next:
2819 |.if JIT and ENDIAN_LE
2820 | lw NEXT_ASIZE, NEXT_TAB->asize
2821 | lw NEXT_TMP0, NEXT_TAB->array
2822 | li NEXT_NIL, LJ_TNIL
2823 |1: // Traverse array part.
2824 | sltu AT, NEXT_IDX, NEXT_ASIZE
2825 | sll NEXT_TMP1, NEXT_IDX, 3
2826 | beqz AT, >5
2827 |. addu NEXT_TMP1, NEXT_TMP0, NEXT_TMP1
2828 | lw NEXT_TMP2, 4(NEXT_TMP1)
2829 | sw NEXT_IDX, NEXT_RES_KEY_I
2830 | beq NEXT_TMP2, NEXT_NIL, <1
2831 |. addiu NEXT_IDX, NEXT_IDX, 1
2832 | lw NEXT_TMP0, 0(NEXT_TMP1)
2833 | li AT, LJ_TISNUM
2834 | sw NEXT_TMP2, NEXT_RES_VAL_IT
2835 | sw AT, NEXT_RES_KEY_IT
2836 | sw NEXT_TMP0, NEXT_RES_VAL_I
2837 | move NEXT_RES_VK, NEXT_RES_PTR
2838 | jr ra
2839 |. move NEXT_RES_IDX, NEXT_IDX
2840 |
2841 |5: // Traverse hash part.
2842 | subu NEXT_RES_IDX, NEXT_IDX, NEXT_ASIZE
2843 | lw NODE:NEXT_RES_VK, NEXT_TAB->node
2844 | sll NEXT_TMP2, NEXT_RES_IDX, 5
2845 | lw NEXT_TMP0, NEXT_TAB->hmask
2846 | sll AT, NEXT_RES_IDX, 3
2847 | subu AT, NEXT_TMP2, AT
2848 | addu NODE:NEXT_RES_VK, NODE:NEXT_RES_VK, AT
2849 |6:
2850 | sltu AT, NEXT_TMP0, NEXT_RES_IDX
2851 | bnez AT, >8
2852 |. nop
2853 | lw NEXT_TMP2, NODE:NEXT_RES_VK->val.it
2854 | bne NEXT_TMP2, NEXT_NIL, >9
2855 |. addiu NEXT_RES_IDX, NEXT_RES_IDX, 1
2856 | // Skip holes in hash part.
2857 | b <6
2858 |. addiu NODE:NEXT_RES_VK, NODE:NEXT_RES_VK, sizeof(Node)
2859 |
2860 |8: // End of iteration. Set the key to nil (not the value).
2861 | sw NEXT_NIL, NEXT_RES_KEY_IT
2862 | move NEXT_RES_VK, NEXT_RES_PTR
2863 |9:
2864 | jr ra
2865 |. addu NEXT_RES_IDX, NEXT_RES_IDX, NEXT_ASIZE
2866 |.endif
2867 |
2801 |//----------------------------------------------------------------------- 2868 |//-----------------------------------------------------------------------
2802 |//-- FFI helper functions ----------------------------------------------- 2869 |//-- FFI helper functions -----------------------------------------------
2803 |//----------------------------------------------------------------------- 2870 |//-----------------------------------------------------------------------
@@ -4521,10 +4588,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4521 break; 4588 break;
4522 4589
4523 case BC_ITERN: 4590 case BC_ITERN:
4524 | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) 4591 |.if JIT and ENDIAN_LE
4525 |.if JIT 4592 | hotloop
4526 | // NYI: add hotloop, record BC_ITERN.
4527 |.endif 4593 |.endif
4594 |->vm_IITERN:
4595 | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8)
4528 | addu RA, BASE, RA 4596 | addu RA, BASE, RA
4529 | lw TAB:RB, -16+LO(RA) 4597 | lw TAB:RB, -16+LO(RA)
4530 | lw RC, -8+LO(RA) // Get index from control var. 4598 | lw RC, -8+LO(RA) // Get index from control var.
@@ -4614,9 +4682,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4614 | li TMP3, BC_JMP 4682 | li TMP3, BC_JMP
4615 | li TMP1, BC_ITERC 4683 | li TMP1, BC_ITERC
4616 | sb TMP3, -4+OFS_OP(PC) 4684 | sb TMP3, -4+OFS_OP(PC)
4617 | addu PC, TMP0, TMP2 4685 | addu PC, TMP0, TMP2
4686 |.if JIT
4687 | lb TMP0, OFS_OP(PC)
4688 | li AT, BC_ITERN
4689 | bne TMP0, AT, >6
4690 |. lhu TMP2, OFS_RD(PC)
4691 |.endif
4618 | b <1 4692 | b <1
4619 |. sb TMP1, OFS_OP(PC) 4693 |. sb TMP1, OFS_OP(PC)
4694 |.if JIT
4695 |6: // Unpatch JLOOP.
4696 | lw TMP0, DISPATCH_J(trace)(DISPATCH)
4697 | sll TMP2, TMP2, 2
4698 | addu TMP0, TMP0, TMP2
4699 | lw TRACE:TMP2, 0(TMP0)
4700 | lw TMP0, TRACE:TMP2->startins
4701 | li AT, -256
4702 | and TMP0, TMP0, AT
4703 | or TMP0, TMP0, TMP1
4704 | b <1
4705 |. sw TMP0, 0(PC)
4706 |.endif
4620 break; 4707 break;
4621 4708
4622 case BC_VARG: 4709 case BC_VARG: