aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2015-05-29 16:45:26 +0200
committerMike Pall <mike>2015-05-29 16:45:26 +0200
commit4da1bb66cdd20e868dae42d2c544280ec1b9fa76 (patch)
tree2478e233420ec544bdbb2b91f38d9e07b78bfc75 /src
parent5de95edf4c03296f65ff435c587719a7dff5e6f5 (diff)
downloadluajit-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.dasc13
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.