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