diff options
author | Mike Pall <mike> | 2010-10-07 02:16:44 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-10-07 02:16:44 +0200 |
commit | 9d201c972ad53d8c600e3fd51e7e6d8ef74ea69e (patch) | |
tree | 29d7f927432403b6196a4f3e11a9a52d81f0d26d /src | |
parent | 9f14e03d6e17ea2ad6185666987e590658fb1ce4 (diff) | |
download | luajit-9d201c972ad53d8c600e3fd51e7e6d8ef74ea69e.tar.gz luajit-9d201c972ad53d8c600e3fd51e7e6d8ef74ea69e.tar.bz2 luajit-9d201c972ad53d8c600e3fd51e7e6d8ef74ea69e.zip |
PPC: Add coroutine.resume/wrap_aux/yield() fast functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 124 |
1 files changed, 122 insertions, 2 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index b393b75c..a4f5bd88 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -1192,17 +1192,137 @@ static void build_subroutines(BuildCtx *ctx) | |||
1192 | |.macro coroutine_resume_wrap, resume | 1192 | |.macro coroutine_resume_wrap, resume |
1193 | |.if resume | 1193 | |.if resume |
1194 | |.ffunc_1 coroutine_resume | 1194 | |.ffunc_1 coroutine_resume |
1195 | | evmergehi TMP0, L:CARG1, L:CARG1 | ||
1195 | |.else | 1196 | |.else |
1196 | |.ffunc coroutine_wrap_aux | 1197 | |.ffunc coroutine_wrap_aux |
1198 | | lwz L:CARG1, CFUNC:RB->upvalue[0].gcr | ||
1197 | |.endif | 1199 | |.endif |
1198 | | NYI | 1200 | |.if resume |
1201 | | cmpwi TMP0, LJ_TTHREAD | ||
1202 | | bne ->fff_fallback | ||
1203 | |.endif | ||
1204 | | lbz TMP0, L:CARG1->status | ||
1205 | | lwz TMP1, L:CARG1->cframe | ||
1206 | | lwz CARG2, L:CARG1->top | ||
1207 | | cmplwi cr0, TMP0, LUA_YIELD | ||
1208 | | lwz TMP2, L:CARG1->base | ||
1209 | | cmplwi cr1, TMP1, 0 | ||
1210 | | lwz TMP0, L:CARG1->maxstack | ||
1211 | | cmplw cr7, CARG2, TMP2 | ||
1212 | | lwz PC, FRAME_PC(BASE) | ||
1213 | | crorc 4*cr6+lt, 4*cr0+gt, 4*cr1+eq // st>LUA_YIELD || cframe!=0 | ||
1214 | | add TMP2, CARG2, NARGS8:RC | ||
1215 | | crandc 4*cr6+gt, 4*cr7+eq, 4*cr0+eq // base==top && st!=LUA_YIELD | ||
1216 | | cmplw cr1, TMP2, TMP0 | ||
1217 | | cror 4*cr6+lt, 4*cr6+lt, 4*cr6+gt | ||
1218 | | stw PC, SAVE_PC | ||
1219 | | cror 4*cr6+lt, 4*cr6+lt, 4*cr1+gt // cond1 || cond2 || stackov | ||
1220 | | stw BASE, L->base | ||
1221 | | blt cr6, ->fff_fallback | ||
1222 | |1: | ||
1223 | |.if resume | ||
1224 | | addi BASE, BASE, 8 // Keep resumed thread in stack for GC. | ||
1225 | | subi NARGS8:RC, NARGS8:RC, 8 | ||
1226 | | subi TMP2, TMP2, 8 | ||
1227 | |.endif | ||
1228 | | stw TMP2, L:CARG1->top | ||
1229 | | li TMP1, 0 | ||
1230 | | stw BASE, L->top | ||
1231 | |2: // Move args to coroutine. | ||
1232 | | cmpw TMP1, NARGS8:RC | ||
1233 | | evlddx TMP0, BASE, TMP1 | ||
1234 | | beq >3 | ||
1235 | | evstddx TMP0, CARG2, TMP1 | ||
1236 | | addi TMP1, TMP1, 8 | ||
1237 | | b <2 | ||
1238 | |3: | ||
1239 | | li CARG3, 0 | ||
1240 | | mr L:SAVE0, L:CARG1 | ||
1241 | | li CARG4, 0 | ||
1242 | | bl ->vm_resume // (lua_State *L, TValue *base, 0, 0) | ||
1243 | | // Returns thread status. | ||
1244 | |4: | ||
1245 | | lwz TMP2, L:SAVE0->base | ||
1246 | | cmplwi CRET1, LUA_YIELD | ||
1247 | | lwz TMP3, L:SAVE0->top | ||
1248 | | li_vmstate INTERP | ||
1249 | | lwz BASE, L->base | ||
1250 | | st_vmstate | ||
1251 | | bgt >8 | ||
1252 | | sub RD, TMP3, TMP2 | ||
1253 | | lwz TMP0, L->maxstack | ||
1254 | | cmplwi RD, 0 | ||
1255 | | add TMP1, BASE, RD | ||
1256 | | beq >6 // No results? | ||
1257 | | cmplw TMP1, TMP0 | ||
1258 | | li TMP1, 0 | ||
1259 | | bgt >9 // Need to grow stack? | ||
1260 | | | ||
1261 | | subi TMP3, RD, 8 | ||
1262 | | stw TMP2, L:SAVE0->top // Clear coroutine stack. | ||
1263 | |5: // Move results from coroutine. | ||
1264 | | cmplw TMP1, TMP3 | ||
1265 | | evlddx TMP0, TMP2, TMP1 | ||
1266 | | evstddx TMP0, BASE, TMP1 | ||
1267 | | addi TMP1, TMP1, 8 | ||
1268 | | bne <5 | ||
1269 | |6: | ||
1270 | | andi. TMP0, PC, FRAME_TYPE | ||
1271 | |.if resume | ||
1272 | | li TMP1, LJ_TTRUE | ||
1273 | | la RA, -8(BASE) | ||
1274 | | stw TMP1, -8(BASE) // Prepend true to results. | ||
1275 | | addi RD, RD, 16 | ||
1276 | |.else | ||
1277 | | mr RA, BASE | ||
1278 | | addi RD, RD, 8 | ||
1279 | |.endif | ||
1280 | |7: | ||
1281 | | stw PC, SAVE_PC | ||
1282 | | mr MULTRES, RD | ||
1283 | | beq ->BC_RET_Z | ||
1284 | | b ->vm_return | ||
1285 | | | ||
1286 | |8: // Coroutine returned with error (at co->top-1). | ||
1287 | |.if resume | ||
1288 | | andi. TMP0, PC, FRAME_TYPE | ||
1289 | | la TMP3, -8(TMP3) | ||
1290 | | li TMP1, LJ_TFALSE | ||
1291 | | evldd TMP0, 0(TMP3) | ||
1292 | | stw TMP3, L:SAVE0->top // Remove error from coroutine stack. | ||
1293 | | li RD, (2+1)*8 | ||
1294 | | stw TMP1, -8(BASE) // Prepend false to results. | ||
1295 | | la RA, -8(BASE) | ||
1296 | | evstdd TMP0, 0(BASE) // Copy error message. | ||
1297 | | b <7 | ||
1298 | |.else | ||
1299 | | mr CARG1, L | ||
1300 | | mr CARG2, L:SAVE0 | ||
1301 | | bl extern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co) | ||
1302 | |.endif | ||
1303 | | | ||
1304 | |9: // Handle stack expansion on return from yield. | ||
1305 | | mr CARG1, L | ||
1306 | | srwi CARG2, RD, 3 | ||
1307 | | bl extern lj_state_growstack // (lua_State *L, int n) | ||
1308 | | li CRET1, 0 | ||
1309 | | b <4 | ||
1199 | |.endmacro | 1310 | |.endmacro |
1200 | | | 1311 | | |
1201 | | coroutine_resume_wrap 1 // coroutine.resume | 1312 | | coroutine_resume_wrap 1 // coroutine.resume |
1202 | | coroutine_resume_wrap 0 // coroutine.wrap | 1313 | | coroutine_resume_wrap 0 // coroutine.wrap |
1203 | | | 1314 | | |
1204 | |.ffunc coroutine_yield | 1315 | |.ffunc coroutine_yield |
1205 | | NYI | 1316 | | lwz TMP0, L->cframe |
1317 | | add TMP1, BASE, NARGS8:RC | ||
1318 | | stw BASE, L->base | ||
1319 | | andi. TMP0, TMP0, CFRAME_RESUME | ||
1320 | | stw TMP1, L->top | ||
1321 | | li CRET1, LUA_YIELD | ||
1322 | | beq ->fff_fallback | ||
1323 | | stw ZERO, L->cframe | ||
1324 | | stb CRET1, L->status | ||
1325 | | b ->vm_leave_unw | ||
1206 | | | 1326 | | |
1207 | |//-- Math library ------------------------------------------------------- | 1327 | |//-- Math library ------------------------------------------------------- |
1208 | | | 1328 | | |