diff options
-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. |