diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_mips64.dasc | 92 |
1 files changed, 88 insertions, 4 deletions
diff --git a/src/vm_mips64.dasc b/src/vm_mips64.dasc index 0d28326a..5c5d761c 100644 --- a/src/vm_mips64.dasc +++ b/src/vm_mips64.dasc | |||
@@ -193,7 +193,7 @@ | |||
193 | |//----------------------------------------------------------------------- | 193 | |//----------------------------------------------------------------------- |
194 | | | 194 | | |
195 | |// Trap for not-yet-implemented parts. | 195 | |// Trap for not-yet-implemented parts. |
196 | |.macro NYI; .long 0xf0f0f0f0; .endmacro | 196 | |.macro NYI; .long 0xec1cf0f0; .endmacro |
197 | | | 197 | | |
198 | |// Macros to mark delay slots. | 198 | |// Macros to mark delay slots. |
199 | |.macro ., a; a; .endmacro | 199 | |.macro ., a; a; .endmacro |
@@ -2904,6 +2904,70 @@ static void build_subroutines(BuildCtx *ctx) | |||
2904 | |//-- Miscellaneous functions -------------------------------------------- | 2904 | |//-- Miscellaneous functions -------------------------------------------- |
2905 | |//----------------------------------------------------------------------- | 2905 | |//----------------------------------------------------------------------- |
2906 | | | 2906 | | |
2907 | |.define NEXT_TAB, TAB:CARG1 | ||
2908 | |.define NEXT_IDX, CARG2 | ||
2909 | |.define NEXT_ASIZE, CARG3 | ||
2910 | |.define NEXT_NIL, CARG4 | ||
2911 | |.define NEXT_TMP0, r12 | ||
2912 | |.define NEXT_TMP1, r13 | ||
2913 | |.define NEXT_TMP2, r14 | ||
2914 | |.define NEXT_RES_VK, CRET1 | ||
2915 | |.define NEXT_RES_IDX, CRET2 | ||
2916 | |.define NEXT_RES_PTR, sp | ||
2917 | |.define NEXT_RES_VAL, 0(sp) | ||
2918 | |.define NEXT_RES_KEY, 8(sp) | ||
2919 | | | ||
2920 | |// TValue *lj_vm_next(GCtab *t, uint32_t idx) | ||
2921 | |// Next idx returned in CRET2. | ||
2922 | |->vm_next: | ||
2923 | |.if JIT and ENDIAN_LE | ||
2924 | | lw NEXT_ASIZE, NEXT_TAB->asize | ||
2925 | | ld NEXT_TMP0, NEXT_TAB->array | ||
2926 | | li NEXT_NIL, LJ_TNIL | ||
2927 | |1: // Traverse array part. | ||
2928 | | sltu AT, NEXT_IDX, NEXT_ASIZE | ||
2929 | | sll NEXT_TMP1, NEXT_IDX, 3 | ||
2930 | | beqz AT, >5 | ||
2931 | |. daddu NEXT_TMP1, NEXT_TMP0, NEXT_TMP1 | ||
2932 | | li AT, LJ_TISNUM | ||
2933 | | ld NEXT_TMP2, 0(NEXT_TMP1) | ||
2934 | | dsll AT, AT, 47 | ||
2935 | | or NEXT_TMP1, NEXT_IDX, AT | ||
2936 | | beq NEXT_TMP2, NEXT_NIL, <1 | ||
2937 | |. addiu NEXT_IDX, NEXT_IDX, 1 | ||
2938 | | sd NEXT_TMP2, NEXT_RES_VAL | ||
2939 | | sd NEXT_TMP1, NEXT_RES_KEY | ||
2940 | | move NEXT_RES_VK, NEXT_RES_PTR | ||
2941 | | jr ra | ||
2942 | |. move NEXT_RES_IDX, NEXT_IDX | ||
2943 | | | ||
2944 | |5: // Traverse hash part. | ||
2945 | | subu NEXT_RES_IDX, NEXT_IDX, NEXT_ASIZE | ||
2946 | | ld NODE:NEXT_RES_VK, NEXT_TAB->node | ||
2947 | | sll NEXT_TMP2, NEXT_RES_IDX, 5 | ||
2948 | | lw NEXT_TMP0, NEXT_TAB->hmask | ||
2949 | | sll AT, NEXT_RES_IDX, 3 | ||
2950 | | subu AT, NEXT_TMP2, AT | ||
2951 | | daddu NODE:NEXT_RES_VK, NODE:NEXT_RES_VK, AT | ||
2952 | |6: | ||
2953 | | sltu AT, NEXT_TMP0, NEXT_RES_IDX | ||
2954 | | bnez AT, >8 | ||
2955 | |. nop | ||
2956 | | ld NEXT_TMP2, NODE:NEXT_RES_VK->val | ||
2957 | | bne NEXT_TMP2, NEXT_NIL, >9 | ||
2958 | |. addiu NEXT_RES_IDX, NEXT_RES_IDX, 1 | ||
2959 | | // Skip holes in hash part. | ||
2960 | | b <6 | ||
2961 | |. daddiu NODE:NEXT_RES_VK, NODE:NEXT_RES_VK, sizeof(Node) | ||
2962 | | | ||
2963 | |8: // End of iteration. Set the key to nil (not the value). | ||
2964 | | sd NEXT_NIL, NEXT_RES_KEY | ||
2965 | | move NEXT_RES_VK, NEXT_RES_PTR | ||
2966 | |9: | ||
2967 | | jr ra | ||
2968 | |. addu NEXT_RES_IDX, NEXT_RES_IDX, NEXT_ASIZE | ||
2969 | |.endif | ||
2970 | | | ||
2907 | |//----------------------------------------------------------------------- | 2971 | |//----------------------------------------------------------------------- |
2908 | |//-- FFI helper functions ----------------------------------------------- | 2972 | |//-- FFI helper functions ----------------------------------------------- |
2909 | |//----------------------------------------------------------------------- | 2973 | |//----------------------------------------------------------------------- |
@@ -4700,10 +4764,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4700 | break; | 4764 | break; |
4701 | 4765 | ||
4702 | case BC_ITERN: | 4766 | case BC_ITERN: |
4703 | | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) | 4767 | |.if JIT and ENDIAN_LE |
4704 | |.if JIT | 4768 | | hotloop |
4705 | | // NYI: add hotloop, record BC_ITERN. | ||
4706 | |.endif | 4769 | |.endif |
4770 | |->vm_IITERN: | ||
4771 | | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) | ||
4707 | | daddu RA, BASE, RA | 4772 | | daddu RA, BASE, RA |
4708 | | ld TAB:RB, -16(RA) | 4773 | | ld TAB:RB, -16(RA) |
4709 | | lw RC, -8+LO(RA) // Get index from control var. | 4774 | | lw RC, -8+LO(RA) // Get index from control var. |
@@ -4789,8 +4854,27 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4789 | | li TMP1, BC_ITERC | 4854 | | li TMP1, BC_ITERC |
4790 | | sb TMP3, -4+OFS_OP(PC) | 4855 | | sb TMP3, -4+OFS_OP(PC) |
4791 | | daddu PC, TMP0, TMP2 | 4856 | | daddu PC, TMP0, TMP2 |
4857 | |.if JIT | ||
4858 | | lb TMP0, OFS_OP(PC) | ||
4859 | | li AT, BC_ITERN | ||
4860 | | bne TMP0, AT, >6 | ||
4861 | |. lhu TMP2, OFS_RD(PC) | ||
4862 | |.endif | ||
4792 | | b <1 | 4863 | | b <1 |
4793 | |. sb TMP1, OFS_OP(PC) | 4864 | |. sb TMP1, OFS_OP(PC) |
4865 | |.if JIT | ||
4866 | |6: // Unpatch JLOOP. | ||
4867 | | ld TMP0, DISPATCH_J(trace)(DISPATCH) | ||
4868 | | sll TMP2, TMP2, 3 | ||
4869 | | daddu TMP0, TMP0, TMP2 | ||
4870 | | ld TRACE:TMP2, 0(TMP0) | ||
4871 | | lw TMP0, TRACE:TMP2->startins | ||
4872 | | li AT, -256 | ||
4873 | | and TMP0, TMP0, AT | ||
4874 | | or TMP0, TMP0, TMP1 | ||
4875 | | b <1 | ||
4876 | |. sw TMP0, 0(PC) | ||
4877 | |.endif | ||
4794 | break; | 4878 | break; |
4795 | 4879 | ||
4796 | case BC_VARG: | 4880 | case BC_VARG: |