aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-17 16:01:02 +0200
committerMike Pall <mike>2010-09-17 16:01:02 +0200
commit9dc98280d228d8c127cc9abf04f7836ea8fffe71 (patch)
tree21689ccce7394981ff92f6f010778e5a43942f35
parent66f0c437801ae0560b576c888df7c1e2f31c955e (diff)
downloadluajit-9dc98280d228d8c127cc9abf04f7836ea8fffe71.tar.gz
luajit-9dc98280d228d8c127cc9abf04f7836ea8fffe71.tar.bz2
luajit-9dc98280d228d8c127cc9abf04f7836ea8fffe71.zip
PPC: Reschedule bytecode instruction fetch.
-rw-r--r--src/buildvm_ppc.dasc101
1 files changed, 66 insertions, 35 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 381161a9..a6ea6293 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -159,31 +159,45 @@
159|.macro decode_OP1, dst, ins; rlwinm dst, ins, 0, 24, 31; .endmacro 159|.macro decode_OP1, dst, ins; rlwinm dst, ins, 0, 24, 31; .endmacro
160|.macro decode_RD4, dst, ins; rlwinm dst, ins, 18, 14, 29; .endmacro 160|.macro decode_RD4, dst, ins; rlwinm dst, ins, 18, 14, 29; .endmacro
161| 161|
162|// Instruction decode+dispatch. 162|// Instruction fetch.
163|.macro ins_NEXT 163|.macro ins_NEXT1
164| lwz INS, 0(PC) 164| lwz INS, 0(PC)
165| addi PC, PC, 4 165| addi PC, PC, 4
166| decode_OP4 TMP0, INS 166|.endmacro
167|// Instruction decode+dispatch.
168|.macro ins_NEXT2
169| decode_OP4 TMP1, INS
167| decode_RB8 RB, INS 170| decode_RB8 RB, INS
168| lwzx TMP0, DISPATCH, TMP0
169| decode_RD8 RD, INS 171| decode_RD8 RD, INS
172| lwzx TMP0, DISPATCH, TMP1
173| decode_RA8 RA, INS
170| decode_RC8 RC, INS 174| decode_RC8 RC, INS
171| mtctr TMP0 175| mtctr TMP0
172| decode_RA8 RA, INS
173| bctr 176| bctr
174|.endmacro 177|.endmacro
178|.macro ins_NEXT
179| ins_NEXT1
180| ins_NEXT2
181|.endmacro
175| 182|
176|// Instruction footer. 183|// Instruction footer.
177|.if 1 184|.if 1
178| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use. 185| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use.
179| .define ins_next, ins_NEXT 186| .define ins_next, ins_NEXT
180| .define ins_next_, ins_NEXT 187| .define ins_next_, ins_NEXT
188| .define ins_next1, ins_NEXT1
189| .define ins_next2, ins_NEXT2
181|.else 190|.else
182| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch. 191| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch.
183| // Affects only certain kinds of benchmarks (and only with -j off). 192| // Affects only certain kinds of benchmarks (and only with -j off).
184| .macro ins_next 193| .macro ins_next
185| b ->ins_next 194| b ->ins_next
186| .endmacro 195| .endmacro
196| .macro ins_next1
197| .endmacro
198| .macro ins_next2
199| b ->ins_next
200| .endmacro
187| .macro ins_next_ 201| .macro ins_next_
188| ->ins_next: 202| ->ins_next:
189| ins_NEXT 203| ins_NEXT
@@ -196,9 +210,9 @@
196| lwz PC, LFUNC:RB->pc 210| lwz PC, LFUNC:RB->pc
197| lwz INS, 0(PC) 211| lwz INS, 0(PC)
198| addi PC, PC, 4 212| addi PC, PC, 4
199| decode_OP4 TMP0, INS 213| decode_OP4 TMP1, INS
200| decode_RA8 RA, INS 214| decode_RA8 RA, INS
201| lwzx TMP0, DISPATCH, TMP0 215| lwzx TMP0, DISPATCH, TMP1
202| add RA, RA, BASE 216| add RA, RA, BASE
203| mtctr TMP0 217| mtctr TMP0
204| bctr 218| bctr
@@ -1404,17 +1418,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1404 1418
1405 case BC_MOV: 1419 case BC_MOV:
1406 | // RA = dst*8, RD = src*8 1420 | // RA = dst*8, RD = src*8
1421 | ins_next1
1407 | evlddx TMP0, BASE, RD 1422 | evlddx TMP0, BASE, RD
1408 | evstddx TMP0, BASE, RA 1423 | evstddx TMP0, BASE, RA
1409 | ins_next_ 1424 | ins_next2
1410 break; 1425 break;
1411 case BC_NOT: 1426 case BC_NOT:
1412 | // RA = dst*8, RD = src*8 1427 | // RA = dst*8, RD = src*8
1428 | ins_next1
1413 | lwzx TMP0, BASE, RD 1429 | lwzx TMP0, BASE, RD
1414 | subfic TMP1, TMP0, LJ_TTRUE 1430 | subfic TMP1, TMP0, LJ_TTRUE
1415 | adde TMP0, TMP0, TMP1 1431 | adde TMP0, TMP0, TMP1
1416 | stwx TMP0, BASE, RA 1432 | stwx TMP0, BASE, RA
1417 | ins_next 1433 | ins_next2
1418 break; 1434 break;
1419 case BC_UNM: 1435 case BC_UNM:
1420 | // RA = dst*8, RD = src*8 1436 | // RA = dst*8, RD = src*8
@@ -1425,8 +1441,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1425 | evmergelo TMP1, TMP1, TMP2 1441 | evmergelo TMP1, TMP1, TMP2
1426 | checkfail ->vmeta_unm 1442 | checkfail ->vmeta_unm
1427 | evxor TMP0, TMP0, TMP1 1443 | evxor TMP0, TMP0, TMP1
1444 | ins_next1
1428 | evstddx TMP0, BASE, RA 1445 | evstddx TMP0, BASE, RA
1429 | ins_next 1446 | ins_next2
1430 break; 1447 break;
1431 case BC_LEN: 1448 case BC_LEN:
1432 | // RA = dst*8, RD = src*8 1449 | // RA = dst*8, RD = src*8
@@ -1435,9 +1452,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1435 | checkfail >2 1452 | checkfail >2
1436 | lwz CRET1, STR:CARG1->len 1453 | lwz CRET1, STR:CARG1->len
1437 |1: 1454 |1:
1455 | ins_next1
1438 | efdcfsi TMP0, CRET1 1456 | efdcfsi TMP0, CRET1
1439 | evstddx TMP0, BASE, RA 1457 | evstddx TMP0, BASE, RA
1440 | ins_next 1458 | ins_next2
1441 |2: 1459 |2:
1442 | checktab CARG1 1460 | checktab CARG1
1443 | checkfail ->vmeta_len 1461 | checkfail ->vmeta_len
@@ -1476,9 +1494,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1476 | 1494 |
1477 |.macro ins_arith, ins 1495 |.macro ins_arith, ins
1478 | ins_arithpre TMP0, TMP1 1496 | ins_arithpre TMP0, TMP1
1497 | ins_next1
1479 | ins TMP0, TMP0, TMP1 1498 | ins TMP0, TMP0, TMP1
1480 | evstddx TMP0, BASE, RA 1499 | evstddx TMP0, BASE, RA
1481 | ins_next 1500 | ins_next2
1482 |.endmacro 1501 |.endmacro
1483 1502
1484 case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: 1503 case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
@@ -1499,9 +1518,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1499 | efddiv CARG2, RD, SAVE0 1518 | efddiv CARG2, RD, SAVE0
1500 | bl ->vm_floor // floor(b/c) 1519 | bl ->vm_floor // floor(b/c)
1501 | efdmul TMP0, CRET2, SAVE0 1520 | efdmul TMP0, CRET2, SAVE0
1521 | ins_next1
1502 | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c 1522 | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c
1503 | evstddx TMP0, BASE, RA 1523 | evstddx TMP0, BASE, RA
1504 | ins_next 1524 | ins_next2
1505 break; 1525 break;
1506 case BC_MODNV: case BC_MODVV: 1526 case BC_MODNV: case BC_MODVV:
1507 | ins_arithpre RD, SAVE0 1527 | ins_arithpre RD, SAVE0
@@ -1544,33 +1564,37 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1544 1564
1545 case BC_KSTR: 1565 case BC_KSTR:
1546 | // RA = dst*8, RD = str_const*8 (~) 1566 | // RA = dst*8, RD = str_const*8 (~)
1567 | ins_next1
1547 | srwi TMP1, RD, 1 1568 | srwi TMP1, RD, 1
1548 | subfic TMP1, TMP1, -4 1569 | subfic TMP1, TMP1, -4
1549 | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4 1570 | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4
1550 | evmergelo TMP0, TISSTR, TMP0 1571 | evmergelo TMP0, TISSTR, TMP0
1551 | evstddx TMP0, BASE, RA 1572 | evstddx TMP0, BASE, RA
1552 | ins_next 1573 | ins_next2
1553 break; 1574 break;
1554 case BC_KSHORT: 1575 case BC_KSHORT:
1555 | // RA = dst*8, RD = int16_literal*8 1576 | // RA = dst*8, RD = int16_literal*8
1556 | srwi TMP1, RD, 3 1577 | srwi TMP1, RD, 3
1557 | extsh TMP1, TMP1 1578 | extsh TMP1, TMP1
1579 | ins_next1
1558 | efdcfsi TMP0, TMP1 1580 | efdcfsi TMP0, TMP1
1559 | evstddx TMP0, BASE, RA 1581 | evstddx TMP0, BASE, RA
1560 | ins_next 1582 | ins_next2
1561 break; 1583 break;
1562 case BC_KNUM: 1584 case BC_KNUM:
1563 | // RA = dst*8, RD = num_const*8 1585 | // RA = dst*8, RD = num_const*8
1564 | evlddx TMP0, KBASE, RD 1586 | evlddx TMP0, KBASE, RD
1587 | ins_next1
1565 | evstddx TMP0, BASE, RA 1588 | evstddx TMP0, BASE, RA
1566 | ins_next 1589 | ins_next2
1567 break; 1590 break;
1568 case BC_KPRI: 1591 case BC_KPRI:
1569 | // RA = dst*8, RD = primitive_type*8 (~) 1592 | // RA = dst*8, RD = primitive_type*8 (~)
1570 | srwi TMP1, RD, 3 1593 | srwi TMP1, RD, 3
1571 | not TMP0, TMP1 1594 | not TMP0, TMP1
1595 | ins_next1
1572 | stwx TMP0, BASE, RA 1596 | stwx TMP0, BASE, RA
1573 | ins_next 1597 | ins_next2
1574 break; 1598 break;
1575 case BC_KNIL: 1599 case BC_KNIL:
1576 | // RA = base*8, RD = end*8 1600 | // RA = base*8, RD = end*8
@@ -1581,13 +1605,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1581 | cmpw RA, RD 1605 | cmpw RA, RD
1582 | addi RA, RA, 8 1606 | addi RA, RA, 8
1583 | blt <1 1607 | blt <1
1584 | ins_next 1608 | ins_next_
1585 break; 1609 break;
1586 1610
1587 /* -- Upvalue and function ops ------------------------------------------ */ 1611 /* -- Upvalue and function ops ------------------------------------------ */
1588 1612
1589 case BC_UGET: 1613 case BC_UGET:
1590 | // RA = dst*8, RD = uvnum*8 1614 | // RA = dst*8, RD = uvnum*8
1615 | ins_next1
1591 | lwz LFUNC:RB, FRAME_FUNC(BASE) 1616 | lwz LFUNC:RB, FRAME_FUNC(BASE)
1592 | srwi RD, RD, 1 1617 | srwi RD, RD, 1
1593 | addi RD, RD, offsetof(GCfuncL, uvptr) 1618 | addi RD, RD, offsetof(GCfuncL, uvptr)
@@ -1595,7 +1620,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1595 | lwz TMP1, UPVAL:RB->v 1620 | lwz TMP1, UPVAL:RB->v
1596 | evldd TMP0, 0(TMP1) 1621 | evldd TMP0, 0(TMP1)
1597 | evstddx TMP0, BASE, RA 1622 | evstddx TMP0, BASE, RA
1598 | ins_next 1623 | ins_next2
1599 break; 1624 break;
1600 case BC_USETV: 1625 case BC_USETV:
1601 | // RA = uvnum*8, RD = src*8 1626 | // RA = uvnum*8, RD = src*8
@@ -1630,6 +1655,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1630 break; 1655 break;
1631 case BC_USETS: 1656 case BC_USETS:
1632 | // RA = uvnum*8, RD = str_const*8 (~) 1657 | // RA = uvnum*8, RD = str_const*8 (~)
1658 | ins_next1
1633 | lwz LFUNC:RB, FRAME_FUNC(BASE) 1659 | lwz LFUNC:RB, FRAME_FUNC(BASE)
1634 | srwi TMP1, RD, 1 1660 | srwi TMP1, RD, 1
1635 | srwi RA, RA, 1 1661 | srwi RA, RA, 1
@@ -1646,7 +1672,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1646 | evstdd STR:TMP1, 0(CARG2) 1672 | evstdd STR:TMP1, 0(CARG2)
1647 | bne >2 1673 | bne >2
1648 |1: 1674 |1:
1649 | ins_next 1675 | ins_next2
1650 | 1676 |
1651 |2: // Check if string is white and ensure upvalue is closed. 1677 |2: // Check if string is white and ensure upvalue is closed.
1652 | andi. TMP3, TMP3, LJ_GC_WHITES // iswhite(str) 1678 | andi. TMP3, TMP3, LJ_GC_WHITES // iswhite(str)
@@ -1660,6 +1686,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1660 break; 1686 break;
1661 case BC_USETN: 1687 case BC_USETN:
1662 | // RA = uvnum*8, RD = num_const*8 1688 | // RA = uvnum*8, RD = num_const*8
1689 | ins_next1
1663 | lwz LFUNC:RB, FRAME_FUNC(BASE) 1690 | lwz LFUNC:RB, FRAME_FUNC(BASE)
1664 | srwi RA, RA, 1 1691 | srwi RA, RA, 1
1665 | addi RA, RA, offsetof(GCfuncL, uvptr) 1692 | addi RA, RA, offsetof(GCfuncL, uvptr)
@@ -1667,10 +1694,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1667 | lwzx UPVAL:RB, LFUNC:RB, RA 1694 | lwzx UPVAL:RB, LFUNC:RB, RA
1668 | lwz TMP1, UPVAL:RB->v 1695 | lwz TMP1, UPVAL:RB->v
1669 | evstdd TMP0, 0(TMP1) 1696 | evstdd TMP0, 0(TMP1)
1670 | ins_next 1697 | ins_next2
1671 break; 1698 break;
1672 case BC_USETP: 1699 case BC_USETP:
1673 | // RA = uvnum*8, RD = primitive_type*8 (~) 1700 | // RA = uvnum*8, RD = primitive_type*8 (~)
1701 | ins_next1
1674 | lwz LFUNC:RB, FRAME_FUNC(BASE) 1702 | lwz LFUNC:RB, FRAME_FUNC(BASE)
1675 | srwi RA, RA, 1 1703 | srwi RA, RA, 1
1676 | addi RA, RA, offsetof(GCfuncL, uvptr) 1704 | addi RA, RA, offsetof(GCfuncL, uvptr)
@@ -1679,7 +1707,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1679 | not TMP0, TMP0 1707 | not TMP0, TMP0
1680 | lwz TMP1, UPVAL:RB->v 1708 | lwz TMP1, UPVAL:RB->v
1681 | stw TMP0, 0(TMP1) 1709 | stw TMP0, 0(TMP1)
1682 | ins_next 1710 | ins_next2
1683 break; 1711 break;
1684 1712
1685 case BC_UCLO: 1713 case BC_UCLO:
@@ -1870,8 +1898,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1870 | checknil TMP1 1898 | checknil TMP1
1871 | checkok >5 1899 | checkok >5
1872 |1: 1900 |1:
1901 | ins_next1
1873 | evstddx TMP1, BASE, RA 1902 | evstddx TMP1, BASE, RA
1874 | ins_next 1903 | ins_next2
1875 | 1904 |
1876 |5: // Check for __index if table value is nil. 1905 |5: // Check for __index if table value is nil.
1877 | lwz TAB:TMP2, TAB:RB->metatable 1906 | lwz TAB:TMP2, TAB:RB->metatable
@@ -2289,9 +2318,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2289 | bgt >6 2318 | bgt >6
2290 | sub BASE, TMP2, RA 2319 | sub BASE, TMP2, RA
2291 | lwz LFUNC:TMP1, FRAME_FUNC(BASE) 2320 | lwz LFUNC:TMP1, FRAME_FUNC(BASE)
2321 | ins_next1
2292 | lwz TMP1, LFUNC:TMP1->pc 2322 | lwz TMP1, LFUNC:TMP1->pc
2293 | lwz KBASE, PC2PROTO(k)(TMP1) 2323 | lwz KBASE, PC2PROTO(k)(TMP1)
2294 | ins_next 2324 | ins_next2
2295 | 2325 |
2296 |6: // Fill up results with nil. 2326 |6: // Fill up results with nil.
2297 | subi TMP1, RD, 8 2327 | subi TMP1, RD, 8
@@ -2330,9 +2360,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2330 | bgt >6 2360 | bgt >6
2331 | sub BASE, TMP2, RA 2361 | sub BASE, TMP2, RA
2332 | lwz LFUNC:TMP1, FRAME_FUNC(BASE) 2362 | lwz LFUNC:TMP1, FRAME_FUNC(BASE)
2363 | ins_next1
2333 | lwz TMP1, LFUNC:TMP1->pc 2364 | lwz TMP1, LFUNC:TMP1->pc
2334 | lwz KBASE, PC2PROTO(k)(TMP1) 2365 | lwz KBASE, PC2PROTO(k)(TMP1)
2335 | ins_next 2366 | ins_next2
2336 | 2367 |
2337 |6: // Fill up results with nil. 2368 |6: // Fill up results with nil.
2338 | subi TMP1, RD, 8 2369 | subi TMP1, RD, 8
@@ -2361,20 +2392,18 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2361 vk = (op == BC_IFORL || op == BC_JFORL); 2392 vk = (op == BC_IFORL || op == BC_JFORL);
2362 | add RA, BASE, RA 2393 | add RA, BASE, RA
2363 | evldd TMP1, FORL_IDX*8(RA) 2394 | evldd TMP1, FORL_IDX*8(RA)
2364 | evldd TMP2, FORL_STOP*8(RA)
2365 | evldd TMP3, FORL_STEP*8(RA) 2395 | evldd TMP3, FORL_STEP*8(RA)
2396 | evldd TMP2, FORL_STOP*8(RA)
2366 if (!vk) { 2397 if (!vk) {
2367 | evcmpgtu cr0, TMP1, TISNUM 2398 | evcmpgtu cr0, TMP1, TISNUM
2368 | evcmpgtu cr1, TMP2, TISNUM
2369 | evcmpgtu cr7, TMP3, TISNUM 2399 | evcmpgtu cr7, TMP3, TISNUM
2370 | cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt 2400 | evcmpgtu cr1, TMP2, TISNUM
2371 | cror 4*cr0+lt, 4*cr0+lt, 4*cr7+lt 2401 | cror 4*cr0+lt, 4*cr0+lt, 4*cr7+lt
2402 | cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt
2372 | blt ->vmeta_for 2403 | blt ->vmeta_for
2373 } 2404 }
2374 if (vk) { 2405 if (vk) {
2375 | efdadd TMP1, TMP1, TMP3 2406 | efdadd TMP1, TMP1, TMP3
2376 }
2377 if (vk) {
2378 | evstdd TMP1, FORL_IDX*8(RA) 2407 | evstdd TMP1, FORL_IDX*8(RA)
2379 } 2408 }
2380 | evcmpgts TMP3, TISNIL 2409 | evcmpgts TMP3, TISNIL
@@ -2480,13 +2509,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2480 | cmplw RA, TMP2 2509 | cmplw RA, TMP2
2481 | slwi TMP1, TMP1, 3 2510 | slwi TMP1, TMP1, 3
2482 | bgt ->vm_growstack_l 2511 | bgt ->vm_growstack_l
2512 | ins_next1
2483 |2: 2513 |2:
2484 | cmplw NARGS8:RC, TMP1 // Check for missing parameters. 2514 | cmplw NARGS8:RC, TMP1 // Check for missing parameters.
2485 | ble >3 2515 | ble >3
2486 if (op == BC_JFUNCF) { 2516 if (op == BC_JFUNCF) {
2487 | NYI 2517 | NYI
2488 } else { 2518 } else {
2489 | ins_next 2519 | ins_next2
2490 } 2520 }
2491 | 2521 |
2492 |3: // Clear missing parameters. 2522 |3: // Clear missing parameters.
@@ -2516,6 +2546,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2516 | lbz TMP2, -4+PC2PROTO(numparams)(PC) 2546 | lbz TMP2, -4+PC2PROTO(numparams)(PC)
2517 | mr RA, BASE 2547 | mr RA, BASE
2518 | mr RC, TMP1 2548 | mr RC, TMP1
2549 | ins_next1
2519 | cmpwi TMP2, 0 2550 | cmpwi TMP2, 0
2520 | addi BASE, TMP1, 8 2551 | addi BASE, TMP1, 8
2521 | beq >3 2552 | beq >3
@@ -2531,7 +2562,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2531 | addi TMP1, TMP1, 8 2562 | addi TMP1, TMP1, 8
2532 | bne <1 2563 | bne <1
2533 |3: 2564 |3:
2534 | ins_next 2565 | ins_next2
2535 | 2566 |
2536 |4: // Clear missing parameters. 2567 |4: // Clear missing parameters.
2537 | evmr TMP0, TISNIL 2568 | evmr TMP0, TISNIL
@@ -2542,18 +2573,18 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2542 case BC_FUNCCW: 2573 case BC_FUNCCW:
2543 | // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8 2574 | // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8
2544 if (op == BC_FUNCC) { 2575 if (op == BC_FUNCC) {
2545 | lwz TMP0, CFUNC:RB->f 2576 | lwz TMP3, CFUNC:RB->f
2546 } else { 2577 } else {
2547 | lwz TMP0, DISPATCH_GL(wrapf)(DISPATCH) 2578 | lwz TMP3, DISPATCH_GL(wrapf)(DISPATCH)
2548 } 2579 }
2549 | add TMP1, RA, NARGS8:RC 2580 | add TMP1, RA, NARGS8:RC
2550 | lwz TMP2, L->maxstack 2581 | lwz TMP2, L->maxstack
2551 | add RC, BASE, NARGS8:RC 2582 | add RC, BASE, NARGS8:RC
2552 | stw BASE, L->base 2583 | stw BASE, L->base
2553 | mtctr TMP0
2554 | cmplw TMP1, TMP2 2584 | cmplw TMP1, TMP2
2555 | stw RC, L->top 2585 | stw RC, L->top
2556 | li_vmstate C 2586 | li_vmstate C
2587 | mtctr TMP3
2557 if (op == BC_FUNCCW) { 2588 if (op == BC_FUNCCW) {
2558 | lwz CARG2, CFUNC:RB->f 2589 | lwz CARG2, CFUNC:RB->f
2559 } 2590 }