aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/vm_arm.dasc259
1 files changed, 145 insertions, 114 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index 114416a4..0bd929fd 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -99,6 +99,7 @@
99|.type NODE, Node 99|.type NODE, Node
100|.type NARGS8, int 100|.type NARGS8, int
101|.type TRACE, GCtrace 101|.type TRACE, GCtrace
102|.type SBUF, SBuf
102| 103|
103|//----------------------------------------------------------------------- 104|//-----------------------------------------------------------------------
104| 105|
@@ -418,13 +419,14 @@ static void build_subroutines(BuildCtx *ctx)
418 | add CARG2, sp, #CFRAME_RESUME 419 | add CARG2, sp, #CFRAME_RESUME
419 | ldrb CARG1, L->status 420 | ldrb CARG1, L->status
420 | str CARG3, SAVE_ERRF 421 | str CARG3, SAVE_ERRF
421 | str CARG2, L->cframe 422 | str L, SAVE_PC // Any value outside of bytecode is ok.
422 | str CARG3, SAVE_CFRAME 423 | str CARG3, SAVE_CFRAME
423 | cmp CARG1, #0 424 | cmp CARG1, #0
424 | str L, SAVE_PC // Any value outside of bytecode is ok. 425 | str CARG2, L->cframe
425 | beq >3 426 | beq >3
426 | 427 |
427 | // Resume after yield (like a return). 428 | // Resume after yield (like a return).
429 | str L, [DISPATCH, #DISPATCH_GL(cur_L)]
428 | mov RA, BASE 430 | mov RA, BASE
429 | ldr BASE, L->base 431 | ldr BASE, L->base
430 | ldr CARG1, L->top 432 | ldr CARG1, L->top
@@ -458,14 +460,15 @@ static void build_subroutines(BuildCtx *ctx)
458 | str CARG3, SAVE_NRES 460 | str CARG3, SAVE_NRES
459 | mov L, CARG1 461 | mov L, CARG1
460 | str CARG1, SAVE_L 462 | str CARG1, SAVE_L
461 | mov BASE, CARG2
462 | str sp, L->cframe // Add our C frame to cframe chain.
463 | ldr DISPATCH, L->glref // Setup pointer to dispatch table. 463 | ldr DISPATCH, L->glref // Setup pointer to dispatch table.
464 | mov BASE, CARG2
464 | str CARG1, SAVE_PC // Any value outside of bytecode is ok. 465 | str CARG1, SAVE_PC // Any value outside of bytecode is ok.
465 | str RC, SAVE_CFRAME 466 | str RC, SAVE_CFRAME
466 | add DISPATCH, DISPATCH, #GG_G2DISP 467 | add DISPATCH, DISPATCH, #GG_G2DISP
468 | str sp, L->cframe // Add our C frame to cframe chain.
467 | 469 |
468 |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). 470 |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype).
471 | str L, [DISPATCH, #DISPATCH_GL(cur_L)]
469 | ldr RB, L->base // RB = old base (for vmeta_call). 472 | ldr RB, L->base // RB = old base (for vmeta_call).
470 | ldr CARG1, L->top 473 | ldr CARG1, L->top
471 | mov MASKR8, #255 474 | mov MASKR8, #255
@@ -491,20 +494,21 @@ static void build_subroutines(BuildCtx *ctx)
491 | mov L, CARG1 494 | mov L, CARG1
492 | ldr RA, L:CARG1->stack 495 | ldr RA, L:CARG1->stack
493 | str CARG1, SAVE_L 496 | str CARG1, SAVE_L
497 | ldr DISPATCH, L->glref // Setup pointer to dispatch table.
494 | ldr RB, L->top 498 | ldr RB, L->top
495 | str CARG1, SAVE_PC // Any value outside of bytecode is ok. 499 | str CARG1, SAVE_PC // Any value outside of bytecode is ok.
496 | ldr RC, L->cframe 500 | ldr RC, L->cframe
501 | add DISPATCH, DISPATCH, #GG_G2DISP
497 | sub RA, RA, RB // Compute -savestack(L, L->top). 502 | sub RA, RA, RB // Compute -savestack(L, L->top).
498 | str sp, L->cframe // Add our C frame to cframe chain.
499 | mov RB, #0 503 | mov RB, #0
500 | str RA, SAVE_NRES // Neg. delta means cframe w/o frame. 504 | str RA, SAVE_NRES // Neg. delta means cframe w/o frame.
501 | str RB, SAVE_ERRF // No error function. 505 | str RB, SAVE_ERRF // No error function.
502 | str RC, SAVE_CFRAME 506 | str RC, SAVE_CFRAME
507 | str sp, L->cframe // Add our C frame to cframe chain.
508 | str L, [DISPATCH, #DISPATCH_GL(cur_L)]
503 | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud) 509 | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud)
504 | ldr DISPATCH, L->glref // Setup pointer to dispatch table.
505 | movs BASE, CRET1 510 | movs BASE, CRET1
506 | mov PC, #FRAME_CP 511 | mov PC, #FRAME_CP
507 | add DISPATCH, DISPATCH, #GG_G2DISP
508 | bne <3 // Else continue with the call. 512 | bne <3 // Else continue with the call.
509 | b ->vm_leave_cp // No base? Just remove C frame. 513 | b ->vm_leave_cp // No base? Just remove C frame.
510 | 514 |
@@ -615,6 +619,16 @@ static void build_subroutines(BuildCtx *ctx)
615 | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here. 619 | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here.
616 | b ->vm_call_dispatch_f 620 | b ->vm_call_dispatch_f
617 | 621 |
622 |->vmeta_tgetr:
623 | .IOS mov RC, BASE
624 | bl extern lj_tab_getinth // (GCtab *t, int32_t key)
625 | // Returns cTValue * or NULL.
626 | .IOS mov BASE, RC
627 | cmp CRET1, #0
628 | ldrdne CARG12, [CRET1]
629 | mvneq CARG2, #~LJ_TNIL
630 | b ->BC_TGETR_Z
631 |
618 |//----------------------------------------------------------------------- 632 |//-----------------------------------------------------------------------
619 | 633 |
620 |->vmeta_tsets1: 634 |->vmeta_tsets1:
@@ -672,6 +686,15 @@ static void build_subroutines(BuildCtx *ctx)
672 | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here. 686 | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here.
673 | b ->vm_call_dispatch_f 687 | b ->vm_call_dispatch_f
674 | 688 |
689 |->vmeta_tsetr:
690 | str BASE, L->base
691 | .IOS mov RC, BASE
692 | str PC, SAVE_PC
693 | bl extern lj_tab_setinth // (lua_State *L, GCtab *t, int32_t key)
694 | // Returns TValue *.
695 | .IOS mov BASE, RC
696 | b ->BC_TSETR_Z
697 |
675 |//-- Comparison metamethods --------------------------------------------- 698 |//-- Comparison metamethods ---------------------------------------------
676 | 699 |
677 |->vmeta_comp: 700 |->vmeta_comp:
@@ -736,6 +759,17 @@ static void build_subroutines(BuildCtx *ctx)
736 | b <3 759 | b <3
737 |.endif 760 |.endif
738 | 761 |
762 |->vmeta_istype:
763 | sub PC, PC, #4
764 | str BASE, L->base
765 | mov CARG1, L
766 | lsr CARG2, RA, #3
767 | mov CARG3, RC
768 | str PC, SAVE_PC
769 | bl extern lj_meta_istype // (lua_State *L, BCReg ra, BCReg tp)
770 | .IOS ldr BASE, L->base
771 | b ->cont_nop
772 |
739 |//-- Arithmetic metamethods --------------------------------------------- 773 |//-- Arithmetic metamethods ---------------------------------------------
740 | 774 |
741 |->vmeta_arith_vn: 775 |->vmeta_arith_vn:
@@ -1053,7 +1087,7 @@ static void build_subroutines(BuildCtx *ctx)
1053 | ffgccheck 1087 | ffgccheck
1054 | mov CARG1, L 1088 | mov CARG1, L
1055 | mov CARG2, BASE 1089 | mov CARG2, BASE
1056 | bl extern lj_str_fromnumber // (lua_State *L, cTValue *o) 1090 | bl extern lj_strfmt_number // (lua_State *L, cTValue *o)
1057 | // Returns GCstr *. 1091 | // Returns GCstr *.
1058 | ldr BASE, L->base 1092 | ldr BASE, L->base
1059 | mvn CARG2, #~LJ_TSTR 1093 | mvn CARG2, #~LJ_TSTR
@@ -1231,9 +1265,10 @@ static void build_subroutines(BuildCtx *ctx)
1231 | ldr CARG3, L:RA->base 1265 | ldr CARG3, L:RA->base
1232 | mv_vmstate CARG2, INTERP 1266 | mv_vmstate CARG2, INTERP
1233 | ldr CARG4, L:RA->top 1267 | ldr CARG4, L:RA->top
1234 | st_vmstate CARG2
1235 | cmp CRET1, #LUA_YIELD 1268 | cmp CRET1, #LUA_YIELD
1236 | ldr BASE, L->base 1269 | ldr BASE, L->base
1270 | str L, [DISPATCH, #DISPATCH_GL(cur_L)]
1271 | st_vmstate CARG2
1237 | bhi >8 1272 | bhi >8
1238 | subs RC, CARG4, CARG3 1273 | subs RC, CARG4, CARG3
1239 | ldr CARG1, L->maxstack 1274 | ldr CARG1, L->maxstack
@@ -1501,19 +1536,6 @@ static void build_subroutines(BuildCtx *ctx)
1501 | math_extern2 atan2 1536 | math_extern2 atan2
1502 | math_extern2 fmod 1537 | math_extern2 fmod
1503 | 1538 |
1504 |->ff_math_deg:
1505 |.if FPU
1506 | .ffunc_d math_rad
1507 | vldr d1, CFUNC:CARG3->upvalue[0]
1508 | vmul.f64 d0, d0, d1
1509 | b ->fff_resd
1510 |.else
1511 | .ffunc_n math_rad
1512 | ldrd CARG34, CFUNC:CARG3->upvalue[0]
1513 | bl extern __aeabi_dmul
1514 | b ->fff_restv
1515 |.endif
1516 |
1517 |.if HFABI 1539 |.if HFABI
1518 | .ffunc math_ldexp 1540 | .ffunc math_ldexp
1519 | ldr CARG4, [BASE, #4] 1541 | ldr CARG4, [BASE, #4]
@@ -1688,12 +1710,6 @@ static void build_subroutines(BuildCtx *ctx)
1688 | 1710 |
1689 |//-- String library ----------------------------------------------------- 1711 |//-- String library -----------------------------------------------------
1690 | 1712 |
1691 |.ffunc_1 string_len
1692 | checkstr CARG2, ->fff_fallback
1693 | ldr CARG1, STR:CARG1->len
1694 | mvn CARG2, #~LJ_TISNUM
1695 | b ->fff_restv
1696 |
1697 |.ffunc string_byte // Only handle the 1-arg case here. 1713 |.ffunc string_byte // Only handle the 1-arg case here.
1698 | ldrd CARG12, [BASE] 1714 | ldrd CARG12, [BASE]
1699 | ldr PC, [BASE, FRAME_PC] 1715 | ldr PC, [BASE, FRAME_PC]
@@ -1726,6 +1742,7 @@ static void build_subroutines(BuildCtx *ctx)
1726 | mov CARG1, L 1742 | mov CARG1, L
1727 | str PC, SAVE_PC 1743 | str PC, SAVE_PC
1728 | bl extern lj_str_new // (lua_State *L, char *str, size_t l) 1744 | bl extern lj_str_new // (lua_State *L, char *str, size_t l)
1745 |->fff_resstr:
1729 | // Returns GCstr *. 1746 | // Returns GCstr *.
1730 | ldr BASE, L->base 1747 | ldr BASE, L->base
1731 | mvn CARG2, #~LJ_TSTR 1748 | mvn CARG2, #~LJ_TSTR
@@ -1769,91 +1786,28 @@ static void build_subroutines(BuildCtx *ctx)
1769 | mvn CARG2, #~LJ_TSTR 1786 | mvn CARG2, #~LJ_TSTR
1770 | b ->fff_restv 1787 | b ->fff_restv
1771 | 1788 |
1772 |.ffunc string_rep // Only handle the 1-char case inline. 1789 |.macro ffstring_op, name
1773 | ffgccheck 1790 | .ffunc string_ .. name
1774 | ldrd CARG12, [BASE]
1775 | ldrd CARG34, [BASE, #8]
1776 | cmp NARGS8:RC, #16
1777 | bne ->fff_fallback // Exactly 2 arguments
1778 | checktp CARG2, LJ_TSTR
1779 | checktpeq CARG4, LJ_TISNUM
1780 | bne ->fff_fallback
1781 | subs CARG4, CARG3, #1
1782 | ldr CARG2, STR:CARG1->len
1783 | blt ->fff_emptystr // Count <= 0?
1784 | cmp CARG2, #1
1785 | blo ->fff_emptystr // Zero-length string?
1786 | bne ->fff_fallback // Fallback for > 1-char strings.
1787 | ldr RB, [DISPATCH, #DISPATCH_GL(tmpbuf.sz)]
1788 | ldr CARG2, [DISPATCH, #DISPATCH_GL(tmpbuf.buf)]
1789 | ldr CARG1, STR:CARG1[1]
1790 | cmp RB, CARG3
1791 | blo ->fff_fallback
1792 |1: // Fill buffer with char.
1793 | strb CARG1, [CARG2, CARG4]
1794 | subs CARG4, CARG4, #1
1795 | bge <1
1796 | b ->fff_newstr
1797 |
1798 |.ffunc string_reverse
1799 | ffgccheck
1800 | ldrd CARG12, [BASE]
1801 | cmp NARGS8:RC, #8
1802 | blo ->fff_fallback
1803 | checkstr CARG2, ->fff_fallback
1804 | ldr CARG3, STR:CARG1->len
1805 | ldr RB, [DISPATCH, #DISPATCH_GL(tmpbuf.sz)]
1806 | ldr CARG2, [DISPATCH, #DISPATCH_GL(tmpbuf.buf)]
1807 | mov CARG4, CARG3
1808 | add CARG1, STR:CARG1, #sizeof(GCstr)
1809 | cmp RB, CARG3
1810 | blo ->fff_fallback
1811 |1: // Reverse string copy.
1812 | ldrb RB, [CARG1], #1
1813 | subs CARG4, CARG4, #1
1814 | blt ->fff_newstr
1815 | strb RB, [CARG2, CARG4]
1816 | b <1
1817 |
1818 |.macro ffstring_case, name, lo
1819 | .ffunc name
1820 | ffgccheck 1791 | ffgccheck
1821 | ldrd CARG12, [BASE] 1792 | ldr CARG3, [BASE, #4]
1822 | cmp NARGS8:RC, #8 1793 | cmp NARGS8:RC, #8
1794 | ldr STR:CARG2, [BASE]
1823 | blo ->fff_fallback 1795 | blo ->fff_fallback
1824 | checkstr CARG2, ->fff_fallback 1796 | sub SBUF:CARG1, DISPATCH, #-DISPATCH_GL(tmpbuf)
1825 | ldr CARG3, STR:CARG1->len 1797 | checkstr CARG3, ->fff_fallback
1826 | ldr RB, [DISPATCH, #DISPATCH_GL(tmpbuf.sz)] 1798 | ldr CARG4, SBUF:CARG1->b
1827 | ldr CARG2, [DISPATCH, #DISPATCH_GL(tmpbuf.buf)] 1799 | str BASE, L->base
1828 | mov CARG4, #0 1800 | str PC, SAVE_PC
1829 | add CARG1, STR:CARG1, #sizeof(GCstr) 1801 | str L, SBUF:CARG1->L
1830 | cmp RB, CARG3 1802 | str CARG4, SBUF:CARG1->p
1831 | blo ->fff_fallback 1803 | bl extern lj_buf_putstr_ .. name
1832 |1: // ASCII case conversion. 1804 | bl extern lj_buf_tostr
1833 | ldrb RB, [CARG1, CARG4] 1805 | b ->fff_resstr
1834 | cmp CARG4, CARG3
1835 | bhs ->fff_newstr
1836 | sub RC, RB, #lo
1837 | cmp RC, #26
1838 | eorlo RB, RB, #0x20
1839 | strb RB, [CARG2, CARG4]
1840 | add CARG4, CARG4, #1
1841 | b <1
1842 |.endmacro 1806 |.endmacro
1843 | 1807 |
1844 |ffstring_case string_lower, 65 1808 |ffstring_op reverse
1845 |ffstring_case string_upper, 97 1809 |ffstring_op lower
1846 | 1810 |ffstring_op upper
1847 |//-- Table library ------------------------------------------------------
1848 |
1849 |.ffunc_1 table_getn
1850 | checktab CARG2, ->fff_fallback
1851 | .IOS mov RA, BASE
1852 | bl extern lj_tab_len // (GCtab *t)
1853 | // Returns uint32_t (but less than 2^31).
1854 | .IOS mov BASE, RA
1855 | mvn CARG2, #~LJ_TISNUM
1856 | b ->fff_restv
1857 | 1811 |
1858 |//-- Bit library -------------------------------------------------------- 1812 |//-- Bit library --------------------------------------------------------
1859 | 1813 |
@@ -2128,6 +2082,18 @@ static void build_subroutines(BuildCtx *ctx)
2128 | ldr INS, [PC, #-4] 2082 | ldr INS, [PC, #-4]
2129 | bx CRET1 2083 | bx CRET1
2130 | 2084 |
2085 |->vm_profhook: // Dispatch target for profiler hook.
2086#if LJ_HASPROFILE
2087 | mov CARG1, L
2088 | str BASE, L->base
2089 | mov CARG2, PC
2090 | bl extern lj_dispatch_profile // (lua_State *L, const BCIns *pc)
2091 | // HOOK_PROFILE is off again, so re-dispatch to dynamic instruction.
2092 | ldr BASE, L->base
2093 | sub PC, PC, #4
2094 | b ->cont_nop
2095#endif
2096 |
2131 |//----------------------------------------------------------------------- 2097 |//-----------------------------------------------------------------------
2132 |//-- Trace exit handler ------------------------------------------------- 2098 |//-- Trace exit handler -------------------------------------------------
2133 |//----------------------------------------------------------------------- 2099 |//-----------------------------------------------------------------------
@@ -2152,14 +2118,14 @@ static void build_subroutines(BuildCtx *ctx)
2152 | add CARG1, CARG1, CARG2, asr #6 2118 | add CARG1, CARG1, CARG2, asr #6
2153 | ldr CARG2, [lr, #4] // Load exit stub group offset. 2119 | ldr CARG2, [lr, #4] // Load exit stub group offset.
2154 | sub CARG1, CARG1, lr 2120 | sub CARG1, CARG1, lr
2155 | ldr L, [DISPATCH, #DISPATCH_GL(jit_L)] 2121 | ldr L, [DISPATCH, #DISPATCH_GL(cur_L)]
2156 | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. 2122 | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number.
2157 | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] 2123 | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)]
2158 | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] 2124 | str CARG1, [DISPATCH, #DISPATCH_J(exitno)]
2159 | mov CARG4, #0 2125 | mov CARG4, #0
2160 | str L, [DISPATCH, #DISPATCH_J(L)]
2161 | str BASE, L->base 2126 | str BASE, L->base
2162 | str CARG4, [DISPATCH, #DISPATCH_GL(jit_L)] 2127 | str L, [DISPATCH, #DISPATCH_J(L)]
2128 | str CARG4, [DISPATCH, #DISPATCH_GL(jit_base)]
2163 | sub CARG1, DISPATCH, #-GG_DISP2J 2129 | sub CARG1, DISPATCH, #-GG_DISP2J
2164 | mov CARG2, sp 2130 | mov CARG2, sp
2165 | bl extern lj_trace_exit // (jit_State *J, ExitState *ex) 2131 | bl extern lj_trace_exit // (jit_State *J, ExitState *ex)
@@ -2183,8 +2149,9 @@ static void build_subroutines(BuildCtx *ctx)
2183 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] 2149 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
2184 | str RC, SAVE_MULTRES 2150 | str RC, SAVE_MULTRES
2185 | mov CARG3, #0 2151 | mov CARG3, #0
2152 | str BASE, L->base
2186 | ldr CARG2, LFUNC:CARG2->field_pc 2153 | ldr CARG2, LFUNC:CARG2->field_pc
2187 | str CARG3, [DISPATCH, #DISPATCH_GL(jit_L)] 2154 | str CARG3, [DISPATCH, #DISPATCH_GL(jit_base)]
2188 | mv_vmstate CARG4, INTERP 2155 | mv_vmstate CARG4, INTERP
2189 | ldr KBASE, [CARG2, #PC2PROTO(k)] 2156 | ldr KBASE, [CARG2, #PC2PROTO(k)]
2190 | // Modified copy of ins_next which handles function header dispatch, too. 2157 | // Modified copy of ins_next which handles function header dispatch, too.
@@ -2834,6 +2801,25 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2834 | ins_next 2801 | ins_next
2835 break; 2802 break;
2836 2803
2804 case BC_ISTYPE:
2805 | // RA = src*8, RC = -type
2806 | ldrd CARG12, [BASE, RA]
2807 | ins_next1
2808 | cmn CARG2, RC
2809 | ins_next2
2810 | bne ->vmeta_istype
2811 | ins_next3
2812 break;
2813 case BC_ISNUM:
2814 | // RA = src*8, RC = -(TISNUM-1)
2815 | ldrd CARG12, [BASE, RA]
2816 | ins_next1
2817 | checktp CARG2, LJ_TISNUM
2818 | ins_next2
2819 | bhs ->vmeta_istype
2820 | ins_next3
2821 break;
2822
2837 /* -- Unary ops --------------------------------------------------------- */ 2823 /* -- Unary ops --------------------------------------------------------- */
2838 2824
2839 case BC_MOV: 2825 case BC_MOV:
@@ -3504,6 +3490,24 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3504 | bne <1 // 'no __index' flag set: done. 3490 | bne <1 // 'no __index' flag set: done.
3505 | b ->vmeta_tgetb 3491 | b ->vmeta_tgetb
3506 break; 3492 break;
3493 case BC_TGETR:
3494 | decode_RB8 RB, INS
3495 | decode_RC8 RC, INS
3496 | // RA = dst*8, RB = table*8, RC = key*8
3497 | ldr TAB:CARG1, [BASE, RB]
3498 | ldr CARG2, [BASE, RC]
3499 | ldr CARG4, TAB:CARG1->array
3500 | ldr CARG3, TAB:CARG1->asize
3501 | add CARG4, CARG4, CARG2, lsl #3
3502 | cmp CARG2, CARG3 // In array part?
3503 | bhs ->vmeta_tgetr
3504 | ldrd CARG12, [CARG4]
3505 |->BC_TGETR_Z:
3506 | ins_next1
3507 | ins_next2
3508 | strd CARG12, [BASE, RA]
3509 | ins_next3
3510 break;
3507 3511
3508 case BC_TSETV: 3512 case BC_TSETV:
3509 | decode_RB8 RB, INS 3513 | decode_RB8 RB, INS
@@ -3674,6 +3678,32 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3674 | barrierback TAB:CARG1, INS, CARG3 3678 | barrierback TAB:CARG1, INS, CARG3
3675 | b <2 3679 | b <2
3676 break; 3680 break;
3681 case BC_TSETR:
3682 | decode_RB8 RB, INS
3683 | decode_RC8 RC, INS
3684 | // RA = dst*8, RB = table*8, RC = key*8
3685 | ldr TAB:CARG2, [BASE, RB]
3686 | ldr CARG3, [BASE, RC]
3687 | ldrb INS, TAB:CARG2->marked
3688 | ldr CARG1, TAB:CARG2->array
3689 | ldr CARG4, TAB:CARG2->asize
3690 | tst INS, #LJ_GC_BLACK // isblack(table)
3691 | add CARG1, CARG1, CARG3, lsl #3
3692 | bne >7
3693 |2:
3694 | cmp CARG3, CARG4 // In array part?
3695 | bhs ->vmeta_tsetr
3696 |->BC_TSETR_Z:
3697 | ldrd CARG34, [BASE, RA]
3698 | ins_next1
3699 | ins_next2
3700 | strd CARG34, [CARG1]
3701 | ins_next3
3702 |
3703 |7: // Possible table write barrier for the value. Skip valiswhite check.
3704 | barrierback TAB:CARG2, INS, RB
3705 | b <2
3706 break;
3677 3707
3678 case BC_TSETM: 3708 case BC_TSETM:
3679 | // RA = base*8 (table at base-1), RC = num_const (start index) 3709 | // RA = base*8 (table at base-1), RC = num_const (start index)
@@ -4271,7 +4301,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4271 | st_vmstate CARG2 4301 | st_vmstate CARG2
4272 | ldr RA, TRACE:RC->mcode 4302 | ldr RA, TRACE:RC->mcode
4273 | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)] 4303 | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)]
4274 | str L, [DISPATCH, #DISPATCH_GL(jit_L)] 4304 | str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)]
4275 | bx RA 4305 | bx RA
4276 |.endif 4306 |.endif
4277 break; 4307 break;
@@ -4389,6 +4419,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4389 | ldr BASE, L->base 4419 | ldr BASE, L->base
4390 | mv_vmstate CARG3, INTERP 4420 | mv_vmstate CARG3, INTERP
4391 | ldr CRET2, L->top 4421 | ldr CRET2, L->top
4422 | str L, [DISPATCH, #DISPATCH_GL(cur_L)]
4392 | lsl RC, CRET1, #3 4423 | lsl RC, CRET1, #3
4393 | st_vmstate CARG3 4424 | st_vmstate CARG3
4394 | ldr PC, [BASE, FRAME_PC] 4425 | ldr PC, [BASE, FRAME_PC]