aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-01 01:44:02 +0200
committerMike Pall <mike>2010-10-01 01:44:02 +0200
commitdcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f (patch)
tree3599e7c0f92b0d0661404ea7ffe1afeff3c385c2
parentac76493df113e6e648b03e61c0fa56c5754e832d (diff)
downloadluajit-dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f.tar.gz
luajit-dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f.tar.bz2
luajit-dcf006bfa2c5e65f5c1dd57166f3b27f1e8ec34f.zip
PPC: Add BC_ITERN and BC_ISNEXT.
-rw-r--r--src/buildvm_ppc.dasc93
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: