aboutsummaryrefslogtreecommitdiff
path: root/src/buildvm_x86.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r--src/buildvm_x86.dasc224
1 files changed, 188 insertions, 36 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index 3d28102e..6ac2646c 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -449,11 +449,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
449 | 449 |
450 | sub RD, 1 450 | sub RD, 1
451 | jz >2 451 | jz >2
452 |1: 452 |1: // Move results down.
453 | mov RB, [BASE+RA] // Move results down. 453 |.if X64
454 | mov RBa, [BASE+RA]
455 | mov [BASE-8], RBa
456 |.else
457 | mov RB, [BASE+RA]
454 | mov [BASE-8], RB 458 | mov [BASE-8], RB
455 | mov RB, [BASE+RA+4] 459 | mov RB, [BASE+RA+4]
456 | mov [BASE-4], RB 460 | mov [BASE-4], RB
461 |.endif
457 | add BASE, 8 462 | add BASE, 8
458 | sub RD, 1 463 | sub RD, 1
459 | jnz <1 464 | jnz <1
@@ -769,19 +774,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
769 | mov CARG3d, RA 774 | mov CARG3d, RA
770 | mov L:CARG1d, SAVE_L 775 | mov L:CARG1d, SAVE_L
771 | mov L:CARG1d->base, BASE 776 | mov L:CARG1d->base, BASE
772 | mov CARG2d, [RC+4] 777 | mov RCa, [RC]
773 | mov RC, [RC] 778 | mov [RB], RCa
774 | mov [RB+4], CARG2d
775 | mov [RB], RC
776 | mov CARG2d, RB 779 | mov CARG2d, RB
777 |.elif X64 780 |.elif X64
778 | mov L:CARG1d, SAVE_L 781 | mov L:CARG1d, SAVE_L
779 | mov L:CARG1d->base, BASE 782 | mov L:CARG1d->base, BASE
780 | mov CARG3d, RA 783 | mov CARG3d, RA
781 | mov RA, [RC+4] 784 | mov RAa, [RC]
782 | mov RC, [RC] 785 | mov [RB], RAa
783 | mov [RB+4], RA
784 | mov [RB], RC
785 | mov CARG2d, RB 786 | mov CARG2d, RB
786 |.else 787 |.else
787 | mov ARG3, RA 788 | mov ARG3, RA
@@ -850,10 +851,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
850 | jz >3 851 | jz >3
851 |->cont_ra: // BASE = base, RC = result 852 |->cont_ra: // BASE = base, RC = result
852 | movzx RA, PC_RA 853 | movzx RA, PC_RA
854 |.if X64
855 | mov RBa, [RC]
856 | mov [BASE+RA*8], RBa
857 |.else
853 | mov RB, [RC+4] 858 | mov RB, [RC+4]
854 | mov RC, [RC] 859 | mov RC, [RC]
855 | mov [BASE+RA*8+4], RB 860 | mov [BASE+RA*8+4], RB
856 | mov [BASE+RA*8], RC 861 | mov [BASE+RA*8], RC
862 |.endif
857 | ins_next 863 | ins_next
858 | 864 |
859 |3: // Call __index metamethod. 865 |3: // Call __index metamethod.
@@ -923,10 +929,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
923 | jz >3 929 | jz >3
924 | // NOBARRIER: lj_meta_tset ensures the table is not black. 930 | // NOBARRIER: lj_meta_tset ensures the table is not black.
925 | movzx RA, PC_RA 931 | movzx RA, PC_RA
932 |.if X64
933 | mov RBa, [BASE+RA*8]
934 | mov [RC], RBa
935 |.else
926 | mov RB, [BASE+RA*8+4] 936 | mov RB, [BASE+RA*8+4]
927 | mov RA, [BASE+RA*8] 937 | mov RA, [BASE+RA*8]
928 | mov [RC+4], RB 938 | mov [RC+4], RB
929 | mov [RC], RA 939 | mov [RC], RA
940 |.endif
930 |->cont_nop: // BASE = base, (RC = result) 941 |->cont_nop: // BASE = base, (RC = result)
931 | ins_next 942 | ins_next
932 | 943 |
@@ -935,10 +946,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
935 | mov RA, L:RB->top 946 | mov RA, L:RB->top
936 | mov [RA-12], PC // [cont|PC] 947 | mov [RA-12], PC // [cont|PC]
937 | movzx RC, PC_RA 948 | movzx RC, PC_RA
938 | mov RB, [BASE+RC*8+4] // Copy value to third argument. 949 | // Copy value to third argument.
950 |.if X64
951 | mov RBa, [BASE+RC*8]
952 | mov [RA+16], RBa
953 |.else
954 | mov RB, [BASE+RC*8+4]
939 | mov RC, [BASE+RC*8] 955 | mov RC, [BASE+RC*8]
940 | mov [RA+20], RB 956 | mov [RA+20], RB
941 | mov [RA+16], RC 957 | mov [RA+16], RC
958 |.endif
942 | lea PC, [RA+FRAME_CONT] 959 | lea PC, [RA+FRAME_CONT]
943 | sub PC, BASE 960 | sub PC, BASE
944 | mov LFUNC:RB, [RA-8] // Guaranteed to be a function here. 961 | mov LFUNC:RB, [RA-8] // Guaranteed to be a function here.
@@ -1249,10 +1266,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1249 | mov RA, BASE 1266 | mov RA, BASE
1250 |1: 1267 |1:
1251 | add RA, 8 1268 | add RA, 8
1269 |.if X64
1270 | mov RBa, [RA]
1271 | mov [RA-8], RBa
1272 |.else
1252 | mov RB, [RA+4] 1273 | mov RB, [RA+4]
1253 | mov [RA-4], RB 1274 | mov [RA-4], RB
1254 | mov RB, [RA] 1275 | mov RB, [RA]
1255 | mov [RA-8], RB 1276 | mov [RA-8], RB
1277 |.endif
1256 | sub RD, 1 1278 | sub RD, 1
1257 | jnz <1 1279 | jnz <1
1258 |2: 1280 |2:
@@ -1377,11 +1399,18 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1377 | call extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) 1399 | call extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key)
1378 | // cTValue * returned in eax (RD). 1400 | // cTValue * returned in eax (RD).
1379 | mov BASE, RB // Restore BASE. 1401 | mov BASE, RB // Restore BASE.
1380 | mov RB, [RD] // Copy table slot. 1402 | // Copy table slot.
1403 |.if X64
1404 | mov RBa, [RD]
1405 | mov PC, [BASE-4]
1406 | mov [BASE-8], RBa
1407 |.else
1408 | mov RB, [RD]
1381 | mov RD, [RD+4] 1409 | mov RD, [RD+4]
1382 | mov PC, [BASE-4] 1410 | mov PC, [BASE-4]
1383 | mov [BASE-8], RB 1411 | mov [BASE-8], RB
1384 | mov [BASE-4], RD 1412 | mov [BASE-4], RD
1413 |.endif
1385 | jmp ->fff_res1 1414 | jmp ->fff_res1
1386 | 1415 |
1387 |//-- Base library: conversions ------------------------------------------ 1416 |//-- Base library: conversions ------------------------------------------
@@ -1453,7 +1482,14 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1453 | // Flag returned in eax (RD). 1482 | // Flag returned in eax (RD).
1454 | mov BASE, L:RB->base 1483 | mov BASE, L:RB->base
1455 | test RD, RD; jz >3 // End of traversal? 1484 | test RD, RD; jz >3 // End of traversal?
1456 | mov RB, [BASE+8] // Copy key and value to results. 1485 | // Copy key and value to results.
1486 |.if X64
1487 | mov RBa, [BASE+8]
1488 | mov RDa, [BASE+16]
1489 | mov [BASE-8], RBa
1490 | mov [BASE], RDa
1491 |.else
1492 | mov RB, [BASE+8]
1457 | mov RD, [BASE+12] 1493 | mov RD, [BASE+12]
1458 | mov [BASE-8], RB 1494 | mov [BASE-8], RB
1459 | mov [BASE-4], RD 1495 | mov [BASE-4], RD
@@ -1461,6 +1497,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1461 | mov RD, [BASE+20] 1497 | mov RD, [BASE+20]
1462 | mov [BASE], RB 1498 | mov [BASE], RB
1463 | mov [BASE+4], RD 1499 | mov [BASE+4], RD
1500 |.endif
1464 |->fff_res2: 1501 |->fff_res2:
1465 | mov RD, 1+2 1502 | mov RD, 1+2
1466 | jmp ->fff_res 1503 | jmp ->fff_res
@@ -1508,10 +1545,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1508 | add RD, TAB:RB->array 1545 | add RD, TAB:RB->array
1509 |1: 1546 |1:
1510 | cmp dword [RD+4], LJ_TNIL; je ->fff_res0 1547 | cmp dword [RD+4], LJ_TNIL; je ->fff_res0
1511 | mov RB, [RD] // Copy array slot. 1548 | // Copy array slot.
1549 |.if X64
1550 | mov RBa, [RD]
1551 | mov [BASE], RBa
1552 |.else
1553 | mov RB, [RD]
1512 | mov RD, [RD+4] 1554 | mov RD, [RD+4]
1513 | mov [BASE], RB 1555 | mov [BASE], RB
1514 | mov [BASE+4], RD 1556 | mov [BASE+4], RD
1557 |.endif
1515 | jmp ->fff_res2 1558 | jmp ->fff_res2
1516 |2: // Check for empty hash part first. Otherwise call C function. 1559 |2: // Check for empty hash part first. Otherwise call C function.
1517 | cmp dword TAB:RB->hmask, 0; je ->fff_res0 1560 | cmp dword TAB:RB->hmask, 0; je ->fff_res0
@@ -1623,10 +1666,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1623 | cmp PC, RA 1666 | cmp PC, RA
1624 | je >3 1667 | je >3
1625 |2: // Move args to coroutine. 1668 |2: // Move args to coroutine.
1669 |.if X64
1670 | mov RCa, [PC+RB]
1671 | mov [PC-8], RCa
1672 |.else
1626 | mov RC, [PC+RB+4] 1673 | mov RC, [PC+RB+4]
1627 | mov [PC-4], RC 1674 | mov [PC-4], RC
1628 | mov RC, [PC+RB] 1675 | mov RC, [PC+RB]
1629 | mov [PC-8], RC 1676 | mov [PC-8], RC
1677 |.endif
1630 | sub PC, 8 1678 | sub PC, 8
1631 | cmp PC, RA 1679 | cmp PC, RA
1632 | jne <2 1680 | jne <2
@@ -1667,10 +1715,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1667 | mov RB, BASE 1715 | mov RB, BASE
1668 | sub RBa, RAa 1716 | sub RBa, RAa
1669 |5: // Move results from coroutine. 1717 |5: // Move results from coroutine.
1718 |.if X64
1719 | mov RDa, [RA]
1720 | mov [RA+RB], RDa
1721 |.else
1670 | mov RD, [RA] 1722 | mov RD, [RA]
1671 | mov [RA+RB], RD 1723 | mov [RA+RB], RD
1672 | mov RD, [RA+4] 1724 | mov RD, [RA+4]
1673 | mov [RA+RB+4], RD 1725 | mov [RA+RB+4], RD
1726 |.endif
1674 | add RA, 8 1727 | add RA, 8
1675 | cmp RA, KBASE 1728 | cmp RA, KBASE
1676 | jne <5 1729 | jne <5
@@ -1699,10 +1752,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1699 | mov RA, L:PC->top 1752 | mov RA, L:PC->top
1700 | sub RA, 8 1753 | sub RA, 8
1701 | mov L:PC->top, RA // Clear error from coroutine stack. 1754 | mov L:PC->top, RA // Clear error from coroutine stack.
1702 | mov RD, [RA] // Copy error message. 1755 | // Copy error message.
1756 |.if X64
1757 | mov RDa, [RA]
1758 | mov [BASE], RDa
1759 |.else
1760 | mov RD, [RA]
1703 | mov [BASE], RD 1761 | mov [BASE], RD
1704 | mov RD, [RA+4] 1762 | mov RD, [RA+4]
1705 | mov [BASE+4], RD 1763 | mov [BASE+4], RD
1764 |.endif
1706 | mov RD, 1+2 // nresults+1 = 1 + false + error. 1765 | mov RD, 1+2 // nresults+1 = 1 + false + error.
1707 | jmp <7 1766 | jmp <7
1708 |.else 1767 |.else
@@ -3525,10 +3584,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3525 3584
3526 case BC_MOV: 3585 case BC_MOV:
3527 | ins_AD // RA = dst, RD = src 3586 | ins_AD // RA = dst, RD = src
3587 |.if X64
3588 | mov RBa, [BASE+RD*8]
3589 | mov [BASE+RA*8], RBa
3590 |.else
3528 | mov RB, [BASE+RD*8+4] 3591 | mov RB, [BASE+RD*8+4]
3529 | mov RD, [BASE+RD*8] // Overwrites RD. 3592 | mov RD, [BASE+RD*8]
3530 | mov [BASE+RA*8+4], RB 3593 | mov [BASE+RA*8+4], RB
3531 | mov [BASE+RA*8], RD 3594 | mov [BASE+RA*8], RD
3595 |.endif
3532 | ins_next_ 3596 | ins_next_
3533 break; 3597 break;
3534 case BC_NOT: 3598 case BC_NOT:
@@ -3702,10 +3766,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3702 | jnz ->vmeta_binop 3766 | jnz ->vmeta_binop
3703 | movzx RB, PC_RB // Copy result to Stk[RA] from Stk[RB]. 3767 | movzx RB, PC_RB // Copy result to Stk[RA] from Stk[RB].
3704 | movzx RA, PC_RA 3768 | movzx RA, PC_RA
3769 |.if X64
3770 | mov RCa, [BASE+RB*8]
3771 | mov [BASE+RA*8], RCa
3772 |.else
3705 | mov RC, [BASE+RB*8+4] 3773 | mov RC, [BASE+RB*8+4]
3706 | mov RB, [BASE+RB*8] 3774 | mov RB, [BASE+RB*8]
3707 | mov [BASE+RA*8+4], RC 3775 | mov [BASE+RA*8+4], RC
3708 | mov [BASE+RA*8], RB 3776 | mov [BASE+RA*8], RB
3777 |.endif
3709 | ins_next 3778 | ins_next
3710 break; 3779 break;
3711 3780
@@ -3767,10 +3836,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3767 | mov LFUNC:RB, [BASE-8] 3836 | mov LFUNC:RB, [BASE-8]
3768 | mov UPVAL:RB, [LFUNC:RB+RD*4+offsetof(GCfuncL, uvptr)] 3837 | mov UPVAL:RB, [LFUNC:RB+RD*4+offsetof(GCfuncL, uvptr)]
3769 | mov RB, UPVAL:RB->v 3838 | mov RB, UPVAL:RB->v
3839 |.if X64
3840 | mov RDa, [RB]
3841 | mov [BASE+RA*8], RDa
3842 |.else
3770 | mov RD, [RB+4] 3843 | mov RD, [RB+4]
3771 | mov RB, [RB] 3844 | mov RB, [RB]
3772 | mov [BASE+RA*8+4], RD 3845 | mov [BASE+RA*8+4], RD
3773 | mov [BASE+RA*8], RB 3846 | mov [BASE+RA*8], RB
3847 |.endif
3774 | ins_next 3848 | ins_next
3775 break; 3849 break;
3776 case BC_USETV: 3850 case BC_USETV:
@@ -4021,20 +4095,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4021 | add RC, TAB:RB->array 4095 | add RC, TAB:RB->array
4022 | cmp dword [RC+4], LJ_TNIL // Avoid overwriting RB in fastpath. 4096 | cmp dword [RC+4], LJ_TNIL // Avoid overwriting RB in fastpath.
4023 | je >2 4097 | je >2
4024 |1: 4098 | // Get array slot.
4025 | mov RB, [RC] // Get array slot. 4099 |.if X64
4100 | mov RBa, [RC]
4101 | mov [BASE+RA*8], RBa
4102 |.else
4103 | mov RB, [RC]
4026 | mov RC, [RC+4] 4104 | mov RC, [RC+4]
4027 | mov [BASE+RA*8], RB 4105 | mov [BASE+RA*8], RB
4028 | mov [BASE+RA*8+4], RC 4106 | mov [BASE+RA*8+4], RC
4107 |.endif
4108 |1:
4029 | ins_next 4109 | ins_next
4030 | 4110 |
4031 |2: // Check for __index if table value is nil. 4111 |2: // Check for __index if table value is nil.
4032 | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. 4112 | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath.
4033 | jz <1 4113 | jz >3
4034 | mov TAB:RA, TAB:RB->metatable 4114 | mov TAB:RA, TAB:RB->metatable
4035 | test byte TAB:RA->nomm, 1<<MM_index 4115 | test byte TAB:RA->nomm, 1<<MM_index
4036 | jz ->vmeta_tgetv // 'no __index' flag NOT set: check. 4116 | jz ->vmeta_tgetv // 'no __index' flag NOT set: check.
4037 | movzx RA, PC_RA // Restore RA. 4117 | movzx RA, PC_RA // Restore RA.
4118 |3:
4119 | mov dword [BASE+RA*8+4], LJ_TNIL
4038 | jmp <1 4120 | jmp <1
4039 | 4121 |
4040 |5: // String key? 4122 |5: // String key?
@@ -4062,16 +4144,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4062 | cmp dword [RA+4], LJ_TNIL // Avoid overwriting RB in fastpath. 4144 | cmp dword [RA+4], LJ_TNIL // Avoid overwriting RB in fastpath.
4063 | je >5 // Key found, but nil value? 4145 | je >5 // Key found, but nil value?
4064 | movzx RC, PC_RA 4146 | movzx RC, PC_RA
4065 | mov RB, [RA] // Get node value. 4147 | // Get node value.
4148 |.if X64
4149 | mov RBa, [RA]
4150 | mov [BASE+RC*8], RBa
4151 |.else
4152 | mov RB, [RA]
4066 | mov RA, [RA+4] 4153 | mov RA, [RA+4]
4067 | mov [BASE+RC*8], RB 4154 | mov [BASE+RC*8], RB
4068 |2:
4069 | mov [BASE+RC*8+4], RA 4155 | mov [BASE+RC*8+4], RA
4156 |.endif
4157 |2:
4070 | ins_next 4158 | ins_next
4071 | 4159 |
4072 |3: 4160 |3:
4073 | movzx RC, PC_RA 4161 | movzx RC, PC_RA
4074 | mov RA, LJ_TNIL 4162 | mov dword [BASE+RC*8+4], LJ_TNIL
4075 | jmp <2 4163 | jmp <2
4076 | 4164 |
4077 |4: // Follow hash chain. 4165 |4: // Follow hash chain.
@@ -4098,20 +4186,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4098 | add RC, TAB:RB->array 4186 | add RC, TAB:RB->array
4099 | cmp dword [RC+4], LJ_TNIL // Avoid overwriting RB in fastpath. 4187 | cmp dword [RC+4], LJ_TNIL // Avoid overwriting RB in fastpath.
4100 | je >2 4188 | je >2
4101 |1: 4189 | // Get array slot.
4102 | mov RB, [RC] // Get array slot. 4190 |.if X64
4191 | mov RBa, [RC]
4192 | mov [BASE+RA*8], RBa
4193 |.else
4194 | mov RB, [RC]
4103 | mov RC, [RC+4] 4195 | mov RC, [RC+4]
4104 | mov [BASE+RA*8], RB 4196 | mov [BASE+RA*8], RB
4105 | mov [BASE+RA*8+4], RC 4197 | mov [BASE+RA*8+4], RC
4198 |.endif
4199 |1:
4106 | ins_next 4200 | ins_next
4107 | 4201 |
4108 |2: // Check for __index if table value is nil. 4202 |2: // Check for __index if table value is nil.
4109 | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. 4203 | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath.
4110 | jz <1 4204 | jz >3
4111 | mov TAB:RA, TAB:RB->metatable 4205 | mov TAB:RA, TAB:RB->metatable
4112 | test byte TAB:RA->nomm, 1<<MM_index 4206 | test byte TAB:RA->nomm, 1<<MM_index
4113 | jz ->vmeta_tgetb // 'no __index' flag NOT set: check. 4207 | jz ->vmeta_tgetb // 'no __index' flag NOT set: check.
4114 | movzx RA, PC_RA // Restore RA. 4208 | movzx RA, PC_RA // Restore RA.
4209 |3:
4210 | mov dword [BASE+RA*8+4], LJ_TNIL
4115 | jmp <1 4211 | jmp <1
4116 break; 4212 break;
4117 4213
@@ -4146,11 +4242,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4146 |1: 4242 |1:
4147 | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) 4243 | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table)
4148 | jnz >7 4244 | jnz >7
4149 |2: 4245 |2: // Set array slot.
4150 | mov RB, [BASE+RA*8+4] // Set array slot. 4246 |.if X64
4247 | mov RBa, [BASE+RA*8]
4248 | mov [RC], RBa
4249 |.else
4250 | mov RB, [BASE+RA*8+4]
4151 | mov RA, [BASE+RA*8] 4251 | mov RA, [BASE+RA*8]
4152 | mov [RC+4], RB 4252 | mov [RC+4], RB
4153 | mov [RC], RA 4253 | mov [RC], RA
4254 |.endif
4154 | ins_next 4255 | ins_next
4155 | 4256 |
4156 |3: // Check for __newindex if previous value is nil. 4257 |3: // Check for __newindex if previous value is nil.
@@ -4195,12 +4296,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4195 |2: 4296 |2:
4196 | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) 4297 | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table)
4197 | jnz >7 4298 | jnz >7
4198 |3: 4299 |3: // Set node value.
4199 | movzx RC, PC_RA 4300 | movzx RC, PC_RA
4200 | mov RB, [BASE+RC*8+4] // Set node value. 4301 |.if X64
4302 | mov RBa, [BASE+RC*8]
4303 | mov [RA], RBa
4304 |.else
4305 | mov RB, [BASE+RC*8+4]
4201 | mov RC, [BASE+RC*8] 4306 | mov RC, [BASE+RC*8]
4202 | mov [RA+4], RB 4307 | mov [RA+4], RB
4203 | mov [RA], RC 4308 | mov [RA], RC
4309 |.endif
4204 | ins_next 4310 | ins_next
4205 | 4311 |
4206 |4: // Check for __newindex if previous value is nil. 4312 |4: // Check for __newindex if previous value is nil.
@@ -4268,11 +4374,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4268 |1: 4374 |1:
4269 | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) 4375 | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table)
4270 | jnz >7 4376 | jnz >7
4271 |2: 4377 |2: // Set array slot.
4272 | mov RB, [BASE+RA*8+4] // Set array slot. 4378 |.if X64
4379 | mov RAa, [BASE+RA*8]
4380 | mov [RC], RAa
4381 |.else
4382 | mov RB, [BASE+RA*8+4]
4273 | mov RA, [BASE+RA*8] 4383 | mov RA, [BASE+RA*8]
4274 | mov [RC+4], RB 4384 | mov [RC+4], RB
4275 | mov [RC], RA 4385 | mov [RC], RA
4386 |.endif
4276 | ins_next 4387 | ins_next
4277 | 4388 |
4278 |3: // Check for __newindex if previous value is nil. 4389 |3: // Check for __newindex if previous value is nil.
@@ -4310,11 +4421,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4310 | shl KBASE, 3 4421 | shl KBASE, 3
4311 | add KBASE, TAB:RB->array 4422 | add KBASE, TAB:RB->array
4312 |3: // Copy result slots to table. 4423 |3: // Copy result slots to table.
4424 |.if X64
4425 | mov RBa, [RA]
4426 | add RA, 8
4427 | mov [KBASE], RBa
4428 |.else
4313 | mov RB, [RA] 4429 | mov RB, [RA]
4314 | mov [KBASE], RB 4430 | mov [KBASE], RB
4315 | mov RB, [RA+4] 4431 | mov RB, [RA+4]
4316 | add RA, 8 4432 | add RA, 8
4317 | mov [KBASE+4], RB 4433 | mov [KBASE+4], RB
4434 |.endif
4318 | add KBASE, 8 4435 | add KBASE, 8
4319 | sub RD, 1 4436 | sub RD, 1
4320 | jnz <3 4437 | jnz <3
@@ -4382,13 +4499,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4382 | mov MULTRES, NARGS:RD 4499 | mov MULTRES, NARGS:RD
4383 | sub NARGS:RD, 1 4500 | sub NARGS:RD, 1
4384 | jz >3 4501 | jz >3
4385 |2: 4502 |2: // Move args down.
4386 | mov RB, [RA] // Move args down. 4503 |.if X64
4504 | mov RBa, [RA]
4505 | add RA, 8
4506 | mov [KBASE], RBa
4507 |.else
4508 | mov RB, [RA]
4387 | mov [KBASE], RB 4509 | mov [KBASE], RB
4388 | mov RB, [RA+4] 4510 | mov RB, [RA+4]
4511 | add RA, 8
4389 | mov [KBASE+4], RB 4512 | mov [KBASE+4], RB
4513 |.endif
4390 | add KBASE, 8 4514 | add KBASE, 8
4391 | add RA, 8
4392 | sub NARGS:RD, 1 4515 | sub NARGS:RD, 1
4393 | jnz <2 4516 | jnz <2
4394 | 4517 |
@@ -4427,6 +4550,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4427 case BC_ITERC: 4550 case BC_ITERC:
4428 | ins_A // RA = base, (RB = nresults+1,) RC = nargs+1 (2+1) 4551 | ins_A // RA = base, (RB = nresults+1,) RC = nargs+1 (2+1)
4429 | lea RA, [BASE+RA*8+8] // fb = base+1 4552 | lea RA, [BASE+RA*8+8] // fb = base+1
4553 |.if X64
4554 | mov RBa, [RA-24] // Copy state. fb[0] = fb[-3].
4555 | mov RCa, [RA-16] // Copy control var. fb[1] = fb[-2].
4556 | mov [RA], RBa
4557 | mov [RA+8], RCa
4558 |.else
4430 | mov RB, [RA-24] // Copy state. fb[0] = fb[-3]. 4559 | mov RB, [RA-24] // Copy state. fb[0] = fb[-3].
4431 | mov RC, [RA-20] 4560 | mov RC, [RA-20]
4432 | mov [RA], RB 4561 | mov [RA], RB
@@ -4435,6 +4564,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4435 | mov RC, [RA-12] 4564 | mov RC, [RA-12]
4436 | mov [RA+8], RB 4565 | mov [RA+8], RB
4437 | mov [RA+12], RC 4566 | mov [RA+12], RC
4567 |.endif
4438 | mov LFUNC:RB, [RA-32] // Copy callable. fb[-1] = fb[-4] 4568 | mov LFUNC:RB, [RA-32] // Copy callable. fb[-1] = fb[-4]
4439 | mov RC, [RA-28] 4569 | mov RC, [RA-28]
4440 | mov [RA-8], LFUNC:RB 4570 | mov [RA-8], LFUNC:RB
@@ -4459,11 +4589,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4459 | cmp KBASE, BASE // No vararg slots? 4589 | cmp KBASE, BASE // No vararg slots?
4460 | jnb >2 4590 | jnb >2
4461 |1: // Copy vararg slots to destination slots. 4591 |1: // Copy vararg slots to destination slots.
4592 |.if X64
4593 | mov RCa, [KBASE-8]
4594 | add KBASE, 8
4595 | mov [RA], RCa
4596 |.else
4462 | mov RC, [KBASE-8] 4597 | mov RC, [KBASE-8]
4463 | mov [RA], RC 4598 | mov [RA], RC
4464 | mov RC, [KBASE-4] 4599 | mov RC, [KBASE-4]
4465 | add KBASE, 8 4600 | add KBASE, 8
4466 | mov [RA+4], RC 4601 | mov [RA+4], RC
4602 |.endif
4467 | add RA, 8 4603 | add RA, 8
4468 | cmp RA, RB // All destination slots filled? 4604 | cmp RA, RB // All destination slots filled?
4469 | jnb >3 4605 | jnb >3
@@ -4492,11 +4628,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4492 | cmp RC, L:RB->maxstack 4628 | cmp RC, L:RB->maxstack
4493 | ja >7 // Need to grow stack? 4629 | ja >7 // Need to grow stack?
4494 |6: // Copy all vararg slots. 4630 |6: // Copy all vararg slots.
4631 |.if X64
4632 | mov RCa, [KBASE-8]
4633 | add KBASE, 8
4634 | mov [RA], RCa
4635 |.else
4495 | mov RC, [KBASE-8] 4636 | mov RC, [KBASE-8]
4496 | mov [RA], RC 4637 | mov [RA], RC
4497 | mov RC, [KBASE-4] 4638 | mov RC, [KBASE-4]
4498 | add KBASE, 8 4639 | add KBASE, 8
4499 | mov [RA+4], RC 4640 | mov [RA+4], RC
4641 |.endif
4500 | add RA, 8 4642 | add RA, 8
4501 | cmp KBASE, BASE // No more vararg slots? 4643 | cmp KBASE, BASE // No more vararg slots?
4502 | jb <6 4644 | jb <6
@@ -4541,11 +4683,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4541 | mov KBASE, BASE // Use KBASE for result move. 4683 | mov KBASE, BASE // Use KBASE for result move.
4542 | sub RD, 1 4684 | sub RD, 1
4543 | jz >3 4685 | jz >3
4544 |2: 4686 |2: // Move results down.
4545 | mov RB, [KBASE+RA] // Move results down. 4687 |.if X64
4688 | mov RBa, [KBASE+RA]
4689 | mov [KBASE-8], RBa
4690 |.else
4691 | mov RB, [KBASE+RA]
4546 | mov [KBASE-8], RB 4692 | mov [KBASE-8], RB
4547 | mov RB, [KBASE+RA+4] 4693 | mov RB, [KBASE+RA+4]
4548 | mov [KBASE-4], RB 4694 | mov [KBASE-4], RB
4695 |.endif
4549 | add KBASE, 8 4696 | add KBASE, 8
4550 | sub RD, 1 4697 | sub RD, 1
4551 | jnz <2 4698 | jnz <2
@@ -4557,10 +4704,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4557 | ja >6 4704 | ja >6
4558 break; 4705 break;
4559 case BC_RET1: 4706 case BC_RET1:
4707 |.if X64
4708 | mov RBa, [BASE+RA]
4709 | mov [BASE-8], RBa
4710 |.else
4560 | mov RB, [BASE+RA+4] 4711 | mov RB, [BASE+RA+4]
4561 | mov [BASE-4], RB 4712 | mov [BASE-4], RB
4562 | mov RB, [BASE+RA] 4713 | mov RB, [BASE+RA]
4563 | mov [BASE-8], RB 4714 | mov [BASE-8], RB
4715 |.endif
4564 /* fallthrough */ 4716 /* fallthrough */
4565 case BC_RET0: 4717 case BC_RET0:
4566 |5: 4718 |5: