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