diff options
| author | Mike Pall <mike> | 2010-09-09 01:08:07 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-09-09 01:08:07 +0200 |
| commit | 9fd10963b9b932c70a5e11cd32c8cfe3648c2ed3 (patch) | |
| tree | 763b3a01e46c3b6c8822de155a6812a5aeff1674 /src | |
| parent | ec8f2918ba594fdf6f13f9f01bf1721b8c3658a8 (diff) | |
| download | luajit-9fd10963b9b932c70a5e11cd32c8cfe3648c2ed3.tar.gz luajit-9fd10963b9b932c70a5e11cd32c8cfe3648c2ed3.tar.bz2 luajit-9fd10963b9b932c70a5e11cd32c8cfe3648c2ed3.zip | |
PPC: Add upvalue get/set instructions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_ppc.dasc | 88 |
1 files changed, 83 insertions, 5 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index d0c66c1f..6cdb1cd1 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
| @@ -1375,19 +1375,97 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 1375 | /* -- Upvalue and function ops ------------------------------------------ */ | 1375 | /* -- Upvalue and function ops ------------------------------------------ */ |
| 1376 | 1376 | ||
| 1377 | case BC_UGET: | 1377 | case BC_UGET: |
| 1378 | | NYI | 1378 | | // RA = dst*8, RD = uvnum*8 |
| 1379 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
| 1380 | | srwi RD, RD, 1 | ||
| 1381 | | addi RD, RD, offsetof(GCfuncL, uvptr) | ||
| 1382 | | lwzx UPVAL:RB, LFUNC:RB, RD | ||
| 1383 | | lwz TMP1, UPVAL:RB->v | ||
| 1384 | | evldd TMP0, 0(TMP1) | ||
| 1385 | | evstddx TMP0, BASE, RA | ||
| 1386 | | ins_next | ||
| 1379 | break; | 1387 | break; |
| 1380 | case BC_USETV: | 1388 | case BC_USETV: |
| 1381 | | NYI | 1389 | | // RA = uvnum*8, RD = src*8 |
| 1390 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
| 1391 | | srwi RA, RA, 1 | ||
| 1392 | | addi RA, RA, offsetof(GCfuncL, uvptr) | ||
| 1393 | | evlddx TMP1, BASE, RD | ||
| 1394 | | lwzx UPVAL:RB, LFUNC:RB, RA | ||
| 1395 | | lbz TMP3, UPVAL:RB->marked | ||
| 1396 | | lwz CARG2, UPVAL:RB->v | ||
| 1397 | | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) | ||
| 1398 | | lbz TMP2, UPVAL:RB->closed | ||
| 1399 | | evmergehi TMP0, TMP1, TMP1 | ||
| 1400 | | evstdd TMP1, 0(CARG2) | ||
| 1401 | | cmplwi cr1, TMP2, 0 | ||
| 1402 | | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq | ||
| 1403 | | subi TMP0, TMP0, LJ_TISNUM | ||
| 1404 | | bne >2 // Upvalue is closed and black? | ||
| 1405 | |1: | ||
| 1406 | | ins_next | ||
| 1407 | | | ||
| 1408 | |2: // Check if new value is collectable. | ||
| 1409 | | cmplwi TMP0, LJ_TISGCV - LJ_TISNUM | ||
| 1410 | | bge <1 // tvisgcv(v) | ||
| 1411 | | lbz TMP3, GCOBJ:TMP1->gch.marked | ||
| 1412 | | andi. TMP3, TMP3, LJ_GC_WHITES // iswhite(v) | ||
| 1413 | | la CARG1, GG_DISP2G(DISPATCH) | ||
| 1414 | | // Crossed a write barrier. Move the barrier forward. | ||
| 1415 | | bnel extern lj_gc_barrieruv // (global_State *g, TValue *tv) | ||
| 1416 | | b <1 | ||
| 1382 | break; | 1417 | break; |
| 1383 | case BC_USETS: | 1418 | case BC_USETS: |
| 1384 | | NYI | 1419 | | // RA = uvnum*8, RD = str_const*8 (~) |
| 1420 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
| 1421 | | srwi TMP1, RD, 1 | ||
| 1422 | | srwi RA, RA, 1 | ||
| 1423 | | subfic TMP1, TMP1, -4 | ||
| 1424 | | addi RA, RA, offsetof(GCfuncL, uvptr) | ||
| 1425 | | lwzx STR:TMP1, KBASE, TMP1 // KBASE-4-str_const*4 | ||
| 1426 | | lwzx UPVAL:RB, LFUNC:RB, RA | ||
| 1427 | | evmergelo STR:TMP1, TISSTR, STR:TMP1 | ||
| 1428 | | lbz TMP3, UPVAL:RB->marked | ||
| 1429 | | lwz CARG2, UPVAL:RB->v | ||
| 1430 | | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) | ||
| 1431 | | lbz TMP3, STR:TMP1->marked | ||
| 1432 | | lbz TMP2, UPVAL:RB->closed | ||
| 1433 | | evstdd STR:TMP1, 0(CARG2) | ||
| 1434 | | bne >2 | ||
| 1435 | |1: | ||
| 1436 | | ins_next | ||
| 1437 | | | ||
| 1438 | |2: // Check if string is white and ensure upvalue is closed. | ||
| 1439 | | andi. TMP3, TMP3, LJ_GC_WHITES // iswhite(str) | ||
| 1440 | | cmplwi cr1, TMP2, 0 | ||
| 1441 | | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq | ||
| 1442 | | la CARG1, GG_DISP2G(DISPATCH) | ||
| 1443 | | // Crossed a write barrier. Move the barrier forward. | ||
| 1444 | | bnel extern lj_gc_barrieruv // (global_State *g, TValue *tv) | ||
| 1445 | | b <1 | ||
| 1385 | break; | 1446 | break; |
| 1386 | case BC_USETN: | 1447 | case BC_USETN: |
| 1387 | | NYI | 1448 | | // RA = uvnum*8, RD = num_const*8 |
| 1449 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
| 1450 | | srwi RA, RA, 1 | ||
| 1451 | | addi RA, RA, offsetof(GCfuncL, uvptr) | ||
| 1452 | | evlddx TMP0, KBASE, RD | ||
| 1453 | | lwzx UPVAL:RB, LFUNC:RB, RA | ||
| 1454 | | lwz TMP1, UPVAL:RB->v | ||
| 1455 | | evstdd TMP0, 0(TMP1) | ||
| 1456 | | ins_next | ||
| 1388 | break; | 1457 | break; |
| 1389 | case BC_USETP: | 1458 | case BC_USETP: |
| 1390 | | NYI | 1459 | | // RA = uvnum*8, RD = primitive_type*8 (~) |
| 1460 | | lwz LFUNC:RB, FRAME_FUNC(BASE) | ||
| 1461 | | srwi RA, RA, 1 | ||
| 1462 | | addi RA, RA, offsetof(GCfuncL, uvptr) | ||
| 1463 | | srwi TMP0, RD, 3 | ||
| 1464 | | lwzx UPVAL:RB, LFUNC:RB, RA | ||
| 1465 | | not TMP0, TMP0 | ||
| 1466 | | lwz TMP1, UPVAL:RB->v | ||
| 1467 | | stw TMP0, 0(TMP1) | ||
| 1468 | | ins_next | ||
| 1391 | break; | 1469 | break; |
| 1392 | 1470 | ||
| 1393 | case BC_UCLO: | 1471 | case BC_UCLO: |
