diff options
| author | Mike Pall <mike> | 2010-09-30 02:58:29 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-09-30 02:58:29 +0200 |
| commit | c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae (patch) | |
| tree | 0dfe26ab473f522bb6fc74a3dafd55adb6b996da | |
| parent | 4afff973a414a0d596d9a65c1c207e705dc5176e (diff) | |
| download | luajit-c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae.tar.gz luajit-c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae.tar.bz2 luajit-c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae.zip | |
PPC: Add dispatch to fast function fallback handlers.
| -rw-r--r-- | src/buildvm_ppc.dasc | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 5c418797..6ab8f7f7 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
| @@ -1169,7 +1169,50 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1169 | |//----------------------------------------------------------------------- | 1169 | |//----------------------------------------------------------------------- |
| 1170 | | | 1170 | | |
| 1171 | |->fff_fallback: // Call fast function fallback handler. | 1171 | |->fff_fallback: // Call fast function fallback handler. |
| 1172 | | NYI | 1172 | | // BASE = new base, RB = CFUNC, RC = nargs*8 |
| 1173 | | lwz TMP3, CFUNC:RB->f | ||
| 1174 | | add TMP1, BASE, NARGS8:RC | ||
| 1175 | | lwz PC, FRAME_PC(BASE) // Fallback may overwrite PC. | ||
| 1176 | | addi TMP0, TMP1, 8*LUA_MINSTACK-8 | ||
| 1177 | | lwz TMP2, L->maxstack | ||
| 1178 | | stw PC, SAVE_PC // Redundant (but a defined value). | ||
| 1179 | | cmplw TMP0, TMP2 | ||
| 1180 | | stw BASE, L->base | ||
| 1181 | | stw TMP1, L->top | ||
| 1182 | | mr CARG1, L | ||
| 1183 | | bgt >5 // Need to grow stack. | ||
| 1184 | | mtctr TMP3 | ||
| 1185 | | bctrl // (lua_State *L) | ||
| 1186 | | // Either throws an error, or recovers and returns -1, 0 or nresults+1. | ||
| 1187 | | lwz BASE, L->base | ||
| 1188 | | cmpwi CRET1, 0 | ||
| 1189 | | slwi RD, CRET1, 3 | ||
| 1190 | | la RA, -8(BASE) | ||
| 1191 | | bgt ->fff_res // Returned nresults+1? | ||
| 1192 | |1: // Returned 0: retry fast path. | ||
| 1193 | | lwz TMP0, L->top | ||
| 1194 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
| 1195 | | sub NARGS8:RC, TMP0, BASE | ||
| 1196 | | bne >2 // Returned -1? | ||
| 1197 | | ins_callt // Returned 0: retry fast path. | ||
| 1198 | | | ||
| 1199 | |2: // Reconstruct previous base for vmeta_call during tailcall. | ||
| 1200 | | andi. TMP0, PC, FRAME_TYPE | ||
| 1201 | | rlwinm TMP1, PC, 0, 0, 28 | ||
| 1202 | | bne >3 | ||
| 1203 | | lwz INS, -4(PC) | ||
| 1204 | | decode_RA8 TMP1, INS | ||
| 1205 | |3: | ||
| 1206 | | sub TMP2, BASE, TMP1 | ||
| 1207 | | b ->vm_call_dispatch // Resolve again for tailcall. | ||
| 1208 | | | ||
| 1209 | |5: // Grow stack for fallback handler. | ||
| 1210 | | mr CARG1, L | ||
| 1211 | | li CARG2, LUA_MINSTACK | ||
| 1212 | | bl extern lj_state_growstack // (lua_State *L, int n) | ||
| 1213 | | lwz BASE, L->base | ||
| 1214 | | cmpw TMP0, TMP0 // Set 4*cr0+eq. | ||
| 1215 | | b <1 | ||
| 1173 | | | 1216 | | |
| 1174 | |->fff_gcstep: // Call GC step function. | 1217 | |->fff_gcstep: // Call GC step function. |
| 1175 | | NYI | 1218 | | NYI |
