diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_mips.dasc | 97 |
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: |