diff options
author | Mike Pall <mike> | 2015-05-29 16:45:26 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2015-05-29 16:45:26 +0200 |
commit | 4da1bb66cdd20e868dae42d2c544280ec1b9fa76 (patch) | |
tree | 2478e233420ec544bdbb2b91f38d9e07b78bfc75 /src | |
parent | 5de95edf4c03296f65ff435c587719a7dff5e6f5 (diff) | |
download | luajit-4da1bb66cdd20e868dae42d2c544280ec1b9fa76.tar.gz luajit-4da1bb66cdd20e868dae42d2c544280ec1b9fa76.tar.bz2 luajit-4da1bb66cdd20e868dae42d2c544280ec1b9fa76.zip |
x64/LJ_GC64: Fix upvalue write barrier.
Diffstat (limited to 'src')
-rw-r--r-- | src/vm_x64.dasc | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index bc55d909..f99525b5 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc | |||
@@ -3412,9 +3412,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3412 | | ins_next | 3412 | | ins_next |
3413 | | | 3413 | | |
3414 | |2: // Upvalue is black. Check if new value is collectable and white. | 3414 | |2: // Upvalue is black. Check if new value is collectable and white. |
3415 | | sub RD, LJ_TISGCV | 3415 | | mov RD, RA |
3416 | | cmp RD, LJ_TNUMX - LJ_TISGCV // tvisgcv(v) | 3416 | | sar RD, 47 |
3417 | | sub RDd, LJ_TISGCV | ||
3418 | | cmp RDd, LJ_TNUMX - LJ_TISGCV // tvisgcv(v) | ||
3417 | | jbe <1 | 3419 | | jbe <1 |
3420 | | cleartp GCOBJ:RA | ||
3418 | | test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES // iswhite(v) | 3421 | | test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES // iswhite(v) |
3419 | | jz <1 | 3422 | | jz <1 |
3420 | | // Crossed a write barrier. Move the barrier forward. | 3423 | | // Crossed a write barrier. Move the barrier forward. |
@@ -3437,8 +3440,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3437 | | mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)] | 3440 | | mov UPVAL:RB, [LFUNC:RB+RA*8+offsetof(GCfuncL, uvptr)] |
3438 | | mov STR:RA, [KBASE+RD*8] | 3441 | | mov STR:RA, [KBASE+RD*8] |
3439 | | mov RD, UPVAL:RB->v | 3442 | | mov RD, UPVAL:RB->v |
3440 | | settp STR:RA, LJ_TSTR | 3443 | | settp STR:ITYPE, STR:RA, LJ_TSTR |
3441 | | mov [RD], STR:RA | 3444 | | mov [RD], STR:ITYPE |
3442 | | test byte UPVAL:RB->marked, LJ_GC_BLACK // isblack(uv) | 3445 | | test byte UPVAL:RB->marked, LJ_GC_BLACK // isblack(uv) |
3443 | | jnz >2 | 3446 | | jnz >2 |
3444 | |1: | 3447 | |1: |
@@ -3824,7 +3827,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3824 | | mov L:CARG1, SAVE_L | 3827 | | mov L:CARG1, SAVE_L |
3825 | | mov BASE, L:CARG1->base | 3828 | | mov BASE, L:CARG1->base |
3826 | | mov TMPR, rax | 3829 | | mov TMPR, rax |
3827 | | movzx RA, PC_RA | 3830 | | movzx RAd, PC_RA |
3828 | | jmp <2 // Must check write barrier for value. | 3831 | | jmp <2 // Must check write barrier for value. |
3829 | | | 3832 | | |
3830 | |7: // Possible table write barrier for the value. Skip valiswhite check. | 3833 | |7: // Possible table write barrier for the value. Skip valiswhite check. |