diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 6633bb21..b3461b32 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -1773,21 +1773,25 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1773 | | efdcmpeq cr1, RC, TMP1 | 1773 | | efdcmpeq cr1, RC, TMP1 |
1774 | | lwz TMP1, TAB:RB->array | 1774 | | lwz TMP1, TAB:RB->array |
1775 | | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt | 1775 | | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt |
1776 | | slwi TMP2, TMP2, 3 | 1776 | | slwi TMP0, TMP2, 3 |
1777 | | ble ->vmeta_tsetv // Integer key and in array part? | 1777 | | ble ->vmeta_tsetv // Integer key and in array part? |
1778 | | evlddx TMP0, TMP1, TMP2 | 1778 | | lbz TMP3, TAB:RB->marked |
1779 | | checknil TMP0 | 1779 | | evlddx TMP2, TMP1, TMP0 |
1780 | | checkok >2 | 1780 | | checknil TMP2 |
1781 | | checkok >3 | ||
1781 | |1: | 1782 | |1: |
1782 | | evstddx SAVE0, TMP1, TMP2 | 1783 | | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(table) |
1784 | | evstddx SAVE0, TMP1, TMP0 | ||
1785 | | bne >7 | ||
1786 | |2: | ||
1783 | | ins_next | 1787 | | ins_next |
1784 | | | 1788 | | |
1785 | |2: // Check for __newindex if previous value is nil. | 1789 | |3: // Check for __newindex if previous value is nil. |
1786 | | lwz TAB:TMP3, TAB:RB->metatable | 1790 | | lwz TAB:TMP2, TAB:RB->metatable |
1787 | | cmplwi TAB:TMP3, 0 | 1791 | | cmplwi TAB:TMP2, 0 |
1788 | | beq <1 // No metatable: done. | 1792 | | beq <1 // No metatable: done. |
1789 | | lbz TMP0, TAB:TMP3->nomm | 1793 | | lbz TMP2, TAB:TMP2->nomm |
1790 | | andi. TMP0, TMP0, 1<<MM_newindex | 1794 | | andi. TMP2, TMP2, 1<<MM_newindex |
1791 | | bne <1 // 'no __newindex' flag set: done. | 1795 | | bne <1 // 'no __newindex' flag set: done. |
1792 | | b ->vmeta_tsetv | 1796 | | b ->vmeta_tsetv |
1793 | | | 1797 | | |
@@ -1795,6 +1799,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1795 | | checkstr STR:RC // String key? | 1799 | | checkstr STR:RC // String key? |
1796 | | checkok ->BC_TSETS_Z | 1800 | | checkok ->BC_TSETS_Z |
1797 | | b ->vmeta_tsetv | 1801 | | b ->vmeta_tsetv |
1802 | | | ||
1803 | |7: // Possible table write barrier for the value. Skip valiswhite check. | ||
1804 | | barrierback TAB:RB, TMP3, TMP0 | ||
1805 | | b <2 | ||
1798 | break; | 1806 | break; |
1799 | case BC_TSETS: | 1807 | case BC_TSETS: |
1800 | | // RA = src*8, RB = table*8, RC = str_const*8 (~) | 1808 | | // RA = src*8, RB = table*8, RC = str_const*8 (~) |