diff options
| author | Mike Pall <mike> | 2010-10-01 01:44:02 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-10-01 01:44:02 +0200 |
| commit | dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f (patch) | |
| tree | 3599e7c0f92b0d0661404ea7ffe1afeff3c385c2 | |
| parent | ac76493df113e6e648b03e61c0fa56c5754e832d (diff) | |
| download | luajit-dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f.tar.gz luajit-dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f.tar.bz2 luajit-dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f.zip | |
PPC: Add BC_ITERN and BC_ISNEXT.
| -rw-r--r-- | src/buildvm_ppc.dasc | 93 |
1 files changed, 91 insertions, 2 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 43c3caca..a588b9be 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
| @@ -2451,11 +2451,100 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 2451 | break; | 2451 | break; |
| 2452 | 2452 | ||
| 2453 | case BC_ITERN: | 2453 | case BC_ITERN: |
| 2454 | | NYI | 2454 | | // RA = base*8, (RB = (nresults+1)*8 (2+1)*8, RC = (nargs+1)*8 (2+1)*8) |
| 2455 | #if LJ_HASJIT | ||
| 2456 | | // NYI: add hotloop, record BC_ITERN. | ||
| 2457 | #endif | ||
| 2458 | | add RA, BASE, RA | ||
| 2459 | | lwz TAB:RB, -12(RA) | ||
| 2460 | | lwz RC, -4(RA) // Get index from control var. | ||
| 2461 | | lwz TMP0, TAB:RB->asize | ||
| 2462 | | lwz TMP1, TAB:RB->array | ||
| 2463 | | addi PC, PC, 4 | ||
| 2464 | |1: // Traverse array part. | ||
| 2465 | | cmplw RC, TMP0 | ||
| 2466 | | slwi TMP3, RC, 3 | ||
| 2467 | | bge >5 // Index points after array part? | ||
| 2468 | | evlddx TMP2, TMP1, TMP3 | ||
| 2469 | | checknil TMP2 | ||
| 2470 | | lwz INS, -4(PC) | ||
| 2471 | | checkok >4 | ||
| 2472 | | efdcfsi TMP0, RC | ||
| 2473 | | addi RC, RC, 1 | ||
| 2474 | | addis TMP3, PC, -(BCBIAS_J*4 >> 16) | ||
| 2475 | | evstdd TMP2, 8(RA) | ||
| 2476 | | decode_RD4 TMP1, INS | ||
| 2477 | | stw RC, -4(RA) // Update control var. | ||
| 2478 | | add PC, TMP1, TMP3 | ||
| 2479 | | evstdd TMP0, 0(RA) | ||
| 2480 | |3: | ||
| 2481 | | ins_next | ||
| 2482 | | | ||
| 2483 | |4: // Skip holes in array part. | ||
| 2484 | | addi RC, RC, 1 | ||
| 2485 | | b <1 | ||
| 2486 | | | ||
| 2487 | |5: // Traverse hash part. | ||
| 2488 | | lwz TMP1, TAB:RB->hmask | ||
| 2489 | | sub RC, RC, TMP0 | ||
| 2490 | | lwz TMP2, TAB:RB->node | ||
| 2491 | |6: | ||
| 2492 | | cmplw RC, TMP1 // End of iteration? Branch to ITERL+1. | ||
| 2493 | | slwi TMP3, RC, 5 | ||
| 2494 | | bgt <3 | ||
| 2495 | | slwi RB, RC, 3 | ||
| 2496 | | sub TMP3, TMP3, RB | ||
| 2497 | | evlddx RB, TMP2, TMP3 | ||
| 2498 | | add NODE:TMP3, TMP2, TMP3 | ||
| 2499 | | checknil RB | ||
| 2500 | | lwz INS, -4(PC) | ||
| 2501 | | checkok >7 | ||
| 2502 | | evldd TMP3, NODE:TMP3->key | ||
| 2503 | | addis TMP2, PC, -(BCBIAS_J*4 >> 16) | ||
| 2504 | | evstdd RB, 8(RA) | ||
| 2505 | | add RC, RC, TMP0 | ||
| 2506 | | decode_RD4 TMP1, INS | ||
| 2507 | | evstdd TMP3, 0(RA) | ||
| 2508 | | addi RC, RC, 1 | ||
| 2509 | | add PC, TMP1, TMP2 | ||
| 2510 | | stw RC, -4(RA) // Update control var. | ||
| 2511 | | b <3 | ||
| 2512 | | | ||
| 2513 | |7: // Skip holes in hash part. | ||
| 2514 | | addi RC, RC, 1 | ||
| 2515 | | b <6 | ||
| 2455 | break; | 2516 | break; |
| 2456 | 2517 | ||
| 2457 | case BC_ISNEXT: | 2518 | case BC_ISNEXT: |
| 2458 | | NYI | 2519 | | // RA = base*8, RD = target (points to ITERN) |
| 2520 | | add RA, BASE, RA | ||
| 2521 | | li TMP2, -24 | ||
| 2522 | | evlddx CFUNC:TMP1, RA, TMP2 | ||
| 2523 | | lwz TMP2, -16(RA) | ||
| 2524 | | lwz TMP3, -8(RA) | ||
| 2525 | | evmergehi TMP0, CFUNC:TMP1, CFUNC:TMP1 | ||
| 2526 | | cmpwi cr0, TMP2, LJ_TTAB | ||
| 2527 | | cmpwi cr1, TMP0, LJ_TFUNC | ||
| 2528 | | cmpwi cr6, TMP3, LJ_TNIL | ||
| 2529 | | bne cr1, >5 | ||
| 2530 | | lbz TMP1, CFUNC:TMP1->ffid | ||
| 2531 | | crand 4*cr0+eq, 4*cr0+eq, 4*cr6+eq | ||
| 2532 | | cmpwi cr7, TMP1, FF_next_N | ||
| 2533 | | srwi TMP0, RD, 1 | ||
| 2534 | | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq | ||
| 2535 | | add TMP3, PC, TMP0 | ||
| 2536 | | bne cr0, >5 | ||
| 2537 | | stw ZERO, -4(RA) // Initialize control var. | ||
| 2538 | | addis PC, TMP3, -(BCBIAS_J*4 >> 16) | ||
| 2539 | |1: | ||
| 2540 | | ins_next | ||
| 2541 | |5: // Despecialize bytecode if any of the checks fail. | ||
| 2542 | | li TMP0, BC_JMP | ||
| 2543 | | li TMP1, BC_ITERC | ||
| 2544 | | stb TMP0, -1(PC) | ||
| 2545 | | addis PC, TMP3, -(BCBIAS_J*4 >> 16) | ||
| 2546 | | stb TMP1, 3(PC) | ||
| 2547 | | b <1 | ||
| 2459 | break; | 2548 | break; |
| 2460 | 2549 | ||
| 2461 | case BC_VARG: | 2550 | case BC_VARG: |
