diff options
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r-- | src/buildvm_x86.dasc | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index 90d80dbf..10899e70 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -414,23 +414,25 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
414 | | mov KBASE, [PC+PC2PROTO(k)] | 414 | | mov KBASE, [PC+PC2PROTO(k)] |
415 | | mov L:RB, SAVE_L | 415 | | mov L:RB, SAVE_L |
416 | | lea RA, [BASE+RA*8] // Top of frame. | 416 | | lea RA, [BASE+RA*8] // Top of frame. |
417 | | lea RC, [BASE+NARGS:RC*8-4] // Points to tag of 1st free slot. | ||
418 | | cmp RA, L:RB->maxstack | 417 | | cmp RA, L:RB->maxstack |
419 | | ja ->gate_lf_growstack | 418 | | ja ->gate_lf_growstack |
420 | |9: // Entry point from vararg setup below. | 419 | | movzx RA, byte [PC+PC2PROTO(numparams)] |
421 | | mov RB, LJ_TNIL | 420 | | cmp NARGS:RC, RA // Check for missing parameters. |
422 | |1: // Clear free slots until top of frame. | 421 | | jbe >3 |
423 | | mov [RC], RB | 422 | |2: |
424 | | mov [RC+8], RB | ||
425 | | add RC, 16 | ||
426 | | cmp RC, RA | ||
427 | | jb <1 | ||
428 | #if LJ_HASJIT | 423 | #if LJ_HASJIT |
429 | | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. | 424 | | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. |
430 | | // hotcall RB | 425 | | // hotcall RB |
431 | #endif | 426 | #endif |
432 | | ins_next | 427 | | ins_next |
433 | | | 428 | | |
429 | |3: // Clear missing parameters. | ||
430 | | mov dword [BASE+NARGS:RC*8-4], LJ_TNIL | ||
431 | | add NARGS:RC, 1 | ||
432 | | cmp NARGS:RC, RA // Check for missing parameters. | ||
433 | | jbe <3 | ||
434 | | jmp <2 | ||
435 | | | ||
434 | |->gate_lv: // Call gate for vararg Lua functions. | 436 | |->gate_lv: // Call gate for vararg Lua functions. |
435 | | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = old base), PC = return | 437 | | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = old base), PC = return |
436 | | // DISPATCH initialized | 438 | | // DISPATCH initialized |
@@ -443,29 +445,38 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
443 | | movzx RB, byte [PC+PC2PROTO(framesize)] | 445 | | movzx RB, byte [PC+PC2PROTO(framesize)] |
444 | | lea KBASE, [BASE+RB*8] | 446 | | lea KBASE, [BASE+RB*8] |
445 | | mov L:RB, SAVE_L | 447 | | mov L:RB, SAVE_L |
446 | | lea RC, [BASE+4] | ||
447 | | cmp KBASE, L:RB->maxstack | 448 | | cmp KBASE, L:RB->maxstack |
448 | | ja ->gate_lv_growstack // Need to grow stack. | 449 | | ja ->gate_lv_growstack // Need to grow stack. |
450 | | mov RC, BASE | ||
449 | | movzx RB, byte [PC+PC2PROTO(numparams)] | 451 | | movzx RB, byte [PC+PC2PROTO(numparams)] |
450 | | test RB, RB | 452 | | test RB, RB |
451 | | jz >2 | 453 | | jz >2 |
452 | |1: // Copy fixarg slots up. | 454 | |1: // Copy fixarg slots up to new frame. |
453 | | add RA, 8 | 455 | | add RA, 8 |
454 | | cmp RA, BASE | 456 | | cmp RA, BASE |
455 | | jnb >2 | 457 | | jnb >3 // Less args than parameters? |
456 | | mov KBASE, [RA-8] | 458 | | mov KBASE, [RA-8] |
457 | | mov [RC-4], KBASE | ||
458 | | mov KBASE, [RA-4] | ||
459 | | mov [RC], KBASE | 459 | | mov [RC], KBASE |
460 | | mov KBASE, [RA-4] | ||
461 | | mov [RC+4], KBASE | ||
460 | | add RC, 8 | 462 | | add RC, 8 |
461 | | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). | 463 | | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). |
462 | | sub RB, 1 | 464 | | sub RB, 1 |
463 | | jnz <1 | 465 | | jnz <1 |
464 | |2: | 466 | |2: |
465 | | movzx RA, byte [PC+PC2PROTO(framesize)] | ||
466 | | mov KBASE, [PC+PC2PROTO(k)] | 467 | | mov KBASE, [PC+PC2PROTO(k)] |
467 | | lea RA, [BASE+RA*8] | 468 | #if LJ_HASJIT |
468 | | jmp <9 | 469 | | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. |
470 | | // hotcall RB | ||
471 | #endif | ||
472 | | ins_next | ||
473 | | | ||
474 | |3: // Clear missing parameters. | ||
475 | | mov dword [RC+4], LJ_TNIL | ||
476 | | add RC, 8 | ||
477 | | sub RB, 1 | ||
478 | | jnz <3 | ||
479 | | jmp <2 | ||
469 | | | 480 | | |
470 | |->gate_cwrap: // Call gate for wrapped C functions. | 481 | |->gate_cwrap: // Call gate for wrapped C functions. |
471 | | // RA = new base, RB = CFUNC, RC = nargs+1, (BASE = old base), PC = return | 482 | | // RA = new base, RB = CFUNC, RC = nargs+1, (BASE = old base), PC = return |
@@ -663,19 +674,12 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
663 | | jmp >1 | 674 | | jmp >1 |
664 | | | 675 | | |
665 | |->gate_lv_growstack: // Grow stack for vararg Lua function. | 676 | |->gate_lv_growstack: // Grow stack for vararg Lua function. |
666 | //XXX | 677 | | mov BASE, RA // Drop vararg frame again. |
667 | | sub RC, 8 | ||
668 | | mov BASE, RA | ||
669 | | mov RA, KBASE | ||
670 | | lea PC, [PROTO:RB+sizeof(GCproto)] | ||
671 | | mov L:RB, SAVE_L | ||
672 | | | 678 | | |
673 | |->gate_lf_growstack: // Grow stack for fixarg Lua function. | 679 | |->gate_lf_growstack: // Grow stack for fixarg Lua function. |
674 | | // BASE = new base, RA = requested top, RC = top (offset +4 bytes) | 680 | | // BASE = new base, RC = nargs+1, RB = L, PC = first PC |
675 | | // RB = L, PC = first PC of called function (or anything if C function) | 681 | | lea RC, [BASE+NARGS:RC*8-8] |
676 | | sub RC, 4 // Adjust top. | 682 | | movzx RA, byte [PC+PC2PROTO(framesize)] |
677 | | sub RA, BASE | ||
678 | | shr RA, 3 // n = pt->framesize - L->top | ||
679 | | add PC, 4 // Must point after first instruction. | 683 | | add PC, 4 // Must point after first instruction. |
680 | | mov L:RB->base, BASE | 684 | | mov L:RB->base, BASE |
681 | | mov L:RB->top, RC | 685 | | mov L:RB->top, RC |