aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildvm_ppc.dasc88
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: