aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-07 02:16:44 +0200
committerMike Pall <mike>2010-10-07 02:16:44 +0200
commit9d201c972ad53d8c600e3fd51e7e6d8ef74ea69e (patch)
tree29d7f927432403b6196a4f3e11a9a52d81f0d26d /src
parent9f14e03d6e17ea2ad6185666987e590658fb1ce4 (diff)
downloadluajit-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.dasc124
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 |