diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 67 |
1 files changed, 49 insertions, 18 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index a6ea6293..5b396714 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -665,7 +665,25 @@ static void build_subroutines(BuildCtx *ctx) | |||
665 | |//-- Comparison metamethods --------------------------------------------- | 665 | |//-- Comparison metamethods --------------------------------------------- |
666 | | | 666 | | |
667 | |->vmeta_comp: | 667 | |->vmeta_comp: |
668 | | NYI | 668 | | mr CARG1, L |
669 | | subi PC, PC, 4 | ||
670 | | add CARG2, BASE, RA | ||
671 | | stw PC, SAVE_PC | ||
672 | | add CARG3, BASE, RD | ||
673 | | stw BASE, L->base | ||
674 | | decode_OP1 CARG4, INS | ||
675 | | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) | ||
676 | | // Returns 0/1 or TValue * (metamethod). | ||
677 | |3: | ||
678 | | cmplwi CRET1, 1 | ||
679 | | bgt ->vmeta_binop | ||
680 | |4: | ||
681 | | lwz INS, 0(PC) | ||
682 | | addi PC, PC, 4 | ||
683 | | decode_RD4 TMP2, INS | ||
684 | | addis TMP3, PC, -(BCBIAS_J*4 >> 16) | ||
685 | | add TMP2, TMP2, TMP3 | ||
686 | | isellt PC, PC, TMP2 | ||
669 | |->cont_nop: | 687 | |->cont_nop: |
670 | | ins_next | 688 | | ins_next |
671 | | | 689 | | |
@@ -676,14 +694,27 @@ static void build_subroutines(BuildCtx *ctx) | |||
676 | | evstddx TMP0, BASE, TMP1 | 694 | | evstddx TMP0, BASE, TMP1 |
677 | | b ->cont_nop | 695 | | b ->cont_nop |
678 | | | 696 | | |
679 | |->cont_condt: | 697 | |->cont_condt: // RA = resultptr |
680 | | NYI | 698 | | lwz TMP0, 0(RA) |
699 | | li TMP1, LJ_TTRUE | ||
700 | | cmplw TMP1, TMP0 // Branch if result is true. | ||
701 | | b <4 | ||
681 | | | 702 | | |
682 | |->cont_condf: | 703 | |->cont_condf: // RA = resultptr |
683 | | NYI | 704 | | lwz TMP0, 0(RA) |
705 | | li TMP1, LJ_TFALSE | ||
706 | | cmplw TMP0, TMP1 // Branch if result is false. | ||
707 | | b <4 | ||
684 | | | 708 | | |
685 | |->vmeta_equal: | 709 | |->vmeta_equal: |
686 | | NYI | 710 | | // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV. |
711 | | subi PC, PC, 4 | ||
712 | | stw BASE, L->base | ||
713 | | mr CARG1, L | ||
714 | | stw PC, SAVE_PC | ||
715 | | bl extern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne) | ||
716 | | // Returns 0/1 or TValue * (metamethod). | ||
717 | | b <3 | ||
687 | | | 718 | | |
688 | |//-- Arithmetic metamethods --------------------------------------------- | 719 | |//-- Arithmetic metamethods --------------------------------------------- |
689 | | | 720 | | |
@@ -1255,17 +1286,17 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1255 | case BC_ISEQV: case BC_ISNEV: | 1286 | case BC_ISEQV: case BC_ISNEV: |
1256 | vk = op == BC_ISEQV; | 1287 | vk = op == BC_ISEQV; |
1257 | | // RA = src1*8, RD = src2*8, JMP with RD = target | 1288 | | // RA = src1*8, RD = src2*8, JMP with RD = target |
1258 | | evlddx TMP0, BASE, RA | 1289 | | evlddx CARG2, BASE, RA |
1259 | | addi PC, PC, 4 | 1290 | | addi PC, PC, 4 |
1260 | | evlddx TMP1, BASE, RD | 1291 | | evlddx CARG3, BASE, RD |
1261 | | addis TMP3, PC, -(BCBIAS_J*4 >> 16) | 1292 | | addis TMP3, PC, -(BCBIAS_J*4 >> 16) |
1262 | | lwz INS, -4(PC) | 1293 | | lwz TMP2, -4(PC) |
1263 | | evmergehi RB, TMP0, TMP1 | 1294 | | evmergehi RB, CARG2, CARG3 |
1264 | | decode_RD4 TMP2, INS | 1295 | | decode_RD4 TMP2, TMP2 |
1265 | | checknum RB | 1296 | | checknum RB |
1266 | | add TMP2, TMP2, TMP3 | 1297 | | add TMP2, TMP2, TMP3 |
1267 | | checkanyfail >5 | 1298 | | checkanyfail >5 |
1268 | | efdcmpeq TMP0, TMP1 | 1299 | | efdcmpeq CARG2, CARG3 |
1269 | if (vk) { | 1300 | if (vk) { |
1270 | | iselgt PC, TMP2, PC | 1301 | | iselgt PC, TMP2, PC |
1271 | } else { | 1302 | } else { |
@@ -1275,7 +1306,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1275 | | ins_next | 1306 | | ins_next |
1276 | | | 1307 | | |
1277 | |5: // Either or both types are not numbers. | 1308 | |5: // Either or both types are not numbers. |
1278 | | evcmpeq TMP0, TMP1 | 1309 | | evcmpeq CARG2, CARG3 |
1279 | | not TMP3, RB | 1310 | | not TMP3, RB |
1280 | | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? | 1311 | | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? |
1281 | | crorc 4*cr7+lt, 4*cr0+so, 4*cr0+lt // 1: Same tv or different type. | 1312 | | crorc 4*cr7+lt, 4*cr0+so, 4*cr0+lt // 1: Same tv or different type. |
@@ -1298,12 +1329,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1298 | | | 1329 | | |
1299 | | // Different tables or userdatas. Need to check __eq metamethod. | 1330 | | // Different tables or userdatas. Need to check __eq metamethod. |
1300 | | // Field metatable must be at same offset for GCtab and GCudata! | 1331 | | // Field metatable must be at same offset for GCtab and GCudata! |
1301 | | lwz TAB:TMP3, TAB:TMP1->metatable | 1332 | | lwz TAB:TMP2, TAB:CARG2->metatable |
1302 | | li RB, 1-vk // ne = 0 or 1. | 1333 | | li CARG4, 1-vk // ne = 0 or 1. |
1303 | | cmplwi TAB:TMP3, 0 | 1334 | | cmplwi TAB:TMP2, 0 |
1304 | | beq <1 // No metatable? | 1335 | | beq <1 // No metatable? |
1305 | | lbz TMP0, TAB:TMP3->nomm | 1336 | | lbz TMP2, TAB:TMP2->nomm |
1306 | | andi. TMP0, TMP0, 1<<MM_eq | 1337 | | andi. TMP2, TMP2, 1<<MM_eq |
1307 | | bne <1 // Or 'no __eq' flag set? | 1338 | | bne <1 // Or 'no __eq' flag set? |
1308 | | mr PC, SAVE0 // Restore old PC. | 1339 | | mr PC, SAVE0 // Restore old PC. |
1309 | | b ->vmeta_equal // Handle __eq metamethod. | 1340 | | b ->vmeta_equal // Handle __eq metamethod. |