diff options
| author | Mike Pall <mike> | 2010-09-13 21:21:39 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-09-13 21:21:39 +0200 |
| commit | 7a766c771d4562311e62477722cf41d86dba1950 (patch) | |
| tree | 3430ee8b3cfc5b52363bb7d07be8d2a47c03a8e7 /src | |
| parent | dcfc385bf39747eb90555db8bfe496516ece4dc8 (diff) | |
| download | luajit-7a766c771d4562311e62477722cf41d86dba1950.tar.gz luajit-7a766c771d4562311e62477722cf41d86dba1950.tar.bz2 luajit-7a766c771d4562311e62477722cf41d86dba1950.zip | |
PPC: Add missing write barrier to BC_TSETV.
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 (~) |
