diff options
author | Mike Pall <mike> | 2010-09-11 01:52:26 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-11 01:52:26 +0200 |
commit | c330af2452a52c5c33cbe88517b03cffccaa3bd5 (patch) | |
tree | adbb2a28d49e0e48d98f79eb9adc173e0351dd25 | |
parent | cabcce1e1dad5f1d45427c435e33901d45c19de8 (diff) | |
download | luajit-c330af2452a52c5c33cbe88517b03cffccaa3bd5.tar.gz luajit-c330af2452a52c5c33cbe88517b03cffccaa3bd5.tar.bz2 luajit-c330af2452a52c5c33cbe88517b03cffccaa3bd5.zip |
PPC: Add continuation dispatch and RA/nop continuations.
-rw-r--r-- | src/buildvm_ppc.dasc | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 51b592f1..99d98bc1 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -466,7 +466,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
466 | | li TMP0, -8 | 466 | | li TMP0, -8 |
467 | | evlddx LFUNC:RB, BASE, TMP0 | 467 | | evlddx LFUNC:RB, BASE, TMP0 |
468 | | checkfunc LFUNC:RB | 468 | | checkfunc LFUNC:RB |
469 | | checkfail ->vmeta_call // Ensure KBASE defined and != BASE. | 469 | | checkfail ->vmeta_call |
470 | | | 470 | | |
471 | |->vm_call_dispatch_f: | 471 | |->vm_call_dispatch_f: |
472 | | ins_call | 472 | | ins_call |
@@ -500,10 +500,26 @@ static void build_subroutines(BuildCtx *ctx) | |||
500 | |//-- Metamethod handling ------------------------------------------------ | 500 | |//-- Metamethod handling ------------------------------------------------ |
501 | |//----------------------------------------------------------------------- | 501 | |//----------------------------------------------------------------------- |
502 | | | 502 | | |
503 | |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the | ||
504 | |// stack, so BASE doesn't need to be reloaded across these calls. | ||
505 | | | ||
503 | |//-- Continuation dispatch ---------------------------------------------- | 506 | |//-- Continuation dispatch ---------------------------------------------- |
504 | | | 507 | | |
505 | |->cont_dispatch: | 508 | |->cont_dispatch: |
506 | | NYI | 509 | | // BASE = meta base, RA = resultptr, RD = (nresults+1)*8 |
510 | | lwz TMP0, -12(BASE) // Continuation. | ||
511 | | rlwinm TMP1, PC, 0, 0, 28 | ||
512 | | mr RB, BASE | ||
513 | | sub BASE, BASE, TMP1 // Restore caller BASE. | ||
514 | | lwz LFUNC:TMP1, FRAME_FUNC(BASE) | ||
515 | | subi TMP2, RD, 8 | ||
516 | | mtctr TMP0 | ||
517 | | lwz PC, -16(RB) // Restore PC from [cont|PC]. | ||
518 | | lwz TMP1, LFUNC:TMP1->pc | ||
519 | | evstddx TISNIL, RA, TMP2 // Ensure one valid arg. | ||
520 | | lwz KBASE, PC2PROTO(k)(TMP1) | ||
521 | | // BASE = base, RA = resultptr, RB = meta base | ||
522 | | bctr // Jump to continuation. | ||
507 | | | 523 | | |
508 | |->cont_cat: | 524 | |->cont_cat: |
509 | | NYI | 525 | | NYI |
@@ -537,10 +553,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
537 | |->vmeta_comp: | 553 | |->vmeta_comp: |
538 | | NYI | 554 | | NYI |
539 | |->cont_nop: | 555 | |->cont_nop: |
540 | | NYI | 556 | | ins_next |
541 | | | 557 | | |
542 | |->cont_ra: | 558 | |->cont_ra: // RA = resultptr |
543 | | NYI | 559 | | lwz INS, -4(PC) |
560 | | evldd TMP0, 0(RA) | ||
561 | | decode_RA8 TMP1, INS | ||
562 | | evstddx TMP0, BASE, TMP1 | ||
563 | | b ->cont_nop | ||
544 | | | 564 | | |
545 | |->cont_condt: | 565 | |->cont_condt: |
546 | | NYI | 566 | | NYI |