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 /src | |
parent | 4afff973a414a0d596d9a65c1c207e705dc5176e (diff) | |
download | luajit-c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae.tar.gz luajit-c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae.tar.bz2 luajit-c0a8f5fb32825dc2ac4d19dd6c66108c55e3c8ae.zip |
PPC: Add dispatch to fast function fallback handlers.
Diffstat (limited to 'src')
-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 |