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: |