aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildvm_ppc.dasc28
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 (~)