summaryrefslogtreecommitdiff
path: root/src/buildvm_x86.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r--src/buildvm_x86.dasc60
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