aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-17 16:07:01 +0200
committerMike Pall <mike>2010-09-17 16:07:01 +0200
commit9203d278d04a96f4fa3fd578b2c1c917e3afd3d0 (patch)
tree4ef234bca5436547d5b0f02f2c61db2f0b29571d
parent9dc98280d228d8c127cc9abf04f7836ea8fffe71 (diff)
downloadluajit-9203d278d04a96f4fa3fd578b2c1c917e3afd3d0.tar.gz
luajit-9203d278d04a96f4fa3fd578b2c1c917e3afd3d0.tar.bz2
luajit-9203d278d04a96f4fa3fd578b2c1c917e3afd3d0.zip
PPC: Add metamethod handlers and continuations for comparisons.
-rw-r--r--src/buildvm_ppc.dasc67
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.