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: |