diff options
-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 |